想实现双击金栗子后物品消失、全服公告、获得双倍攻击状态,核心是三个部分的配合:数据库设置双击触发物品、QF里写双击触发段、以及双倍攻击的实现方式。给力引擎里实现这个需求,不需要改后台,也不需要动装备属性,纯靠脚本就能搞定。下面一步步拆开写清楚。
**一、数据库设置金栗子双击触发**
打开M2的物品数据库,新增或者找一个现成的物品比如金栗子。需要设置的字段:
StdMode:设置为2,代表是药品类或者可双击使用的物品。
Shape:设置为0,普通药品不设置特殊形状。
AniCount:设置为100或101,代表双击触发QF里的[@StdModeFuncX]段。X就是AniCount的值,比如AniCount填100,双击就会触发[@StdModeFunc100]。
Source:可以留空,或者填0。
其他字段比如重量、外观、名字按正常填就行。
保存后物品就有了双击触发的基础。双击金栗子时,系统会自动去QF里找[@StdModeFunc100]这个段来执行。
**二、QF里写双击触发公告和双倍效果**
打开QFunction-0.txt,在最下面新建一个段,段名就是[@StdModeFunc100],对应数据库里AniCount的值。
先写一个基础框架:
[@StdModeFunc100]
#ACT
take 金栗子 1 拿走一个金栗子
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
GmExeCute 双倍攻击 开始 30 给当前玩家开启双倍攻击30分钟
break
这里SENDMSG发了两次全服公告,确保所有人能看到。GmExeCute是给力引擎的GM执行命令,具体双倍攻击的写法要根据你用的引擎来定。
**三、给力引擎实现双倍攻击的几种方式**
不同版本给力引擎支持的双倍攻击命令不一样,下面列出几种常见写法:
**方式一:GmExeCute命令法**
GmExeCute 双倍攻击 开始 30 开启30分钟双倍攻击
GmExeCute 双倍攻击 结束 关闭双倍攻击
**方式二:ChangeModeEx命令法**
ChangeModeEx 10 30 给当前玩家增加30分钟状态,10代表双倍攻击模式
**方式三:PowerRate命令法**
PowerRate 200 1800 设置攻击力倍率为200%,持续1800秒(30分钟)
**方式四:AddFunStatus命令法**
AddFunStatus 4 30 增加功能状态,4代表双倍攻击,30代表分钟
拿不准用哪个命令的,打开M2的命令帮助搜Double或者PowerRate,看引擎支持哪个。
**四、完整版带冷却和状态提示的脚本**
上面基础框架能跑通,但还有细节要处理:防止连续双击刷状态、双击时给玩家提示剩余时间、下线后状态是否保留等。
加冷却和提示的完整写法:
[@StdModeFunc100]
#IF
CheckCoolDown 双倍攻击 1800 检测冷却时间,如果上次使用到现在超过1800秒(30分钟)才允许使用
#ACT
take 金栗子 1
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
ChangeModeEx 10 30
SetCoolDown 双倍攻击 1800 设置冷却时间,1800秒内不能再次使用
GuildNoticeMsg 255 0 你获得了双倍攻击效果,持续30分钟!
#ELSEACT
MESSAGEBOX 双倍攻击效果还在冷却中,请等待<$STR(N1)>分钟后再使用。
break
这里CheckCoolDown和SetCoolDown是给力引擎的冷却命令,没有的话可以用变量自己写时间控制。
**五、用变量实现状态持续和下线上线保留**
如果想让双倍攻击下线不消失,或者下线后重新上线还能继续计时,要用变量存开始时间。
QF里双击触发段写成这样:
[@StdModeFunc100]
#ACT
take 金栗子 1
GetTime 秒数 N1 获取当前时间秒数存入N1
Calc N1 + 1800 当前时间加1800秒(30分钟)得到结束时间
mov U40 <$STR(N1)> 存入私人变量U40
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,获得了双倍攻击状态,持续时间30分钟!
ChangeModeEx 10 30
break
然后在QManage.txt的[@Login]段里加检测:
[@Login]
#IF
large U40 <$STR(N1)> 如果U40大于当前时间,说明状态还在
#ACT
ChangeModeEx 10 <$STR(U40)> 开启双倍攻击直到U40时间结束
#ELSEACT
mov U40 0 状态过期就清空变量
这样下线再上线,只要时间没到,双倍攻击自动续上。
**六、公告显示玩家名字和剩余时间**
想让全服公告更详细,比如显示谁吃了、剩几分钟,可以这样写:
[@StdModeFunc100]
#ACT
take 金栗子 1
GetTime 秒数 N1
Calc N1 + 1800
mov U40 <$STR(N1)>
ChangeModeEx 10 30
GetTime 秒数 N2
Calc U40 - <$STR(N2)> 计算剩余秒数
Div <$STR(U40)> 60 剩余秒数除以60得到分钟
mov N3 <$STR(计算结果)> 存入N3
SENDMSG 0 玩家<$USERNAME>吃下金栗子获得双倍攻击,剩余时间<$STR(N3)>分钟!
SENDMSG 0 玩家<$USERNAME>吃下金栗子获得双倍攻击,剩余时间<$STR(N3)>分钟!
break
计算剩余分钟这里用了Div,实际写法要看引擎支持的数学运算命令。
**七、不同物品触发不同时长**
想做多个物品,比如小金栗子10分钟、大金栗子60分钟,在QF里写多个段就行。
数据库里小金栗子AniCount填101,大金栗子填102。
QF里:
[@StdModeFunc101]
#ACT
take 小金栗子 1
ChangeModeEx 10 10
SENDMSG 0 <$USERNAME>吃了小金栗子,双倍攻击10分钟!
break
[@StdModeFunc102]
#ACT
take 大金栗子 1
ChangeModeEx 10 60
SENDMSG 0 <$USERNAME>吃了大金栗子,双倍攻击60分钟!
break
**八、触发时播放特效和音效**
想让吃金栗子更有仪式感,加特效和声音:
[@StdModeFunc100]
#ACT
take 金栗子 1
ChangeModeEx 10 30
ADDSKILLEFFECT 自己 3 给自己加特效
PLAYSOUND 吃物品.wav 播放音效
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,浑身散发出金色光芒!
SENDMSG 0 玩家<$USERNAME>吃下了金栗子,浑身散发出金色光芒!
break
ADDSKILLEFFECT的命令参数要查自己M2的特效编号表。
**九、防止双倍攻击状态叠加**
如果玩家连续吃两个金栗子,状态会叠加吗?不想叠加的话要加检测。
[@StdModeFunc100]
#IF
CheckModeEx 10 检测是否已经有双倍攻击状态
#ACT
MESSAGEBOX 你已经拥有双倍攻击效果,不能重复使用!
break
#ELSEACT
take 金栗子 1
ChangeModeEx 10 30
SENDMSG 0 <$USERNAME>吃下金栗子获得双倍攻击!
break
CheckModeEx是检测状态命令,10代表检测双倍攻击类型。
**十、完整脚本示例**
把上面所有功能整合成一个完整脚本:
;=========QFunction-0.txt=========
[@StdModeFunc100]
#IF
CheckModeEx 10
#ACT
MESSAGEBOX 你已经拥有双倍攻击效果,请等待效果结束再使用!
break
#IF
CheckCoolDown 金栗子 1800
#ACT
take 金栗子 1
GetTime 秒数 N1
Calc N1 + 1800
mov U40 <$STR(N1)>
ChangeModeEx 10 30
SetCoolDown 金栗子 1800
ADDSKILLEFFECT 自己 3
PLAYSOUND 吃物品.wav
GetTime 秒数 N2
Calc U40 - <$STR(N2)>
Div <$STR(U40)> 60
mov N3 <$STR(计算结果)>
SENDMSG 0 玩家<$USERNAME>吃下金栗子获得双倍攻击,剩余时间<$STR(N3)>分钟!
SENDMSG 0 玩家<$USERNAME>吃下金栗子获得双倍攻击,剩余时间<$STR(N3)>分钟!
SENDMSG 6 你获得了双倍攻击效果,持续30分钟!
#ELSEACT
MESSAGEBOX 金栗子效果还在冷却中,请稍后再试。
break
;=========QManage.txt=========
[@Login]
#IF
large U40 <$STR(N1)>
#ACT
GetTime 秒数 N1
Calc U40 - <$STR(N1)>
Div <$STR(U40)> 60
mul <$STR(计算结果)> 60 把分钟转回秒数
mov N2 <$STR(计算结果)>
ChangeModeEx 10 <$STR(N2)>
SENDMSG 6 你的双倍攻击效果还剩<$STR(N2)>秒,已自动续上!
#ELSEACT
mov U40 0
break
**十一、常见问题排查**
**双击金栗子没反应**:检查数据库AniCount填的对不对,QF里有没有对应的[@StdModeFunc段],段名数字必须和AniCount一致。
**双击后物品消失但没公告**:SENDMSG前面可能少了#ACT,或者命令写错。单独加一行SENDMSG 6 测试看有没有提示。
**双倍攻击不生效**:ChangeModeEx命令可能不支持,换成PowerRate或者GmExeCute试。在M2上开个GM号测试命令本身能不能用。
**冷却时间不准**:CheckCoolDown和SetCoolDown的参数单位是秒,1800就是30分钟。用变量自己写时间控制更稳当。
**下线再上线状态没了**:没加QManage的[@Login]检测,或者U40变量没存住。检查U40有没有被其他脚本占用。
这个脚本写完保存,M2上重载QF和QManage,数据库里做好金栗子,进游戏双击测试。能跑通的话全服公告、双倍攻击、冷却控制、下线保留全部实现。

