2015年4月—2024年4月,论坛已建立9周年,欢迎加入QQ群讨论:419848937

NPC 基本概念 自己添加商店及传送

主要是游戏中一些经典任务、游戏资料的科普.
回复
头像
hagcse
Mr.GL
Mr.GL
帖子: 151
注册时间: 2018-02-25 15:50

NPC 基本概念 自己添加商店及传送

帖子 hagcse » 2018-03-10 15:28

1 [教学] NPC 基本概念 种类与对话
前言:
可能有很多新手对於 L2J 的任务的触发流程不是很清楚,所以大概介绍一下,介绍如果有错,还请老手不吝指教,谢谢。
概述:
基本上来说,L2J 的NPC不像是部份私服,一个 Script (或称脚本)控制 NPC 的出现位置、种类、对话与任务内容。
L2J 的 NPC 大多是使用NC Lineage2 原始设定好的固定 NPC 种类、名称。如果需要製作出新的 NPC (意指不同编号、不同名称),可能需要同时修编伺服器端设定资料外,另外需要修改用户端程式档案。
注意:修改用户端程式档案,除了修改麻烦之外,并且有明显违约使用之虞 (违反使用契约中的 对软体破解、擅改),因此是不建议。
知道环境因素之后,我先解释一下一般游戏概念中的 NPC 与 mob 有何不同,一般这两种很容易混淆,这边先废话一下:
NPC:就是指一般的商人、警卫之类的「非玩家操控角色」。
mob:是指一般野外会主动攻击,并且玩家可攻击的怪兽。
在 L2J 裡面简单来说就是:
滑鼠到 NPC 身上,游标会变成对话型态,如果要攻击他必须使用强制攻击 (按下Ctrl)。
滑鼠移动到 mob 身上,滑鼠指标会变成攻击型态 (一把剑的图示),可直接攻击。
如何决定他是 NPC 或是 mob?
其实这边解释会与上一段有点矛盾,因為在 L2J 中,所有非玩家角色通通都是NPC (或说通通是 mob)。
属性的变更、决定,是依据资料库 npc 资料表的栏位 type 当中的设定,type 栏位目前有以下几种:
L2Artefact
L2CabaleBuffer
L2CastleChamberlain
L2CastleTeleporter
L2ClassMaster
L2ControlTower
L2Deco
L2Doormen
L2FestivalGuide
L2FestivalMonster
L2Fisherman
L2Guard
L2Merchant
L2MercManager
L2Minion
L2Monster
L2Npc
L2Observation
L2Pet
L2RaidBoss
L2SiegeGuard
L2SiegeNpc
L2SignsPriest
L2SymbolMaker
L2Teleporter
L2Trainer
L2VillageMaster
L2Warehouse
对话:
当NPC 它的 type 不是L2Monster时,滑鼠点选会跳出对话,不过对话种类可分為:
种类一:空白,但是并不会真的是空白,会是一个内容為「没有任务可接受」之类的对话。
种类二:设定好的预设对话。
如何找到预设对话?
这时候就请两边看一下 NPC type (种类列表) 与 datapack 中的 ./data/html 目录,会发现到 datapack/data/html 目录下有很多与 npc type 名称相同的目录 (type 去掉 L2)。
在那裡面找到那位 NPC编号.htm 的档案,就是那位 NPC的预设对话内容。
主程式的开啟对话流程:
type 為 L2Doorman 的 npc,点选他的话...
1. 预设
  开啟 datapack/data/html/doorman/NPC编号.htm 的档案
2. 如果 找不到 NPC编号.htm
  改开啟 datapack/data/html/default/NPC编号.htm
3. 如果 还找不到
  显示对话框,内容為 「找不到 data/html/default/NPC编号.htm」或是「没有任务可接受」
对话部分先到这,其他后续的下次再补上。

2 [教学] NPC 基本概念 - 对话内容与选项
在了解 NPC 种类与对话开啟的 html 规则之后
之后就是对话的 htm 内容与选项。
简单的区分,npc 对话有包含「文字」与「选项」部分,文字的部分為依照基本的 htm 概念,这部分可能可以参考网路上相关文章。
文字部分比较不难理解,小弟举几种常见的选项功能来為大家说明,希望能够有所帮助。
先说明待会每次都出现的 %objectId% 这个字串,它是一个变数,在它送回伺服器时,会是物件的编号,物件编号格式為 268469859,这个物件编号在由系统控制,可以不用管他,某些功能会自动将物件编号与NPC编号对应。
选项有分以下几类:
1. 导向另一个 htm 档
代码:
<a action="bypass -h npc_%objectId%_Chat 1">更多讯息</a>
<a action="bypass -h npc_%objectId%_Chat 3">其他讯息</a>
"npc_物件编号_Chat x "字串,x 代表数字假定為12,这样代表点下这个连结选项之后,会导向、开啟 NPC编号-12.htm ,通常用在解释流程、功能、任务。
2. 商人交易
代码:
<a action="bypass -h npc_%objectId%_Buy 67">购买</a>
"npc_物件编号_Buy xx"字串,xx 代表数字假定為 5、物件编号 编号為 1267984<-随程式规则给予的值,这样代表点下这个连结选项,送出的值為 "npc_1267984_Buy 5",代表透过商人NPC 7088,开啟 5 号商店。
不过,在资料表 merchant_shopids 中必须加入一笔资料对应,那笔资料的 shop_id = 5 、npc_id = 7088,有这样的资料才会能够开啟商店视窗。
而商店贩卖物的部分则必须於资料表 merchant_buylists 中设定,资料表有以下几个栏位:
item_id - 贩卖物品的编号,例如「硬皮衬衫」编号為 710,就在这边输入710
price - 价格,这边输入多少就是卖多少。
shop_id - 商店编号,刚刚的例子中,5 号商店就必须在这裡填5。
order - 物品於商店视窗中的显示顺序,由1开始。

代码:
<a action="bypass -h npc_%objectId%_Sell">出售</a>
"npc_物件编号_Sell "字串,这样代表点下这个连结选项,会开啟贩卖物品视窗,这个选项不用带任何的额外编号。
3. 啟动任务
代码:
<a action="bypass -h npc_%objectId%_Quest">任务</a>
<a action="bypass -h npc_%objectId%_Quest 5001_armor">购买装备</a>
<a action="bypass -h npc_%objectId%_Quest 1234.htm">我要继续任务</a>
<a action="bypass -h npc_%objectId%_Quest 1">我要继续任务</a>

各位会发现 _Quest 之后所带的值并不相同,例如 5001_armor、1234.htm、1,有名称、档名、数字?
先解释没有其他值的部分,没有其他值通常代表该 NPC 只有一个任务,只要与他说话就会触发预设任务(或是显示没有任务可接受),通常这类的任务都是放至於 data/jscript/quest 之下。
如果於 _Quest 后面有附加值的,我们可以把他看作是送给伺服器的一种判别值,判别值的用法是用来
1. 判定执行何种任务
2. 判定本次对话為任务的哪个阶段
第一种:通常多用於「商店NPC」、「拥有多任务的NPC」,之前 multisell 功能还没有齐全之前,商店功能只能让玩家用「金币」向商人购买物品,如果像是双刀合成、材料合成、古代金币买卖、解除封印(也是交换物品)之类的物品交换功能就不支援了。所以之前的做法就是利用任务来解决像是「精品店」、「双刀合成」的功能。但是一个NPC可能会卖很多东西,例如铁匠可能会 解除封印、重新封印、製作双刀... 等,所以需要一个值来判定,点这的选项须要触发什麼样的功能 (任务),因此必须於 _Quest 之后加上判别值 (任务名称)。
第二种:也很常见,不过大多这种种类的 htm 档案是放在 data/jscript/quest/编号_任务 的裡面,用於任务内的流程串接。由於任务的撰写中,会有需要较有互动性的对话,例如
代码:
NPC说:
你做的很好,不愿意再帮我一个忙?
<a action="bypass -h npc_xxx_Quest Y">愿意(Y)</a>
<a action="bypass -h npc_xxx_Quest N">不愿意(N)</a>

撰写任务时,任务流程到了这个步骤,流程就会有分岔点,会变成:
代码:
如果 玩家愿意
 判别值 = Y 则 跳出另一个画面
 继续下个阶段
  呼叫 任务阶段1-1
  结束任务
如果 玩家不愿意
 判别值 = N 则  给一般奖赏
 结束任务.

所以就式任务的另外用法。

4. 守门人传送
代码:
<a action="bypass -h npc_%objectId%_goto 47" msg="811;奇岩城镇">奇岩城镇 - 11000 金币</a>

npc_NPC编号_goto 47 代表会传送玩家到资料表 teleport 裡面的 id =47设定的座标位置,等等会解释资料部分。
msg="811;奇岩城镇" 代表点取这个选项会跳出提示对话方块,对话方块内容种类為811,811对话方块的格式為「您确定要传送到(XXXX)吗?」,而 ; 之后的奇岩城镇将会被放入811对话方块xxxx 的位置。
语法解释完了,在来看资料库设定的部分,在资料表 teleport 中找到 id 栏位编号為 47 的资料,可以看到:
Description(註解), id(编号), loc_x(目的地X座标), loc_y(目的地Y座标), loc_z(目的地Z座标), price (传送价格)
Oren Town -> Giran Town, 47, 83400, 147943, -3404, 11000
所以综合起来就是,点了这个NPC的「奇岩城镇」这个项目,会把玩家传送到83400,147943,-3404这个位置,并且收取 11000 的金币。

1.如何撰写multisell下的xml档案
我们以001.xml来看
<?xml version='1.0' encoding='utf-8'?>
<!-- 说明这个档案的内容 --> <<一般来说他是程式的註解
<list>
<!-- 物品交换明细 什麼东西换什麼东西--> ] <<建议这边要写清楚
<item id="1"> <<第一项物品编码
<ingredient id="57" count="2100" enchant="0"/> <<需要物品编号57数量2100
<ingredient id="21" count="1" enchant="0"/> <<需要物品编号21数量1
<production id="22" count="1" enchant="0"/> <<换取物品编号22数量1
</item>
以此累推
<!-- [wooden_breastplate] for [leather_shirt]+[adena];5400 -->
<item id="2"> <<记得编号要按照顺序改下来不能有重复的
<ingredient id="57" count="5400" enchant="0"/>
<ingredient id="22" count="1" enchant="0"/>
<production id="23" count="1" enchant="0"/>
</item>
....
</list>
2.档案名称要求有2种方法
一.依照NPC编号 如果这个NPC只有卖这些不会跟其他NPC重复的话
二.依照原本编号 由於E版DP有001 002 009了 所以我们以003 004 005 下去做编排
3.给予相关NPC对应贩售连结
例如:
<a action="bypass -h npc_%objectId%_multisell 001">购买东西</a>
只要给予001做对应即可 不要用到副档名 不然会连结失败
完成后找NPC做测试如果达到你想要的成果
图片

回复