传奇HERO引擎积分兑换使者完整NPC脚本 元素内挂积分存取与档位兑换全套实现方案

来源: 作者: 点击:
积分兑换使者脚本用于读取元素内挂存储的玩家积分,提供积分查询、道具兑换、积分存取、档位奖励功能,脚本运行于HERO引擎,依靠人物持久变量保存积分数据,变量可被元素内挂读取和修改,整套脚本放置在NPC对话文件,修改前备份Mir200目录下NPC脚本与QFunction文件,防止语法错误造成M2加载失败。

NPC主对话标签[@main]作为入口,展示功能选项,包含积分查询、道具兑换、多档位奖励、积分转入、积分转出。玩家点击选项进入对应分支,所有积分操作前先读取人物持久变量,变量存储玩家当前积分,小退、服务器重启数据不会丢失,元素内挂可直接读写该变量,实现挂机刷怪自动增加积分。

[@QueryPoint]积分查询分支,读取存储积分的持久变量,使用GETVAR读取数值存入临时变量,SENDMSG输出当前积分,同时在NPC对话框展示积分数量。玩家可以随时查看剩余积分,用于判断是否满足兑换门槛。
[@QueryPoint]
#ACT
GETVAR HUMAN Point <$STR(S0)>
MESSAGE \(STR(S0)>
MESSAGE 你的当前积分:<\)<$STR(S0)>
SENDMSG 6 当前积分:<$STR(S0)>

单道具兑换分支[@ExchangeItem],设定兑换消耗积分与目标物品。脚本先读取人物积分,判断积分是否大于等于消耗数值,积分不足直接提示,终止流程。积分满足条件,扣除对应积分,添加道具到玩家背包,同时发送提示。增加背包空位检测,背包无空位不扣除积分,防止扣积分无法领取道具。
[@ExchangeItem]
#ACT
GETVAR HUMAN Point <$\(STR(S0)>
#IF
<\)$STR(S0)> >= 500
CHECKBAGSPACE 1
#ACT
CALC <$STR(S0)> - 500 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>
ADDITEM 疗伤药包 1
SENDMSG 6 兑换成功,消耗500积分,获得疗伤药包。
#ELSEACT
SENDMSG 6 积分不足或者背包空间不足,兑换失败。
BREAK

多档位奖励分支[@LevelAward],设置多档积分奖励,使用多组IF判断,积分达标即可领取,增加领取标记变量,每一档领取完成设置标记,防止重复领取。档位可以设置为1000、3000、5000积分,不同档位发放不同装备、材料。领取奖励不消耗积分,仅作为累计积分达成奖励;如需领取后扣除积分,将SETVAR写在对应成功分支内。

积分转入功能[@AddPoint],玩家使用指定\(COLOR=250>4.材料兑换积分</\),检测背包内兑换材料,材料满足则扣除道具,增加对应积分,积分累加写入持久变量。元素内挂挂机打怪自动增加积分逻辑,写在QFunction-0.txt[@OnKillMon]怪物死亡触发标签,击杀怪物成功后执行积分累加,该变量和NPC共用同一组Point变量,保证内挂与NPC读取的积分数据一致。
[@OnKillMon]
#ACT
GETVAR HUMAN Point <$STR(S0)>
CALC <$STR(S0)> + 1 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>

积分转出功能[@TakeOutPoint],消耗\(COLOR=250>5.积分兑换金币</\),读取积分数值,设置转出比例,扣除积分,增加人物金币。增加转出最低限制,单次转出不能低于指定积分,避免小额频繁转出。同时增加每日转出上限,使用另一组持久变量记录当日转出积分,达到上限之后禁止继续转出,次日重置。

豁免判断,增加GM权限判断,ISADMIN,GM操作兑换不扣除积分,方便后台测试。普通玩家正常执行积分扣除逻辑。

重复领取控制,多档位奖励每个档位单独使用标记变量,例如PointAward1、PointAward2,领取1000档位后SETVAR HUMAN PointAward1 1,再次进入分支检测变量,等于1提示已领取。需要重置档位时,GM指令直接清零标记变量,开启新一轮活动。

调试步骤,单机环境使用GM指令SETVAR HUMAN Point 1000设置测试积分,依次测试查询、兑换、击杀怪物增加积分、积分转出。核对变量数值变化,确认元素内挂读取变量正常。测试完成删除调试SENDMSG,重载M2脚本生效,无需重启整套服务。

常见故障排查,元素内挂读取不到积分,确认变量类型为HUMAN持久变量,临时变量无法被内挂识别。兑换积分扣除但是没有得到物品,检查代码顺序,背包空位检测要放在扣除积分之前。击杀怪物积分不增加,检查[@OnKillMon]标签是否开启,M2怪物死亡事件没有关闭。积分数值错乱,检查CALC加减语法,HERO引擎CALC运算必须使用变量运算格式。多人同时刷怪积分错乱,单人积分必须使用HUMAN人物变量,不要使用全局变量存储单人积分。

扩展功能,增加积分排行榜,使用全局变量记录全服积分,制作积分排行NPC。增加积分过期机制,设置时间计时器,到期清零积分。增加兑换限制,每日兑换次数变量,控制玩家每日兑换道具次数。

脚本注意事项,元素内挂读写变量名称必须和脚本Point完全一致,大小写、字符不能有差异。积分运算只使用整数,不支持小数。兑换逻辑顺序:读取积分→条件判断→检测背包→扣积分→添加物品,顺序颠倒会造成扣积分无道具。

完整NPC脚本
[@main]
#ACT
MESSAGE 欢迎来到积分兑换使者
MESSAGE <$COLOR=250>1.\(COLOR=250>1.查询当前积分</\)</$COLOR>
MESSAGE <$COLOR=250>2.道具兑换【500积分兑换疗伤药包】</$COLOR>
MESSAGE <$COLOR=250>3.\(COLOR=250>3.累计积分档位奖励</\)</$COLOR>
MESSAGE <$COLOR=250>4.\(COLOR=250>4.材料兑换积分</\)</$COLOR>
MESSAGE <$COLOR=250>5.\(COLOR=250>5.积分兑换金币</\)</$COLOR>
MESSAGE <$COLOR=255>\(COLOR=255>请选择:</\)</$COLOR>
#SACT
#CHOOSE
1,@QueryPoint
2,@ExchangeItem
3,@LevelAward
4,@AddPointByItem
5,@PointToGold

[@QueryPoint]
#ACT
GETVAR HUMAN Point <$STR(S0)>
MESSAGE \(STR(S0)>
MESSAGE 你的当前积分:<\)<$STR(S0)>
SENDMSG 6 当前积分:<$STR(S0)>

[@ExchangeItem]
#ACT
GETVAR HUMAN Point <$\(STR(S0)>
#IF
<\)$STR(S0)> >= 500
CHECKBAGSPACE 1
#ACT
CALC <$STR(S0)> - 500 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>
ADDITEM 疗伤药包 1
SENDMSG 6 兑换成功,消耗500积分,获得疗伤药包。
#ELSEACT
SENDMSG 6 积分不足或者背包空间不足,兑换失败。
BREAK

[@LevelAward]
#ACT
GETVAR HUMAN Point <$\(STR(S0)>
#IF
<\)$STR(S0)> >= 1000
GETVAR HUMAN PointAward1 <$STR(S1)>
<$STR(S1)> = 0
#ACT
SETVAR HUMAN PointAward1 1
ADDITEM 赤月首饰礼盒 1
SENDMSG 6 恭喜领取1000积分档位奖励。
#ELSEACT
#IF
<$STR(S0)> >= 1000
SENDMSG 6 1000积分档位奖励已领取。
#ELSEACT
SENDMSG 6 积分不足,无法领取档位奖励。
BREAK

[@AddPointByItem]
#ACT
CHECKHAVEITEM 积分令牌 1
#IF
#ACT
TAKEHAVEITEM 积分令牌 1
GETVAR HUMAN Point <$STR(S0)>
CALC <$STR(S0)> + 100 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>
SENDMSG 6 消耗积分令牌,获得100积分。
#ELSEACT
SENDMSG 6 背包缺少积分令牌。
BREAK

[@PointToGold]
#ACT
GETVAR HUMAN Point <$\(STR(S0)>
#IF
<\)$STR(S0)> >= 200
#ACT
CALC <$STR(S0)> - 200 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>
CALC 200 * 100000 <$STR(S2)>
ADDGOLD <$STR(S2)>
SENDMSG 6 消耗200积分,兑换2000000金币。
#ELSEACT
SENDMSG 6 积分不足,最低转出200积分。
BREAK

QFunction-0.txt 内挂刷怪增加积分片段
[@OnKillMon]
#ACT
GETVAR HUMAN Point <$STR(S0)>
CALC <$STR(S0)> + 1 <$STR(S1)>
SETVAR HUMAN Point <$STR(S1)>

脚本部署完成保存,重载M2脚本,测试元素内挂读取Point变量,挂机击杀怪物自动累加积分。所有变量名称保持统一,修改积分产出数值可调整[@OnKillMon]内累加数值。