收保护费脚本本质是一套PVP互动玩法,玩家在土城安全区外被NPC拦截,选择交钱或者挨打。脚本核心由三部分组成:拦截判定、缴费通道、拒绝后的强制PK触发。以下范例基于Hero引擎语法,其他引擎需对照命令表做替换。
## 脚本整体框架
保护费NPC放在土城传送员附近,脚本文件命名按地图编号后缀规则。盟重省地图编号为3,脚本文件名为保护费-3.txt,放在`Mir200\Envir\Market_Def\`目录下。NPC配置行写入`Mir200\Envir\MerChant.txt`:
```plaintext
保护费 3 335 328 土城管事 0 8 0 0 0
```
坐标335,328在土城安全区边缘,确保玩家刚出安全区就能被拦到。外观代码8是普通守卫形象。
主菜单用变量记录玩家是否已经交过费。个人变量[50]为0表示没交过,为1表示今天已交。脚本每次打开时先做判断:
```plaintext
[@main]
#IF
CHECKVAR HUMAN 保护费 < 1
#SAY
站住!土城新规矩,路过交保护费。\
不交也行,我喊兄弟来跟你聊聊。\
<交1000金币/@交费> <不交/@不交>\
#IF
CHECKVAR HUMAN 保护费 > 0
#SAY
算你识相,今天不找你了。\
<离开/@exit>\
```
CHECKVAR HUMAN读取个人变量,变量名为保护费,存在玩家角色数据里,下线重上不会丢。变量值大于0说明今天已经交过,直接放行。
## 缴费通道的实现
缴费检测金币数量,扣除后修改变量,并给玩家一个临时通行标记。金币检测用CHECKGOLD,扣除用金币扣除命令。Hero引擎中金币扣除通常写GAMEGOLD - 数量,但GAMEGOLD操作的是元宝,金币要用专门命令。如果引擎不支持金币扣除,改用元宝收费,命令改为CHECKGAMEGOLD和GAMEGOLD。
```plaintext
[@交费]
#IF
CHECKGOLD > 999
#ACT
GAMEGOLD - 1000
CALCVAR HUMAN 保护费 = 1
SAVEVAR HUMAN 保护费 ..\QuestDiary\保护费记录\保护费.txt
SENDMSG 6 你缴纳了1000金币保护费,今天没人找你麻烦。
CLOSE
#ELSESAY
没钱?没钱还敢在土城混?\
<返回/@main>\
```
CHECKGOLD后面的数字写999而不是1000,是Hero引擎边界值处理的稳妥写法。CALCVAR HUMAN修改个人变量,SAVEVAR HUMAN将变量写入文本文件持久保存。文件路径中的目录需要提前建好,Hero引擎不会自动创建目录。
变量保存路径建议用`..\QuestDiary\保护费记录\`,每个玩家的记录以角色名区分,文件内容格式为角色名加变量值。如果不想用文件持久化,也可以只靠变量内存保存,但玩家下线后变量重置,需要每次上线重新收费。文件持久化适合按天收费的设定,配合日期变量实现每日重置。
## 拒绝缴费触发强制PK
不交费的玩家触发PK模式,让土城守卫攻击玩家。Hero引擎中触发怪物攻击的命令是PARAM1到PARAM3配合MonGen,或者直接用脚本命令让NPC召唤怪物。更简单的做法是用CHANGEMODE强制切换玩家PK模式,然后调用地图事件触发附近守卫攻击。
```plaintext
[@不交]
#IF
#ACT
MESSAGEBOX 你选择了不交保护费,土城守卫将对你发起攻击!
CHANGEMODE 2 1
MAPMOVE 3 335 330
SENDMSG 0 玩家[%s]在土城拒交保护费,被守卫盯上了!
BREAK
```
CHANGEMODE 2 1中的2表示强制PK模式,1表示开启。这个命令让玩家进入可被攻击状态。MAPMOVE把玩家传到守卫旁边,守卫的AI设置为主动攻击模式后会自动追打玩家。
如果不想用PK模式,改用刷怪命令在玩家身边刷出一只攻击力较高的守卫怪:
```plaintext
[@不交]
#IF
#ACT
MESSAGEBOX 你拒交保护费,守卫队长来了!
PARAM1 3
PARAM2 335
PARAM3 328
MonGen 土城守卫 1 1
SENDMSG 0 玩家[%s]在土城拒交保护费,守卫队长亲自出马!
BREAK
```
MonGen命令在地图3的335,328坐标刷出一只土城守卫。守卫的AI在Monster.DB中设置为主动攻击,刷出后会立即追击玩家。这种方式不改变玩家PK模式,避免影响玩家与其他玩家的正常互动。
## 土城守卫的数据库配置
土城守卫需要在Monster.DB中单独注册。如果版本中没有这个怪物,复制一只祖玛卫士的数据行,修改名称和属性:
```plaintext
土城守卫;80;3000;120;80;0;0;5000;0;0;0;0;0;0;0;0;0;-1;0;0;0;;;;;
```
字段依次为名称、等级、体力、攻击、防御、魔御、经验值。等级80确保守卫能对中高阶玩家造成压力但不会秒杀低等级玩家。体力3000和攻击120的设定适合作为惩戒型怪物,打不死玩家但会让玩家感到麻烦。
守卫的AI设置需要在M2的怪物AI配置中勾选主动攻击和追击范围。追击范围建议设为10格,太大会追到安全区边缘,太小玩家跑几步就脱战了。守卫的攻击速度不宜过快,避免低等级玩家被连续攻击无法脱身。
## 多次收费与递增机制
如果希望玩家每次路过都收费,而不是每天只收一次,把个人变量改为计数器模式:
```plaintext
[@交费]
#IF
CHECKGOLD > 999
#ACT
GAMEGOLD - 1000
CALCVAR HUMAN 保护费 + 1
SAVEVAR HUMAN 保护费 ..\QuestDiary\保护费记录\保护费.txt
SENDMSG 6 你第<$HUMAN(保护费)>次缴纳保护费,共计消费<$HUMAN(保护费)>000金币。
CLOSE
```
CALCVAR HUMAN 保护费 + 1将变量值增加1,每次缴费累加。主菜单中检测条件改为CHECKVAR HUMAN 保护费 < 1,只有第一次免费放行,第二次开始每次都要交。这种设定适合做趣味玩法,让玩家在土城来回走动时反复被收费。
如果希望费用递增,可以用变量做乘数:
```plaintext
[@交费]
#IF
CHECKGOLD > 999
#ACT
MOV P1 <$HUMAN(保护费)>
INC P1 1
MUL P1 1000
GAMEGOLD - <$STR(P1)>
CALCVAR HUMAN 保护费 + 1
SAVEVAR HUMAN 保护费 ..\QuestDiary\保护费记录\保护费.txt
SENDMSG 6 你第<$HUMAN(保护费)>次缴费,本次费用<$STR(P1)>金币。
CLOSE
```
MOV P1将保护费变量值读入临时变量P1,INC P1 1加1,MUL P1 1000乘以1000。第一次缴费1000金币,第二次2000,第三次3000,以此类推。GAMEGOLD - <$STR(P1)>中的<$STR(P1)>会被替换为P1变量的当前值。
## 保护费豁免与VIP通道
给部分玩家豁免权,比如沙巴克成员或特定行会成员可以免费通过。在主菜单最前面加一个判断段:
```plaintext
[@main]
#IF
ISCASTLEGUILD
#SAY
沙巴克的人,自己人,不用交。\
<离开/@exit>\
#IF
CHECKVAR HUMAN 保护费 < 1
#SAY
站住!土城新规矩,路过交保护费。\
<交1000金币/@交费> <不交/@不交>\
```
ISCASTLEGUILD检测玩家是否为沙巴克行会成员,成立则直接放行。类似的判断还可以用CHECKGUILDNAME检测特定行会名称,或者用CHECKNAMELIST检测玩家是否在豁免名单文件中。
VIP豁免用个人变量或名单文件都可以。名单文件方式更方便GM管理:
```plaintext
#IF
CHECKNAMELIST ..\QuestDiary\保护费记录\豁免名单.txt
#SAY
你是VIP,不用交费。\
<离开/@exit>\
```
CHECKNAMELIST检测玩家角色名是否在指定文件中,文件中每行一个角色名。GM只需编辑这个文件就能增减豁免玩家,不用逐个修改脚本。
## 全服公告与趣味互动
每次有玩家拒交保护费,发送全服公告增加娱乐效果。SENDMSG 0发送全服消息,%s会被替换为角色名。还可以用SendCenterMsg发送居中公告,颜色代码让公告更醒目:
```plaintext
SendCenterMsg 249 252 土城快报:玩家[%s]拒交保护费,被守卫追着满城跑! 1 5
```
参数依次为文字颜色、背景颜色、内容、公告类型、持续时间。颜色代码249和252在多数引擎中对应红色和黄色。最后的1表示公告类型,5表示持续5秒。
如果希望更搞笑的公告,可以随机从文本文件中抽取一条:
```plaintext
GetRandomName ..\QuestDiary\保护费记录\公告台词.txt S99
SendCenterMsg 249 252 <$STR(S99)> 1 5
```
公告台词文件每行写一条台词,例如“XXX被守卫追了三条街”、“XXX的钱包保住了,腿没保住”。GetRandomName随机抽取一行存入S99,然后发送。%s的替换功能在SendCenterMsg中同样有效,如果台词文件中写了%s,抽取后会被替换为玩家名。
## 时间限制与活动周期
保护费玩法如果全天开放会让玩家烦躁,建议限制在特定时间段。用HOUR和MIN命令控制活动窗口:
```plaintext
[@main]
#IF
HOUR 19 22
#SAY
站住!土城新规矩,路过交保护费。\
<交1000金币/@交费> <不交/@不交>\
#ELSESAY
现在不是收费时间,你走吧。\
<离开/@exit>\
```
HOUR 19 22表示只在19点到22点之间开放收费,其他时间NPC不拦截。这个时间段通常是游戏在线高峰期,玩家互动最活跃。
活动周期的重置可以在每天0点用Robot.txt自动执行变量清零。在`Mir200\Envir\Robot.txt`中添加:
```plaintext
#AutoRun NPC RUNONDAY 00:00 @清除保护费记录
```
对应的脚本写在RobotManage.txt中:
```plaintext
[@清除保护费记录]
#ACT
CLEARNAMELIST ..\QuestDiary\保护费记录\保护费.txt
SENDMSG 0 新的一天开始了,土城保护费记录已重置。
```
CLEARNAMELIST清空名单文件中的所有内容,所有玩家当天的缴费记录归零。这个脚本每天0点自动执行,不需要人工干预。
## 调试与常见问题
点击NPC没有反应,先检查MerChant.txt中的脚本文件名后缀是否与地图编号一致。地图3的NPC脚本文件必须命名为保护费-3.txt,后缀写错引擎找不到脚本。
缴费后变量没有保存,检查SAVEVAR的路径目录是否存在。Hero引擎不会自动创建不存在的目录,需要手动在QuestDiary下建立保护费记录文件夹。如果服务端安装在系统盘,可能因权限不足写入失败,建议把服务端放在非系统盘。
不交费后守卫没有出现,检查MonGen命令中的地图编号和坐标是否在可行走区域内。坐标如果落在障碍物或安全区内,怪物可能刷不出来或刷出来不攻击。用GM命令@move测试坐标点是否可站立。
CHANGEMODE 2 1执行后玩家没有进入PK模式,不同引擎对CHANGEMODE的参数定义可能不同。Hero引擎中2代表强制PK模式,1代表开启。如果引擎版本不支持这个命令,改用MonGen刷怪方案,让守卫主动攻击拒交的玩家。
变量名称不要与引擎内置变量冲突。保护费这个变量名是自定义的,不会与任何内置变量冲突。但如果改用U变量或P变量,需要确认该变量没有被其他脚本占用。建议统一用HUMAN变量配合SAVEVAR文件持久化,避免变量冲突和重置问题。

