当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇添加挑战功能:NPC进入、次数冷却、地图怪物与奖励结算脚本

热度:
传奇里“挑战功能”通常指玩家通过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]是否正确写入并重新加载。
[顶部]