声望卷换声望有两种实现路线。第一种是双击物品直接触发,玩家在背包中双击声望卷,系统扣除物品并增加声望。第二种是与NPC对话兑换,适合批量操作和附加条件。两种路线可以共存,但数据库配置和脚本文件位置不同。下面按物品数据库、双击触发脚本、NPC兑换脚本、批量输入、防刷检测、引擎差异和排查顺序逐一说明。
物品数据库配置
打开服务端Mud2\DB目录下的StdItems.DB文件。找到声望卷对应的物品记录,需要修改以下字段。
STDMODE改为31。这个值表示物品属于脚本触发类型,双击时不执行药品或装备的默认逻辑,而是跳转到QFunction脚本中查找对应的处理段。
AniCount设为一个未被占用的编号,范围1到999。例如设为210。这个编号将用于匹配QFunction-0.txt中的标签名,标签格式为[@StdModeFunc210]。每件触发类物品的AniCount必须唯一,不能与其他31类物品重复。
Source设为0。表示物品使用后消失。如果希望声望卷可以分次使用,Source设为1,并在DuraMax字段中填入最大使用次数。每次双击消耗1点持久,持久为0时物品消失。
Shape字段在GEE引擎中有额外作用。Shape设为50表示使用一次后消失,Shape设为51表示可以一直使用直到手动删除。如果使用Shape=51,需要在脚本中主动扣除物品,否则物品不会自动消耗。
Reserved字段在BLUE引擎中需要设置。StdMode=31且Reserved=99时,物品才支持双击触发。部分BLUE引擎版本还要求Reserved=99才能正常读取AniCount编号。
物品名称必须准确。后续脚本中TAKE命令和CHECKITEM命令使用的名称,必须与StdItems.DB中的Name字段完全一致。名称中的括号、空格、特殊符号都要匹配。差一个字,命令会静默失败,不产生任何报错。
双击触发脚本
脚本文件固定在Mirserver\Mir200\Envir\Market_Def\QFunction-0.txt。这个文件是31类触发物品的专用脚本库,双击脚本只能写在这里,写到其他NPC脚本文件中不会被执行。
打开QFunction-0.txt,在文件末尾或合适位置添加触发段。标签名中的数字与数据库AniCount一致。AniCount为210,标签就是[@StdModeFunc210]。
基础脚本结构:
```
[@StdModeFunc210]
#IF
CHECKITEM 声望卷 1
#ACT
TAKE 声望卷 1
CREDITPOINT + 1
SENDMSG 6 你使用声望卷获得了1点声望。
BREAK
#ELSEACT
SENDMSG 6 你背包中没有声望卷。
BREAK
```
CHECKITEM 声望卷 1检测背包中是否存在至少1个声望卷。TAKE 声望卷 1扣除1个。CREDITPOINT + 1增加1点声望。SENDMSG 6发送聊天框提示。BREAK终止脚本段执行。
这里必须先检测再扣除。部分引擎的31类物品在双击时会自动消耗,但不同引擎的自动消耗机制不统一。GOM引擎默认会自动扣除物品,BLUE引擎需要脚本手动扣除,GEE引擎部分版本需要配合Shape字段。稳妥做法是在脚本中主动检测和扣除,不要依赖引擎的自动消耗。
如果希望一次使用获得多点声望,把CREDITPOINT + 1改为CREDITPOINT + 5,同时调整TAKE的数量或保持1个声望卷换5点声望。
NPC兑换脚本
NPC兑换适合批量操作。脚本文件放在MirServer\Mir200\Envir\Market_Def目录下,文件名格式为“NPC名-地图号.txt”。例如“声望兑换-3.txt”。地图号根据NPC所在位置填写,3通常对应盟重省。
脚本头部功能声明只需要基础对话标识,不需要买卖类标识。主菜单写法:
```
[@main]
欢迎使用声望兑换服务。\
1张声望卷可以兑换1点声望。\
<兑换1点声望/@兑换1>\
<兑换10点声望/@兑换10>\
<批量兑换/@批量>\
<离开/@exit>
[@兑换1]
#IF
CHECKITEM 声望卷 1
#ACT
TAKE 声望卷 1
CREDITPOINT + 1
SENDMSG 6 兑换成功,获得1点声望。
BREAK
#ELSEACT
MESSAGEBOX 你背包中没有声望卷。
BREAK
[@兑换10]
#IF
CHECKITEM 声望卷 10
#ACT
TAKE 声望卷 10
CREDITPOINT + 10
SENDMSG 6 兑换成功,获得10点声望。
BREAK
#ELSEACT
MESSAGEBOX 你背包中的声望卷不足10张。
BREAK
```
CHECKITEM后面的数量必须与TAKE后面的数量一致。如果CHECKITEM检测10张但TAKE只扣1张,玩家可以用10张的检测通过后反复兑换,造成刷取漏洞。两个数字必须同步修改。
批量兑换输入数量
批量兑换需要玩家输入要兑换的数量。不同引擎的输入命令不同。GOM引擎使用@@InPutInteger,HERO引擎使用@@InPutString,3K引擎使用INPUTINTEGER或类似命令。以GOM引擎为例。
主菜单中增加按钮:
```
<批量兑换/@批量兑换>
```
批量兑换段:
```
[@批量兑换]
#IF
#ACT
MOV N$兑换数量 0
MOV N$单次声望 1
GOTO @输入数量
[@输入数量]
#IF
#ACT
@@InPutInteger 请输入要兑换的声望卷数量(1-100): @确认兑换
[@确认兑换]
#IF
SMALL N$兑换数量 1
#ACT
MESSAGEBOX 输入数量不能小于1。
BREAK
#IF
LARGE N$兑换数量 100
#ACT
MESSAGEBOX 单次兑换不能超过100。
BREAK
#IF
CHECKITEM 声望卷 <$STR(N$兑换数量)>
#ACT
TAKE 声望卷 <$STR(N$兑换数量)>
CREDITPOINT + <$STR(N$兑换数量)>
SENDMSG 6 兑换成功,获得<$STR(N$兑换数量)>点声望。
BREAK
#ELSEACT
MESSAGEBOX 你的声望卷数量不足。
BREAK
```
N$兑换数量是变量,玩家输入的值存储在这个变量中。SMALL检测小于,LARGE检测大于。CHECKITEM后面的数量用<$STR(N$兑换数量)>读取变量值。TAKE和CREDITPOINT同样使用变量值。
变量上限需要控制。不限制输入值时,玩家可以输入999999或负数。负数会导致CHECKITEM判断异常,超上限可能导致CREDITPOINT溢出。必须设置最小值1和最大值上限。上限根据服务端声望系统的实际容量设定,通常100到1000之间。
防刷检测
声望卷属于高价值物品,脚本中必须加入多层检测。
第一层,物品存在性检测。每次兑换前用CHECKITEM检测背包中实际存在的数量。不要依赖客户端显示的物品数量,客户端数据可以被修改。
第二层,背包空间检测。批量兑换时如果背包空间不足,TAKE命令可能执行失败但CREDITPOINT已经增加。在兑换前用CHECKBAGSIZE检测背包剩余格子:
```
#IF
NOT CHECKBAGSIZE 5
#ACT
MESSAGEBOX 背包空间不足,请清理后再兑换。
BREAK
```
第三层,冷却时间。用个人变量记录上次兑换时间,间隔低于设定值时拒绝操作:
```
#IF
CHECK [111] 1
#ACT
MESSAGEBOX 操作过于频繁,请稍后再试。
BREAK
#ACT
SET [111] 1
DELAYGOTO 3000 @清除冷却
[@清除冷却]
#ACT
SET [111] 0
```
个人变量111作为冷却标记,DELAYGOTO 3000表示3000毫秒后跳转到清除冷却标签。冷却时间根据实际需求调整,3000毫秒适合防止连点,如果需要更严格的限制可以设为10000或更高。
第四层,日志记录。每次兑换把玩家账号、兑换数量、时间写入文本文件:
```
AddTextListEx ..\QuestDiary\声望兑换记录.txt <$USERNAME> 0
```
记录文件用于后续查询异常兑换行为。长期运行后文件会增大,建议按日期分文件存储。
多引擎差异
GOM引擎的声望值命令是CREDITPOINT,增加写CREDITPOINT + 数值,减少写CREDITPOINT - 数值。检查声望值没有直接命令,通常用变量或脚本逻辑间接判断。
GEE引擎的CREDITPOINT命令用法与GOM一致。输入命令使用@@InPutInteger,变量使用N$或S$前缀。部分GEE版本中声望值显示变量为<$CREDITPOINT>,可以直接在NPC对话中显示当前声望。
BLUE引擎的声望值命令同样是CREDITPOINT,但31类物品的触发标签格式为[@STDMODEFUNCXXX],全大写,数字对应AniCount。BLUE引擎要求Reserved=99才能触发双击脚本。扣除物品必须手动执行TAKE,BLUE不会自动消耗31类物品。
HERO引擎的声望命令为CREDITPOINT,输入命令使用@@InPutString,回调标签需要加Call前缀。从GOM迁移到HERO时,所有@@InPutInteger要改为@@InPutString,回调标签名前加Call。
3K引擎的输入命令和回调标签写法与GOM有差异。3K的非法字符检查需要手动配置过滤列表,不配置时玩家可以输入特殊字符导致脚本解析异常。兑换脚本中所有变量输出都要用<$STR(变量名)>包裹,直接写变量名不会替换为实际值。
常见问题排查
双击声望卷没有任何反应。检查StdItems.DB中的STDMODE是否为31,AniCount是否与QFunction-0.txt中的标签数字一致。检查QFunction-0.txt文件编码是否为ANSI,UTF-8格式的BOM头会导致标签识别失败。检查脚本中是否存在重复的[@StdModeFunc210]标签,重复标签只有第一个生效。
NPC兑换时提示物品不足但背包中有声望卷。检查CHECKITEM命令中的物品名称是否与StdItems.DB中的Name字段完全一致。名称中的空格、括号、标点都要核对。检查物品是否被设置为不可交易或不可丢弃,部分物品规则会阻止CHECKITEM和TAKE命令正常操作。
兑换后声望没有增加。检查CREDITPOINT命令是否写在#ACT段中,#IF段中不能执行修改操作。检查引擎是否开启了声望上限,部分版本中声望值有最大限制,达到上限后继续增加会被引擎拒绝且不报错。在M2Server控制台的参数设置中查看是否有声望上限配置。
批量兑换输入数量后脚本无响应。检查输入命令的语法是否正确。GOM引擎的@@InPutInteger后面的提示文字和跳转标签之间不能有多余空格。检查变量名是否与输入命令中使用的变量一致,输入命令写入的变量和后续读取的变量必须是同一个。
兑换记录文件没有生成。检查AddTextListEx命令中的路径是否正确。QuestDiary目录必须存在,文件名不能包含特殊字符。检查服务端进程是否有该目录的写入权限,权限不足时命令静默失败。
所有修改完成后,在M2Server控制台执行重新加载脚本和重新加载物品数据库操作,或者直接重启M2Server。用测试账号实际双击声望卷和与NPC对话兑换,分别验证单次兑换、批量兑换、数量不足时的提示和冷却限制是否正常工作。修改数据库或脚本后不要同时做多项改动,每次只改一个位置,验证通过后再改下一处。
传奇声望卷兑换声望脚本物品数据库配置双击触发与NPC批量兑换完整方法
来源:
作者:
点击:

