物品兑换脚本在Hero引擎里是最基础也最常用的功能模块。不管是装备换元宝、材料换装备,还是积分兑换道具,核心逻辑都是三步:检查玩家是否有足够物品或货币、扣除对应物品、发放兑换物品。下面按兑换类型分别给出可直接使用的脚本范例,并说明每个命令的参数含义和注意事项。
## 基础物品兑换脚本结构
最常见的兑换是拿指定物品换另一件物品。脚本主体放在NPC文件中,路径为Envir\Market_Def\,文件名按NPC命名规则写,比如兑换使者-3.txt。基本结构如下:
```plaintext
[@main]
欢迎来到物品兑换使者\
这里可以用材料兑换装备\
<查看兑换列表/@兑换列表>\
[@兑换列表]
<祖玛头像换屠龙/@换屠龙>\
<祝福油换开天/@换开天>\
<返回/@main>\
[@换屠龙]
#IF
CHECKITEM 祖玛头像 10
#ACT
TAKE 祖玛头像 10
GIVE 屠龙 1
SENDMSG 6 兑换成功,你获得了屠龙!
#ELSESAY
你没有10个祖玛头像,无法兑换。\
```
CHECKITEM命令检测玩家背包中指定物品的数量,格式为物品名加数量。TAKE命令扣除对应数量的物品。GIVE命令发放兑换物品。SENDMSG 6是个人屏幕消息,只有执行兑换的玩家能看到。如果检测不通过,走ELSESAY分支显示提示文字。
这里有一个容易出错的地方:CHECKITEM检测的是背包中的数量,如果玩家把材料放在仓库或身上装备栏,检测不会通过。如果希望材料放在仓库也能兑换,需要换用CHECKITEMW命令,但扣除时也要用TAKEW命令。大多数兑换NPC使用背包检测即可。
## 元宝与金币兑换脚本
货币兑换分为两种情况,一种是用货币换物品,另一种是用物品换货币。用元宝换物品的脚本如下:
```plaintext
[@元宝换装备]
#IF
CHECKGAMEGOLD > 999
#ACT
GAMEGOLD - 1000
GIVE 圣战宝甲 1
SENDMSG 6 你花费1000元宝兑换了圣战宝甲。
#ELSESAY
你的元宝不足1000,无法兑换。\
```
CHECKGAMEGOLD命令检测玩家当前元宝数量,参数为所需数量的下限。注意这里写的是大于999而不是大于等于1000,因为不同引擎对边界值的处理有差异,写999更稳妥。GAMEGOLD - 1000表示扣除1000元宝,GAMEGOLD + 1000表示增加元宝。
金币的检测命令是CHECKGOLD,扣除用TAKE或者直接写金币扣除命令,具体看引擎版本。Hero引擎中金币通常用CHECKGOLD检测,扣除时写GAMEGOLD不能扣金币,要用专门的命令。部分版本支持MONEY命令,检测和扣除都用它。如果脚本中金币命令不生效,先确认引擎是否支持GAMEGOLD和CHECKGOLD这两个命令,可以用GM命令测试。
用物品换元宝的脚本:
```plaintext
[@祖玛换元宝]
#IF
CHECKITEM 祖玛头像 1
#ACT
TAKE 祖玛头像 1
GAMEGOLD + 500
SENDMSG 6 你出售了一个祖玛头像,获得500元宝。
#ELSESAY
你没有祖玛头像。\
```
这类脚本适合做材料回收。兑换比例写在GAMEGOLD后面的数字里,改比例只需要改这一个数字。如果希望一次兑换多个材料,把CHECKITEM的数量和TAKE的数量同步修改即可。
## 多物品同时检测与兑换
有些兑换需要玩家同时拥有多种材料,比如换一件高级装备需要三种材料各若干。脚本中连续写多个CHECKITEM即可:
```plaintext
[@换终极装备]
#IF
CHECKITEM 祖玛头像 10
CHECKITEM 祝福油 5
CHECKITEM 金条 2
#ACT
TAKE 祖玛头像 10
TAKE 祝福油 5
TAKE 金条 2
GIVE 终极战刃 1
SENDMSG 0 恭喜玩家[%s]通过材料兑换获得了终极战刃!
#ELSESAY
兑换需要祖玛头像10个、祝福油5个、金条2个,你尚未集齐。\
```
多个CHECKITEM之间是并列关系,必须全部满足才会执行ACT段。任何一个不满足都会跳到ELSESAY。扣除时也要逐个写TAKE命令,顺序与检测顺序对应。SENDMSG 0是全服公告,%s会被替换为当前玩家的角色名。
这种写法有一个隐患:如果玩家在兑换过程中掉线,可能出现材料扣了但装备没发的情况。脚本执行是瞬时的,正常情况下不会中断,但如果服务器卡顿或玩家网络波动,极小概率出现。为了避免这个问题,可以在扣除之前先发放装备,但那样又有可能玩家拿到装备后材料扣除失败。更稳妥的做法是不做特殊处理,因为脚本执行速度极快,实际运行中几乎不会遇到。
## 使用变量记录兑换次数的限制脚本
如果兑换活动限制每个玩家只能兑换几次,需要用个人变量记录次数。个人变量[0]到[99]跟随角色保存,适合做这类限制:
```plaintext
[@限次兑换]
#IF
CHECKVAR HUMAN 兑换次数 < 3
CHECKITEM 祖玛头像 1
#ACT
TAKE 祖玛头像 1
GIVE 随机宝箱 1
CALCVAR HUMAN 兑换次数 + 1
SAVEVAR HUMAN 兑换次数 ..\QuestDiary\兑换记录\兑换次数.txt
SENDMSG 6 兑换成功,你已兑换<$HUMAN(兑换次数)>次,剩余可兑换次数为3次。
#ELSESAY
你的兑换次数已用完,或者没有祖玛头像。\
```
CHECKVAR HUMAN命令读取个人变量,格式为变量名加比较运算符加数值。CALCVAR HUMAN命令修改个人变量值,+1表示增加1。SAVEVAR HUMAN命令将变量保存到指定文件,避免玩家下线后变量重置。文件路径中的目录需要提前创建好,否则保存会失败。
显示剩余次数时,用<$HUMAN(变量名)>可以在对话中直接输出变量当前值。注意这个变量名要和CHECKVAR、CALCVAR、SAVEVAR中使用的名称完全一致,大小写敏感。
## 兑换列表的文本文件写法
当兑换项目很多时,把所有兑换项写死在脚本里会让文件变得很长,修改也不方便。Hero引擎支持从文本文件读取兑换列表,脚本中通过循环读取实现。不过更通用的做法是用GOTO跳转配合多个标签,每个标签对应一个兑换项。如果兑换项超过20个,建议用文本文件加变量循环的方式。
文本文件每行写一个兑换项,格式为:物品名 所需材料名 材料数量 兑换数量。脚本中用GetRandomName或逐行读取命令处理。这种写法需要引擎支持文件读取命令,Hero引擎的部分版本支持GETSTRINGFROMFILE,具体能否使用要先测试。
如果没有文件读取命令,退而求其次,用多个NPC标签分页显示。第一页显示前10个兑换项,第二页显示后10个,每页用GOTO跳转。分页标签的命名要有规律,比如@兑换页1、@兑换页2,方便维护。
## 兑换脚本中的条件判断扩展
除了物品和货币检测,兑换脚本还可以加入等级、职业、转生等条件:
```plaintext
[@高级兑换]
#IF
CHECKLEVELEX > 49
CHECKJOB Warrior
CHECKITEM 祖玛头像 10
#ACT
TAKE 祖玛头像 10
GIVE 战士专属武器 1
SENDMSG 6 兑换成功。
#ELSESAY
兑换需要50级以上战士,且拥有10个祖玛头像。\
```
CHECKLEVELEX检测等级,参数为下限值。CHECKJOB检测职业,Warrior为战士,Wizard为法师,Taoist为道士。这三个条件与物品检测并列,全部满足才执行兑换。如果只想限制等级不限制职业,去掉CHECKJOB那一行即可。
转生检测用CHECKRENEWLEVEL,参数为转生次数下限。行会检测用CHECKGUILDNAME,参数为行会名称。这些条件命令在不同Hero版本中可能有细微差异,使用前先用GM命令测试。
## 批量兑换与一键兑换写法
如果玩家需要把大量同种材料一次性兑换成货币,逐个点击效率太低。可以写一个批量兑换脚本,读取玩家背包中该材料的全部数量,一次性扣除并发放对应货币:
```plaintext
[@批量兑换]
#IF
CHECKITEM 祖玛头像 1
#ACT
MOV P1 0
MOV P2 0
TAKE 祖玛头像 999
GIVE 元宝 500
```
这种写法的思路是先扣除全部材料,然后按比例发放。但TAKE命令一次最多扣除999个,如果玩家背包中材料超过999个,需要分多次执行。实际使用中更简单的做法是让玩家手动输入数量,但Hero引擎的NPC对话不支持输入框,所以批量兑换通常用固定档位实现,比如一次兑换10个、50个、100个,每个档位写一个标签。
固定档位兑换的脚本示例:
```plaintext
[@批量兑换]
<兑换10个/@换10> <兑换50个/@换50> <兑换100个/@换100>\
[@换10]
#IF
CHECKITEM 祖玛头像 10
#ACT
TAKE 祖玛头像 10
GAMEGOLD + 5000
SENDMSG 6 批量兑换成功,获得5000元宝。
#ELSESAY
你没有10个祖玛头像。\
```
每个档位的脚本结构完全一样,只是CHECKITEM、TAKE和GAMEGOLD后面的数字不同。复制粘贴后改数字即可,维护简单。
## 兑换脚本的常见问题
兑换后物品没有发放,最常见的原因是物品名称与DB数据库不一致。GIVE命令中的物品名必须与StdItems.DB中的Name字段完全匹配,包括括号、空格和标点。如果物品名中有括号,脚本中也要写相同的括号,中英文括号不能混用。
CHECKITEM检测不通过但玩家确实有材料,通常是材料在仓库而不是背包。让玩家把材料取到背包再兑换。另一个原因是材料名称写错,检查脚本中的物品名和DB中是否一致。
TAKE命令扣除数量不对,检查TAKE后面的数字是否与CHECKITEM检测的数量一致。如果CHECKITEM检测10个但TAKE写了1个,会出现只扣1个但发放全部奖励的问题,这是脚本逻辑错误,不是命令问题。
变量保存失败导致兑换次数重置,检查SAVEVAR的路径目录是否存在。Hero引擎不会自动创建不存在的目录,需要手动建好文件夹。另外确认文件的写入权限,如果服务端安装在C盘Program Files目录下,可能因为权限不足导致写入失败,建议安装在非系统盘。
兑换脚本与其他脚本冲突的情况很少见,但如果同一个NPC同时承担兑换和传送功能,注意标签名称不要重复。不同NPC之间的标签可以重名,互不影响,但同一个NPC文件内的标签必须唯一。
传奇Hero引擎通用物品兑换脚本参考范例与命令详解
来源:
作者:
点击:

