传奇双倍经验药物脚本编写与持久化状态深度配置方案

来源: 作者: 点击:
实现“食用后双倍经验、死亡不掉线、下线不消失、持续30分钟”的药物效果,核心在于利用全局变量(Global Variable)记录剩余时间,结合定时器(Timer)每秒递减,并在杀怪获取经验时通过条件判断(CheckVar)动态翻倍。此逻辑完全脱离物品本身,物品仅作为触发变量赋值的媒介。

第一步:定义物品与触发脚本。
打开D:MirServerMir200EnvirMarket_defQFunction.txt文件(部分版本在QManage.txt或独立物品脚本中)。找到或新建物品触发段落,格式为[@物品名称]。假设物品名为“双倍经验丹”,则段落标题为[@双倍经验丹]。
在该段落下编写赋值逻辑:
[@双倍经验丹]
ACT
CALC G10 + 1800
SET OnDoubleExp 1
SENDMSG 6 恭喜!您服用了双倍经验丹,获得30分钟双倍经验加成!
BREAK
此处逻辑解析:CALC G10 + 1800表示给全局变量G10增加1800秒(即30分钟)。若需叠加时间,使用加法;若需固定30分钟无论之前剩多少,直接用MOV G10 1800。SET OnDoubleExp 1是开启一个开关变量,用于快速判断是否处于双倍状态,避免每秒都去计算G10是否大于0,提升效率。SENDMSG发送提示消息。BREAK终止脚本执行,防止后续冲突。
注意:物品数据库(StdItems.db或ItemInfo.txt)中该物品的“形状”或“特别属性”需设置为触发QFunction脚本,通常Shape设为1或特定值,并在M2的“物品规则”中关联QFunction.txt。

第二步:编写全局定时器脚本(核心逻辑)。
打开D:MirServerMir200EnvirMapQuest_defQManage.txt文件。在文件末尾新建段落[@Timer]。此段落由M2引擎的“管理器”->“脚本设置”中的“定时器”功能调用,建议设置间隔为1秒(1000毫秒)。
脚本内容如下:
[@Timer]
IF
CHECKVAR GLOBAL OnDoubleExp = 1
ACT
CALC G10 - 1
IF
CHECKVAR GLOBAL G10 您的双倍经验时间已结束。
ELSEACT
IF
EQUAL G10 60
ACT
SENDMSG 7 双倍经验剩余时间:1分钟。
IF
EQUAL G10 300
ACT
SENDMSG 7 双倍经验剩余时间:5分钟。
BREAK
逻辑解析:首先检查开关OnDoubleExp是否为1。若是,则G10减1秒。接着判断G10是否小于等于0,若是则关闭开关、清零时间并提示结束。否则,继续检测是否剩余1分钟(60秒)或5分钟(300秒),发送倒计时提醒。此脚本确保玩家下线后,再次上线时G10变量依然保留(因为是GLOBAL全局变量),只要M2服务端未重启,时间会继续倒数。若需服务器重启也保留,需将G10写入数据库角色扩展字段,但单机通常无需如此复杂,保持内存变量即可满足“下线不消失”需求(指短时间离线)。

第三步:修改杀怪经验获取逻辑。
这是最关键的一步,必须拦截经验发放过程。打开D:MirServerMir200EnvirMapQuest_defQManage.txt(或部分引擎在QFunction.txt的[@KillMonster]段落)。查找[@KillMonster]标签。若无则新建。
脚本内容:
[@KillMonster]
IF
CHECKVAR GLOBAL OnDoubleExp = 1
ACT
CALC H10 + 100
; 此处H10为临时变量,用于存储倍率,或者直接修改经验获取命令
; 多数引擎经验发放由内核控制,需通过ChangeExp命令或拦截脚本
; 通用写法如下(视引擎版本可能不同):
; 方法A:直接加倍当前获得经验(需引擎支持动态变量)
; CHANGEEXP + (此法较难,通常用下面方法)
; 方法B(推荐):在M2中设置经验倍数脚本
ELSESAY
当前获得经验:
双倍状态:开启
; 实际生效需在M2控制台设置
; 进入M2 -> 管理 -> 游戏管理 -> 经验设置
; 勾选“使用脚本控制经验倍数”
; 或在QFunction中重写@GiveExp事件
BREAK

修正方案:大多数现代引擎(GOM/GEE)在QFunction.txt中有[@GiveExp]事件。
[@GiveExp]
IF
CHECKVAR GLOBAL OnDoubleExp = 1
ACT
CALC H10 * 2
CHANGEEXP +
; 注意:CHANGEEXP是增加经验,需先扣除原经验或直接覆盖
; 更稳妥的写法是拦截内核发放:
; 在M2选项中关闭自动发经验,完全由脚本控制
; 或者使用引擎专用命令:SETEXP * 2
; 若引擎不支持动态计算,可采用以下变通法:
ELSESACT
; 正常流程
BREAK

针对通用性最强的写法(适用于大部分单机版本):
在QFunction.txt的[@KillMonster]中:
[@KillMonster]
IF
CHECKVAR GLOBAL OnDoubleExp = 1
ACT
CALC H10 * 2
GIVEEXP
; 前提是屏蔽了默认经验获取,或者GIVEEXP是额外赠送
; 最稳妥方式:在M2 -> 选项 -> 参数设置 -> 其他
; 找到“杀怪经验倍数”,设置为1
; 然后在脚本中:
IF
CHECKVAR GLOBAL OnDoubleExp = 1
ACT
GIVEEXP
; 这样总共就是2倍(系统1倍+脚本送1倍)
BREAK

第四步:盛大庄园小地图代码查询。
盛大原版庄园地图通常包含多个小地图,代码并非固定不变,取决于服务端作者的制作。常见庄园相关地图代码如下:
庄园大厅:600 或 800系列
庄园小地图(种植区):通常在601-610之间,或801-810。
具体代码需查看D:MirServerMir200EnvirMapInfo.txt文件。搜索关键词“庄园”、“Farm”、“Manor”。
例如:
600 庄园大厅
601 庄园东区
602 庄园西区
若文件中无记载,说明该服务端未制作庄园地图,需自行从其他完整端复制.map文件和MapInfo配置。不要盲目尝试代码,必须以MapInfo.txt为准。

第五步:M2控制台关键设置。
启动M2Server,点击“管理”->“脚本设置”。
找到“定时器”选项卡,勾选“启用”,设置执行脚本为QManage.txt,段落标签为[@Timer],时间间隔设为1000(毫秒)。
点击“保存/加载”使设置生效。
验证变量:在游戏中输入命令@CheckVar Global G10,查看当前剩余秒数,确认脚本是否在运行。

第六步:测试与调试。
登录游戏,服用“双倍经验丹”。观察是否收到“获得30分钟”提示。输入@CheckVar Global G10,应显示1800左右。杀一只怪,观察经验获取是否为两倍(对比未吃药时)。等待1分钟,G10应减少60。关闭客户端重新登录,再次检查G10,数值应继续递减,证明状态已持久化。若死亡,G10数值不应变化,因为脚本中未对死亡事件做清零处理。

注意事项:
变量名G10和OnDoubleExp可自定义,但全文需统一。
若服务端重启,内存变量G10会清零。若需重启也保留,需在登录脚本[@Login]中读取数据库保存的时间字段,或每次上线检查最后一次下线时间差(较复杂,单机通常不需要)。
确保QFunction.txt和QManage.txt语法正确,无多余空格或非法字符,否则M2日志会报错导致脚本不执行。
物品必须在数据库中正确设置,确保能触发QFunction中的[@物品名]事件。

通过以上步骤,即可完美实现一个死亡不掉、下线保留、持续计时的双倍经验药物系统。核心在于全局变量的巧妙运用与定时器脚本的精准配合。