传奇里“挑战功能”通常指玩家通过NPC进入挑战地图,击杀指定BOSS或怪物后领取奖励。实现时需要把NPC对话、次数记录、地图进入、怪物刷新、死亡触发、奖励结算串起来。下面以常见传奇引擎脚本结构为例,按可直接套用的思路写示例,命令以 GOM/GEE 类引擎写法为主,其他引擎需对照自身说明替换。
第一种:NPC对话进入挑战地图
最基础的做法是玩家与NPC对话,满足等级、金币、道具或次数条件后,传送到挑战地图。
示例:
[@main]
IF
CHECKLEVEL 50
CHECKGOLD 10000
SMALL U0 3
ACT
MAPMOVE 挑战地图 150 150
TimeRecall 10
INC U0 1
SENDMSG 6 你已进入挑战地图,剩余停留时间10分钟
ELSESAY
等级不足、金币不足或今日挑战次数已用完
这里 U0 用作玩家个人可保存变量,记录已挑战次数。不同引擎可保存变量写法不同,GOM/GEE 常用 U0-U99 或 T0-T99 保存玩家数据。
如果要让玩家选择挑战难度,可以加分支:
[@选择难度]
IF
CHECKLEVEL 50
SMALL U0 3
ACT
GOTO @难度列表
ELSESAY
条件不足
[@难度列表]
SAY
<普通挑战/@普通挑战>\
<困难挑战/@困难挑战>\
<关闭/@exit>
[@普通挑战]
IF
CHECKITEM 挑战令 1
ACT
TAKE 挑战令 1
MAPMOVE 挑战普通 150 150
TimeRecall 10
INC U0 1
SENDMSG 6 已进入普通挑战
ELSEACT
SENDMSG 6 背包内没有挑战令
[@困难挑战]
IF
CHECKITEM 挑战令 2
ACT
TAKE 挑战令 2
MAPMOVE 挑战困难 150 150
TimeRecall 10
INC U0 1
SENDMSG 6 已进入困难挑战
ELSEACT
SENDMSG 6 背包内挑战令不足
第二种:每日次数与冷却时间
挑战功能一般要限制次数。次数可以用可保存变量记录,冷却时间可以用时间变量或每日重置方式处理。
示例:
[@挑战进入]
IF
CHECKLEVEL 50
CHECKGOLD 10000
SMALL U0 3
ACT
MAPMOVE 挑战地图 150 150
TimeRecall 10
INC U0 1
SENDMSG 6 挑战次数剩余
ELSESAY
今日挑战次数已用完
如果希望每日重置次数,可以在登录触发或每日零点机器人脚本中把次数变量清零。登录触发通常写在 QManage.txt 或对应登录脚本中。
示例:
[@Login]
IF
ACT
MOV U0 0
SENDMSG 6 今日挑战次数已重置
冷却时间写法因引擎不同差异较大。有的引擎支持时间变量,有的需要借助机器人脚本判断当前时间。正式使用时优先查当前引擎是否支持每日重置或时间判断命令。
第三种:挑战地图怪物刷新
进入挑战地图后,需要保证BOSS或怪物正常刷新。可以在地图配置里写固定刷怪,也可以用脚本动态刷怪。
示例:
[@进入挑战地图]
IF
ACT
MONCLEAR 挑战地图
MONGEN 挑战BOSS 1 5
SENDMSG 6 挑战BOSS已刷新
MONCLEAR 用于清空地图原有怪物,避免残留。 MONGEN 后面参数通常是怪物名、数量、刷新间隔,具体以当前引擎说明为准。
如果希望每次进入只刷新一次BOSS,可以先检测地图怪物数量:
[@进入挑战地图]
IF
CHECKMONMAP 挑战地图 0
ACT
MONGEN 挑战BOSS 1 5
SENDMSG 6 挑战BOSS已刷新
ELSEACT
SENDMSG 6 挑战BOSS尚未被击败
第四种:击杀BOSS触发奖励
BOSS被击杀后,通常通过全局触发脚本发放奖励。怪物死亡触发常写在 QFunction-0.txt 中,使用 [@OnKillMob] 或类似标签。
示例:
[@OnKillMob]
IF
ISONMAP 挑战地图
ACT
SENDMSG 6 你已击败挑战BOSS
GIVE 挑战宝箱 1
BreakTimeRecall
MAPMOVE 土城 330 330
SENDMSG 6 挑战完成,已传送回城
这里需要注意,[@OnKillMob] 是全局触发,所有怪物死亡都会进入判断,所以必须加地图判断,避免普通地图杀怪也触发奖励。
如果只希望特定BOSS触发,可以再加怪物名判断,具体命令以引擎支持为准。部分引擎支持在触发中读取怪物名称或怪物ID,无法判断时可以用独立挑战地图隔离。
第五种:挑战失败与死亡处理
挑战地图中玩家死亡时,需要处理复活、踢出地图或扣除次数。人物死亡触发一般写在 QFunction-0.txt 的 [@PlayDie] 中。
示例:
[@PlayDie]
IF
ISONMAP 挑战地图
ACT
SENDMSG 6 挑战失败
BreakTimeRecall
MAPMOVE 土城 330 330
如果希望死亡后不增加挑战次数,进入地图时不要立即 INC 次数,而是等挑战成功或离开时再记录。也可以把次数扣除写在进入时,死亡后不再补回,形成消耗型挑战。
第六种:奖励结算与背包检测
发放奖励前必须检测背包空间,避免物品丢失。
示例:
[@发放挑战奖励]
IF
CHECKBAGGAGE
ACT
SENDMSG 6 背包已满,请清理后领取奖励
ELSEACT
GIVE 挑战宝箱 1
SENDMSG 6 已获得挑战奖励
如果奖励包含多种物品,可以分步发放:
[@发放挑战奖励]
IF
CHECKBAGGAGE
ACT
SENDMSG 6 背包已满
ELSEACT
GIVE 挑战宝箱 1
GIVE 经验丹 5
GAMEGOLD + 1000
SENDMSG 6 挑战奖励已发放
第七种:防止重复进入和刷奖励
挑战功能常见问题是玩家反复进入、重复领奖或多人卡BOSS。可以在进入时加状态标记:
[@进入挑战地图]
IF
CHECKLEVEL 50
SMALL U0 3
EQUAL U1 0
ACT
MOV U1 1
MAPMOVE 挑战地图 150 150
TimeRecall 10
INC U0 1
SENDMSG 6 已进入挑战
ELSEACT
SENDMSG 6 你已在挑战中或次数不足
离开地图、死亡或超时后,再把 U1 清零:
[@离开挑战地图]
IF
ACT
MOV U1 0
BreakTimeRecall
MAPMOVE 土城 330 330
如果版本支持镜像地图,可以给每个进入玩家创建独立挑战空间,避免多人抢BOSS。GOM/GEE 类引擎常见做法是使用镜像地图或动态地图命令,具体命令需查当前引擎文档。
第八种:部署位置与调试
NPC对话脚本一般放在 Market_Def 或 Npc_def 目录;全局触发脚本放在 QFunction-0.txt;登录重置放在 QManage.txt 或对应登录触发文件。 修改后保存为 ANSI 编码,并在 M2 中重新加载脚本或重启服务端。
调试时按以下顺序检查:
NPC能否正常对话,条件是否生效
进入地图后是否能正确传送
TimeRecall 是否能限时返回
怪物是否正常刷新
[@OnKillMob] 是否能触发奖励
[@PlayDie] 是否能处理死亡退出
次数变量是否可保存,重启后是否重置
奖励发放是否受背包检测保护
如果进入地图后没有怪物,检查地图刷怪配置和 MONGEN 参数;如果奖励不发放,检查是否缺少地图判断;如果次数不保存,检查变量是否使用可保存类型;如果玩家死亡后仍留在挑战地图,检查 [@PlayDie] 是否正确写入并重新加载。
传奇添加挑战功能:NPC进入、次数冷却、地图怪物与奖励结算脚本
来源:
作者:
点击:

