在传奇里,想在土城安全区设置一个泡经验NPC,实现玩家不传送地图、定时扣金币给经验,且离开特定范围后自动关闭泡经验功能,这样的脚本并不难写。下面就结合常见的引擎(如HeroM2)来说说具体的制作方法。
首先,明确这个泡经验NPC的核心逻辑:玩家与NPC对话后开启泡经验模式,系统每10分钟检测一次——若玩家在设定范围内且金币足够,就扣除10000金币并发放10000经验;若玩家离开范围或金币不足,就自动关闭泡经验。
第一步,编写NPC的基丛话脚本。在土城的NPC脚本文件(通常是3.map.txt,对应盟重省地图)中,添加一个新的NPC条目,比如命名为“安全区泡经验使者”,坐标设置在安全区中心(如330340)。基丛话代码可以这样写:
[@Main]
欢迎来到安全区泡经验!
在这里每10分钟可获得10000经验,需消耗10000金币。
<开启泡经验/@StartExp>
<关闭泡经验/@StopExp>
这段代码的作用是让NPC显示对话选项,玩家点击“开启泡经验”后触发后续逻辑。
第二步,编写开启泡经验的脚本(@StartExp标签)。这里需要先判断玩家是否已在泡经验状态,避免重复开启,同时记录玩家的初始位置(用于后续范围检测)。代码如下:
[@StartExp]
#IF
CheckVar泡经验状态_\(USERNAME=1
#ACT
SendMsg6你已在泡经验状态中!
break
#ELSE
#ACT
SetVar泡经验状态_\)USERNAME1
SetVar泡经验初始X_\(USERNAME\)X
SetVar泡经验初始Y_\(USERNAME\)Y
SendMsg6泡经验已开启!请不要离开安全区范围。
Goto@ExpLoop
其中,“\(X”和“\)Y”是玩家当前的坐标变量,“SetVar”用于记录状态和初始位置,“@ExpLoop”是循环检测的标签。
第三步,编写循环检测脚本(@ExpLoop标签)。这部分是核心,需要实现定时检测、金币扣除、经验发放和范围判断。代码可以这样设计:
[@ExpLoop]
#IF
CheckVar泡经验状态_\(USERNAME=0
#ACT
break
#ELSE
#IF
Distance\)X\(Y<\)泡经验初始X_\(USERNAME\)泡经验初始Y_\(USERNAME50
CheckGold10000
#ACT
Delay600000
TakeGold10000
GiveExp10000
SendMsg6获得10000经验,消耗10000金币。
Goto@ExpLoop
#ELSE
#ACT
SetVar泡经验状态_\)USERNAME0
SendMsg6你已离开泡经验范围或金币不足,泡经验已关闭。
break
这段代码的逻辑是:先检查玩家是否处于开启状态,若已关闭则终止循环;若正常,则检测玩家是否在初始位置的50格范围内(“Distance”命令用于计算距离)且金币足够。如果条件满足,就延迟10分钟(600000毫秒),扣除金币、发放经验后重新进入循环;如果玩家离开范围或金币不够,就关闭泡经验状态并提示。
第四步,编写关闭泡经验的手动选项(@StopExp标签),方便玩家主动退出:
[@StopExp]
#IF
CheckVar泡经验状态_\(USERNAME=1
#ACT
SetVar泡经验状态_\)USERNAME0
SendMsg6已手动关闭泡经验。
break
#ELSE
#ACT
SendMsg6你未开启泡经验。
break
需要注意几个细节:范围大小可以根据安全区实际情况调整,把“50”改成“30”或“80”即可;定时时间若想改成5分钟,就把“Delay600000”换成“Delay300000”(1分钟=60000毫秒)。另外,变量名(如“泡经验状态_\(USERNAME”)中的“\)USERNAME”会自动替换为玩家角色名,确保每个玩家的状态独立记录。
测试脚本时,用一个账号在安全区内开启泡经验,观察10分钟后是否扣除金币并获得经验;再走到安全区外,看是否自动关闭;最后尝试手动关闭,检查是否正常生效。如果发现范围检测不灵敏,可能是“Distance”命令的参数顺序有误(部分引擎是“Distance初始X初始Y\(X\)Y范围”),可以参考引擎手册调整。
最后,保存脚本文件并重启服务器,这个泡经验NPC就能正常工作了。整个过程的关键是用变量记录状态和位置,通过循环检测实现定时功能,再用距离命令判断玩家是否在范围内,按这个思路调整参数,就能满足不同的泡经验需求。
首先,明确这个泡经验NPC的核心逻辑:玩家与NPC对话后开启泡经验模式,系统每10分钟检测一次——若玩家在设定范围内且金币足够,就扣除10000金币并发放10000经验;若玩家离开范围或金币不足,就自动关闭泡经验。
第一步,编写NPC的基丛话脚本。在土城的NPC脚本文件(通常是3.map.txt,对应盟重省地图)中,添加一个新的NPC条目,比如命名为“安全区泡经验使者”,坐标设置在安全区中心(如330340)。基丛话代码可以这样写:
[@Main]
欢迎来到安全区泡经验!
在这里每10分钟可获得10000经验,需消耗10000金币。
<开启泡经验/@StartExp>
<关闭泡经验/@StopExp>
这段代码的作用是让NPC显示对话选项,玩家点击“开启泡经验”后触发后续逻辑。
第二步,编写开启泡经验的脚本(@StartExp标签)。这里需要先判断玩家是否已在泡经验状态,避免重复开启,同时记录玩家的初始位置(用于后续范围检测)。代码如下:
[@StartExp]
#IF
CheckVar泡经验状态_\(USERNAME=1
#ACT
SendMsg6你已在泡经验状态中!
break
#ELSE
#ACT
SetVar泡经验状态_\)USERNAME1
SetVar泡经验初始X_\(USERNAME\)X
SetVar泡经验初始Y_\(USERNAME\)Y
SendMsg6泡经验已开启!请不要离开安全区范围。
Goto@ExpLoop
其中,“\(X”和“\)Y”是玩家当前的坐标变量,“SetVar”用于记录状态和初始位置,“@ExpLoop”是循环检测的标签。
第三步,编写循环检测脚本(@ExpLoop标签)。这部分是核心,需要实现定时检测、金币扣除、经验发放和范围判断。代码可以这样设计:
[@ExpLoop]
#IF
CheckVar泡经验状态_\(USERNAME=0
#ACT
break
#ELSE
#IF
Distance\)X\(Y<\)泡经验初始X_\(USERNAME\)泡经验初始Y_\(USERNAME50
CheckGold10000
#ACT
Delay600000
TakeGold10000
GiveExp10000
SendMsg6获得10000经验,消耗10000金币。
Goto@ExpLoop
#ELSE
#ACT
SetVar泡经验状态_\)USERNAME0
SendMsg6你已离开泡经验范围或金币不足,泡经验已关闭。
break
这段代码的逻辑是:先检查玩家是否处于开启状态,若已关闭则终止循环;若正常,则检测玩家是否在初始位置的50格范围内(“Distance”命令用于计算距离)且金币足够。如果条件满足,就延迟10分钟(600000毫秒),扣除金币、发放经验后重新进入循环;如果玩家离开范围或金币不够,就关闭泡经验状态并提示。
第四步,编写关闭泡经验的手动选项(@StopExp标签),方便玩家主动退出:
[@StopExp]
#IF
CheckVar泡经验状态_\(USERNAME=1
#ACT
SetVar泡经验状态_\)USERNAME0
SendMsg6已手动关闭泡经验。
break
#ELSE
#ACT
SendMsg6你未开启泡经验。
break
需要注意几个细节:范围大小可以根据安全区实际情况调整,把“50”改成“30”或“80”即可;定时时间若想改成5分钟,就把“Delay600000”换成“Delay300000”(1分钟=60000毫秒)。另外,变量名(如“泡经验状态_\(USERNAME”)中的“\)USERNAME”会自动替换为玩家角色名,确保每个玩家的状态独立记录。
测试脚本时,用一个账号在安全区内开启泡经验,观察10分钟后是否扣除金币并获得经验;再走到安全区外,看是否自动关闭;最后尝试手动关闭,检查是否正常生效。如果发现范围检测不灵敏,可能是“Distance”命令的参数顺序有误(部分引擎是“Distance初始X初始Y\(X\)Y范围”),可以参考引擎手册调整。
最后,保存脚本文件并重启服务器,这个泡经验NPC就能正常工作了。整个过程的关键是用变量记录状态和位置,通过循环检测实现定时功能,再用距离命令判断玩家是否在范围内,按这个思路调整参数,就能满足不同的泡经验需求。

