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

