传奇NPC功能脚本常用指令大全 传送回收任务商店完整代码写法示例

来源: 作者: 点击:
传奇游戏中的NPC功能全部通过文本脚本实现,服务端读取指定格式的脚本文件来解析NPC对话和功能。NPC脚本文件一般存放在Mir200\Envir\MapQuest_def或NPC_def目录下,每个NPC对应一个文本文件。脚本由标签、条件判断、执行动作三部分组成,掌握这些基础结构后,绝大多数NPC功能都可以自己编写和修改。

NPC脚本的最基本结构是三段式:#IF、#ACT、#SAY。#IF下面写判断条件,比如检测玩家等级、背包物品、金币数量。#ACT下面写满足条件后执行的动作,比如传送、给物品、扣金币。#SAY下面写NPC对玩家说的话,也就是对话框里显示的文本。最简单的传送NPC代码就是在#ACT后面写MapMove指令,然后#SAY里写一句提示。

传送NPC是最基础也最常用的功能。实现传送的核心指令是MapMove,格式为MapMove 地图号 X坐标 Y坐标。例如要传送到盟重省330 330的位置,就写MapMove 0 330 330,其中0代表盟重省的地图编号。除了直接传送,还可以加上条件判断,比如收金币才能传送。代码写法是在#IF下写CHECKGOLD 1000,#ACT下先写TAKEGOLD 1000扣除金币,再写MapMove传送。如果金币不够,就用#ELSESAY输出金币不足的提示。

回收NPC的代码稍微复杂一些,需要检测玩家背包里有没有指定物品。回收装备的核心指令是CHECKITEM,格式为CHECKITEM 物品名 数量。比如回收裁决之杖,#IF下写CHECKITEM 裁决之杖 1,#ACT下先写TAKEITEM 裁决之杖 1把装备收走,再写GAMEGOLD + 1000给玩家加金币或元宝。批量回收多个装备时,要写多个判断段落,每种装备一段代码,分别检测、收取、奖励。回收NPC的#SAY部分通常列出所有可回收物品和对应的价格,玩家点哪个选项就跳转到对应的标签执行。

任务NPC的实现依赖标签跳转。一个NPC可以有多个段落,每个段落用[@标签名]开头。比如[@main]是NPC打开时默认显示的主界面,玩家点了“接受任务”就跳转到[@accept],点了“提交任务”就跳转到[@submit]。标签之间用<选项内容/@标签名>这种格式在#SAY里链接。任务逻辑里常用的指令有CHECKLEV检测等级、CHECKHUMCHECKITEM检测任务物品、Give给奖励。提交任务时先检测背包有没有任务物品,有就收走然后给经验和金币,没有就提示未完成。

商店NPC的代码有专门的脚本格式,不同于普通对话NPC。商店脚本的开头要定义商店类型,用[@STDITEMSHOP]表示标准物品商店,[@REPAIRSHOP]表示带修理功能的商店。商店里卖的物品直接在脚本里列出来,每行一个,格式是物品名 价格 持续时间。比如写“金创药(小) 100 0”就是卖金创药,单价100金币。除了普通药水店,还可以做装备商店、杂货铺、书店,区别只是里面放的物品不同。修理功能需要加一个选项链接到修理标签,执行RepairAll或RepairItem指令。

仓库NPC的功能服务端一般内置好了,只需要在NPC脚本里调用指定标签即可。打开仓库的指令不是自己写存取逻辑,而是用一个特殊的语句直接调出服务端的仓库界面。具体写法在不同引擎里略有差异,有的引擎用<打开仓库/@storage>,有的直接在#ACT里执行OpenStorage指令。仓库的容量、密码锁、扩展页这些功能由服务端控制,NPC脚本只负责触发打开。

转生NPC是特色版本里常见的功能。转生逻辑涉及等级检测、金币扣除、等级重置、属性增加几个步骤。#IF里先检测玩家当前等级是否达到转生要求,比如CHECKLEVEXP >= 80 0表示80级以上。再检测有没有足够的转生材料和金币。满足条件后,#ACT里执行DELETESKILL清除所有技能、CHANGELEVELLEVEXP重置等级到40级0经验、ADDHP增加最大血量、ADDAC增加防御、AddPoint分配属性点。转生次数要用变量记录,比如用HUMAN或REG变量存转生次数,每次转生加1,同时检测次数上限防止无限转生。

强化合成类NPC用到的指令更多。装备强化需要检测装备是否在身上、有没有足够的材料、成功率判定。常用的指令有CHECKUSEITEM检测身上某个位置有没有装备、UPGRADEITEMEX执行强化操作、RANDOM随机数判定成功失败。比如强化武器,#IF检测玩家有没有材料,然后用RANDOM 2生成1或2的随机数,1代表成功,2代表失败。成功就执行UPGRADEITEMEX提升武器的攻击属性,失败就提示并扣除材料。RANDOM的数值决定了成功率,RANDOM 3就是三分之一概率。

加属性点的NPC用到AddPoint和分配属性的指令。玩家每升一级给几个属性点,可以自己加力量、敏捷、体力、魔法。属性点总数用变量存,NPC界面显示当前剩余点数和各个属性的数值,每个属性旁边放一个加号按钮,点击一次扣除1点剩余点数,对应属性加1。具体实现用CheckHumPoint检测剩余点数够不够,够的话执行AddPoint 具体属性 1,然后剩余点数变量减1。属性点重置功能也很常见,花金币把已经加的点全部返还,让玩家重新分配。

地图进入限制NPC用来做收费地图、等级地图、会员地图。玩家点击NPC后,脚本先检测等级、会员等级、是否持有门票道具,全部满足才传送进去,否则给出对应的失败提示。这类NPC的#SAY里通常写明进入条件,比如“需要等级50级,持有秘境门票一张,消耗2000元宝进入”。代码里就对应三行检测:CHECKLEV 50、CHECKITEM 秘境门票 1、CHECKGAMEGOLD 2000。全部通过就扣门票、扣元宝、传送到对应地图。

每日签到NPC需要用到日期变量和标志变量。检测今天是否已经签到过,方法是取当前日期存到变量里,和上次签到日期对比,如果相同就是已经签过了。签到奖励可以按连续签到天数给,连续签到7天给额外奖励。具体实现用GetDate取当天日期,存到HUMAN变量LastSignDate里,每次打开NPC时对比当前日期和变量值。签到次数用另一个变量SignCount记录,每次签到加1,隔一天没签就重置为1。

排行榜NPC显示各类排名数据。攻击排行榜、等级排行榜、财富排行榜这些数据由服务端的排行系统生成,NPC脚本只负责展示。在#SAY里用<
𝑅
𝐴
𝑁
𝐾
1
>

<
RANK1>、<RANKNAME1>这种变量来读取第一名的排名和名字。不同引擎的排行变量格式不同,有的引擎用<排行类型 名次 字段>的格式,比如<LEVEL 1 NAME>就是等级榜第一名的名字。把前十名依次列出来就组成了排行榜界面。

脚本里常用的变量分为几大类。<
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
是玩家名字,
<
USERNAME>是玩家名字,<LEVEL>是等级,<
𝐺
𝑂
𝐿
𝐷
>
是金币数,
<
GOLD>是金币数,<HP>是当前血量,<$MAXHP>是最大血量。这些是系统自带的只读变量,直接显示数值用。还有HUMAN变量,用来存玩家的自定义数据,比如转生次数、签到记录,用HUMAN变量名来读写。REG变量是全局变量,所有玩家共享,一般存全服活动数据。变量在#ACT里赋值用MOV指令,格式为MOV HUMAN 转生次数 1。

条件判断除了简单的等于检测,还支持大于小于、并且、或者。大于等于用>=,小于等于用<=。多个条件都满足用并列写法,#IF下面写两行检测,中间不加任何关键字,默认就是并且关系。或者关系需要用OR语句,不同引擎写法有差异,有的用#ORIF分段。还有取反条件,前面加NOT就是不满足时执行,比如NOT CHECKITEM 屠龙 1表示背包里没有屠龙。

NPC脚本调试时最常见的报错有几种。一种是标签名写错,跳转时找不到对应段落,表现为点了选项没反应。检查[@标签名]和<选项/@标签名>里的名字是否完全一致,区分大小写,不要有多空格。第二种是指令拼写错误,比如把MapMove写成MapMov,少一个字母就不执行。第三种是条件和动作放错了段落,把#ACT的内容写在了#IF里,或者反过来。写复杂脚本时建议一段一段测试,先确认跳转正常,再加功能代码,避免最后出问题找不到哪里错了。

不同引擎的NPC脚本语法大体相近,但具体指令名字和参数顺序可能不一样。GOM、GEE、HERO、BLUE这些主流引擎的基础指令基本通用,像MapMove、CHECKLEV、GIVE这些90%都一样。差异主要在高级指令上,比如装备强化、变量操作、界面扩展。写脚本前最好先看下当前引擎的说明书,确认要用到的指令是否存在、参数怎么传。拿不准的可以先写个最简单的测试NPC,验证指令是否生效,再写完整功能。