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

