天堂2单机论坛

 找回密码
 立即注册
查看: 10409|回复: 17

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

[复制链接]
  • TA的每日心情
    郁闷
    2022-5-30 11:17
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    277

    主题

    387

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    73795
    发表于 2020-10-6 17:10:39 | 显示全部楼层 |阅读模式
    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做测试如果达到你想要的成果
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-16 17:17
  • 签到天数: 59 天

    [LV.5]常住居民I

    1

    主题

    108

    帖子

    464

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    464
    发表于 2020-11-8 17:24:39 | 显示全部楼层
    非常感谢楼主
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    39

    帖子

    72

    积分

    正式会员

    Rank: 2

    积分
    72
    发表于 2020-11-29 19:56:18 | 显示全部楼层
    赚金币抖抖小手
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-3-15 12:28
  • 签到天数: 222 天

    [LV.7]常住居民III

    11

    主题

    311

    帖子

    1485

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1485
    发表于 2020-12-17 21:26:03 | 显示全部楼层

    非常感谢楼主
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-12-30 02:07
  • 签到天数: 86 天

    [LV.6]常住居民II

    0

    主题

    220

    帖子

    442

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    442
    发表于 2020-12-18 23:59:08 | 显示全部楼层
    谢谢分享,有极大的参考价值!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    42

    帖子

    55

    积分

    正式会员

    Rank: 2

    积分
    55
    发表于 2021-2-25 20:04:09 | 显示全部楼层
    非常感谢楼主
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-7 07:27
  • 签到天数: 52 天

    [LV.5]常住居民I

    4

    主题

    145

    帖子

    336

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    336
    发表于 2021-3-24 01:37:31 | 显示全部楼层

    非常感谢楼主,太需要了!
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-24 18:58
  • 签到天数: 89 天

    [LV.6]常住居民II

    4

    主题

    115

    帖子

    208

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    208
    发表于 2021-3-24 02:59:52 | 显示全部楼层

    非常感谢楼主,学习了
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-7 07:27
  • 签到天数: 52 天

    [LV.5]常住居民I

    4

    主题

    145

    帖子

    336

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    336
    发表于 2021-3-24 11:14:29 | 显示全部楼层
    非常感谢楼主
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-7 07:27
  • 签到天数: 52 天

    [LV.5]常住居民I

    4

    主题

    145

    帖子

    336

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    336
    发表于 2021-3-25 08:42:20 | 显示全部楼层

    非常感谢楼主
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|监狱|天堂2单机论坛 ( 粤ICP备20030366号 )

    GMT+8, 2025-5-1 04:40 , Processed in 0.056461 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表