实现攻城结束5分钟后沙城主自动领取奖励并触发全服公告,需要编写三个关联的脚本模块:主控制脚本、奖励发放NPC脚本、全服公告触发脚本。以下是详细实现步骤和完整代码示例。
主控制脚本放在QManage.txt中,用于检测攻城状态和计时。脚本每5秒检测一次,当检测到攻城战结束且达到5分钟延迟后,自动调用奖励发放流程。关键命令CHECKCASTLEWAR用于判断攻城状态,AFTERATTACKMIN记录战后时间。
完整主控制脚本代码如下:
[@OnTimer5]
#IF
CHECKCASTLEWAR
#ACT
BREAK
#IF
EQUAL AFTERATTACKMIN 0
#ACT
MOV AFTERATTACKMIN 1
SENDMSG 0 “沙巴克攻城战刚刚结束,五分钟后将发放城主奖励!”
BREAK
#IF
SMALL AFTERATTACKMIN 300
#ACT
INC AFTERATTACKMIN 5
BREAK
#IF
LARGE AFTERATTACKMIN 299
#ACT
MOV AFTERATTACKMIN 0
Gmexecute 开始提问 @沙城奖励发放
BREAK
这段脚本放置在QManage.txt的计时器部分。CHECKCASTLEWAR检测攻城是否正在进行,若正在进行则中断脚本。EQUAL AFTERATTACKMIN 0检测计时变量是否为0,表示攻城刚结束,设置变量为1并发送预备公告。SMALL AFTERATTACKMIN 300检测计时是否少于300秒(5分钟),未达到则每次增加5秒。LARGE AFTERATTACKMIN 299检测计时是否达到300秒,触发后重置变量并执行GM命令开始奖励发放。
奖励发放NPC脚本独立创建文件,负责处理具体的奖励发放逻辑。该脚本需要放在服务端的NPC脚本目录中,通常为Envir\Market_Def\。脚本首先获取当前沙巴克行会信息,然后找出该行会的正副会长(即两名沙城主),最后向这两名玩家发送奖励领取对话框。
奖励发放NPC脚本代码如下:
[@沙城奖励发放]
#IF
#ACT
GetCastleHumanList 沙巴克
MOV S1 <$OUTPUTSTR>
MOVR P1 <$HUMANCOUNT>
#IF
LARGE P1 0
#ACT
GetListString S1 0
GOTO @发送奖励窗口
BREAK
#IF
LARGE P1 1
#ACT
GetListString S1 1
GOTO @发送奖励窗口
BREAK
#IF
#ACT
BREAK
[@发送奖励窗口]
#IF
ISADMIN
#ACT
BREAK
#IF
#ACT
SENDMSG 7 “恭喜您作为沙巴克城主,获得了本次攻城战的胜利奖励!”
#CALL [\功能\沙城奖励.txt] @奖励窗口
BREAK
GetCastleHumanList命令获取占领沙巴克的行会成员列表,结果存入S1变量。MOVR P1 <$HUMANCOUNT>获取行会成员数量。LARGE P1 0和LARGE P1 1分别判断是否有至少一名和两名成员,通过GetListString获取列表中第一和第二位玩家(通常为正副会长)。ISADMIN检查是否为管理员,避免给GM发奖励。SENDMSG 7向玩家发送私聊提示,最后调用专门的奖励窗口脚本。
奖励窗口脚本文件为沙城奖励.txt,放置在\功能\目录下。该脚本定义奖励内容并处理领取逻辑。
奖励窗口脚本代码如下:
[@奖励窗口]
#IF
#ACT
OPENMERCHANTBIGDLG 14 790 1 0 50 50
#SAY
<领取沙巴克城主专属奖励:/SCOLOR=250>\ \
<奖励内容:/SCOLOR=253>\ \
<元宝:50000个/SCOLOR=254>\ \
<荣誉点数:1000点/SCOLOR=254>\ \
<专属称号:沙城霸主(7天)/SCOLOR=254>\ \
<特殊装备:城主战袍(30天)/SCOLOR=254>\ \
<领取条件:当前为沙巴克城主/SCOLOR=249>\ \
<注意:奖励仅限攻城结束后5分钟内领取/SCOLOR=249>\ \
<点击下方按钮立即领取!/SCOLOR=250>\ \
<领取奖励/@领取城主奖励> <关闭窗口/@exit>
[@领取城主奖励]
#IF
CHECKCASTLEGUILD <$GUILDNAME>
#ACT
GAMEGOLD + 50000
GAMEPOINT + 1000
#CALL [\功能\称号系统.txt] @添加称号 沙城霸主 7
#CALL [\功能\装备系统.txt] @发放时限装备 城主战袍 30
MOV G88 1
SENDMSG 0 “玩家【<$USERNAME>】成功领取了沙巴克城主奖励,获得了50000元宝和专属称号!”
SENDMSG 0 “恭喜沙巴克行会【<$GUILDNAME>】获得本次攻城战的最终胜利!”
GMexecute 全服触发公告 @全服彩色公告 <$USERNAME>
CLOSE
BREAK
#ELSEACT
MESSAGEBOX “您不符合领取条件,必须为当前沙巴克城主!”
CLOSE
BREAK
OPENMERCHANTBIGDLG命令打开大对话框,参数14为背景图,790为NPC头像,1为显示模式。奖励内容通过#SAY分行显示,使用SCOLOR设置文字颜色。CHECKCASTLEGUILD <$GUILDNAME>验证玩家行会是否为当前沙巴克占领行会。GAMEGOLD + 50000增加50000元宝,GAMEPOINT + 1000增加1000荣誉点。#CALL调用称号系统和装备系统发放时限奖励。MOV G88 1设置全局变量,可用于其他脚本判断奖励已发放。SENDMSG 0发送两条全服公告,第一条针对领取玩家,第二条针对胜利行会。GMexecute命令触发全服彩色公告。
全服彩色公告脚本需要单独创建,被GMexecute命令调用。该脚本实现彩色字体在屏幕上移动的公告效果。
全服彩色公告脚本代码如下:
[@全服彩色公告]
#IF
#ACT
SENDMOVINGMSG 0 253 1 350 “════════════════════════════════════════”
SENDMOVINGMSG 0 250 1 350 “【系统公告】玩家【%s】成功领取沙巴克城主至尊奖励!”
SENDMOVINGMSG 0 254 1 350 “════════════════════════════════════════”
SENDMOVINGMSG 0 250 1 350 “感谢全体参战行会的激情角逐,下次攻城战再见!”
SENDMOVINGMSG 0 253 1 350 “════════════════════════════════════════”
BREAK
SENDMOVINGMSG命令发送滚动屏幕的彩色公告,参数依次为:0(全服可见)、颜色代码(253为粉色,250为红色,254为黄色)、1(从右向左移动)、350(移动速度,数值越小越快)。%s会被替换为传递的参数,即<$USERNAME>城主名称。多条消息形成公告框效果,首尾为装饰线,中间为具体公告内容。
计时器初始化和变量声明需放在QManage.txt开头部分。在[@Login]段添加计时器启动命令,并初始化相关变量。
初始化脚本代码如下:
[@Login]
#IF
#ACT
SETONTIMER 5 5
MOV AFTERATTACKMIN 0
SETONTIMER 5 5表示每5秒执行一次编号为5的计时器,对应前面的[@OnTimer5]段。MOV AFTERATTACKMIN 0初始化计时变量为0。
脚本放置位置总结:主控制模块放入QManage.txt的计时器部分,奖励发放NPC脚本保存为单独文件如“沙城奖励发放.txt”放入NPC目录,奖励窗口脚本保存为“沙城奖励.txt”放入\功能\目录,全服公告脚本可放入QFunction-0.txt或单独文件。
关键命令解释:CHECKCASTLEWAR检测沙巴克攻城战是否正在进行,返回真表示攻城战中。GETCASTLEHUMANLIST获取占领沙巴克的行会成员列表。SENDMOVINGMSG发送全服滚动彩色公告,颜色代码250为红色,253为粉色,254为黄色。OPENMERCHANTBIGDLG打开大对话框用于奖励展示。GAMEGOLD增加元宝,GAMEPOINT增加游戏点数。
脚本执行流程:攻城结束瞬间,计时器检测到CHECKCASTLEWAR为假,开始计时。5分钟后触发Gmexecute命令调用奖励发放脚本。奖励发放脚本获取沙巴克行会名单,向正副会长发送奖励窗口。玩家点击领取后验证身份,发放奖励并触发全服彩色公告。
注意事项:确保所有命令与引擎兼容,GEE/GOM引擎支持上述命令。颜色代码和对话框图片编号根据客户端补丁调整。奖励内容可根据需求修改,增加装备、材料等。全服公告内容可自定义,但需控制长度避免刷屏。测试时先降低计时器时间为10秒,快速验证整个流程。

