当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇攻城结束自动奖励脚本实现方法详解

热度:
实现攻城结束5分钟后沙城主自动领取奖励并触发全服公告,需要编写三个关联的脚本模块:主控制脚本、奖励发放NPC脚本、全服公告触发脚本。以下是详细实现步骤和完整代码示例。

主控制脚本放在QManage.txt中,用于检测攻城状态和计时。脚本每5秒检测一次,当检测到攻城战结束且达到5分钟延迟后,自动调用奖励发放流程。关键命令CHECKCASTLEWAR用于判断攻城状态,AFTERATTACKMIN记录战后时间。

完整主控制脚本代码如下:

[@OnTimer5]
#IF
CHECKCASTLEWAR
#ACT
BREAK
#IF
EQUALAFTERATTACKMIN0
#ACT
MOVAFTERATTACKMIN1
SENDMSG0“沙巴克攻城战刚刚结束,五分钟后将发放城主奖励!”
BREAK
#IF
SMALLAFTERATTACKMIN300
#ACT
INCAFTERATTACKMIN5
BREAK
#IF
LARGEAFTERATTACKMIN299
#ACT
MOVAFTERATTACKMIN0
Gmexecute开始提问@沙城奖励发放
BREAK

这段脚本放置在QManage.txt的计时器部分。CHECKCASTLEWAR检测攻城是否正在进行,若正在进行则中断脚本。EQUALAFTERATTACKMIN0检测计时变量是否为0,表示攻城刚结束,设置变量为1并发送预备公告。SMALLAFTERATTACKMIN300检测计时是否少于300秒(5分钟),未达到则每次增加5秒。LARGEAFTERATTACKMIN299检测计时是否达到300秒,触发后重置变量并执行GM命令开始奖励发放。

奖励发放NPC脚本独立创建文件,负责处理具体的奖励发放逻辑。该脚本需要放在服务端的NPC脚本目录中,通常为Envir\Market_Def\。脚本首先获取当前沙巴克行会信息,然后找出该行会的正副会长(即两名沙城主),最后向这两名玩家发送奖励领仍话框。

奖励发放NPC脚本代码如下:

[@沙城奖励发放]
#IF
#ACT
GetCastleHumanList沙巴克
MOVS1<$OUTPUTSTR>
MOVRP1<$HUMANCOUNT>
#IF
LARGEP10
#ACT
GetListStringS10
GOTO@发送奖励窗口
BREAK
#IF
LARGEP11
#ACT
GetListStringS11
GOTO@发送奖励窗口
BREAK
#IF
#ACT
BREAK

[@发送奖励窗口]
#IF
ISADMIN
#ACT
BREAK
#IF
#ACT
SENDMSG7“恭喜您作为沙巴克城主,获得了本次攻城战的胜利奖励!”
#CALL[\功能\沙城奖励.txt]@奖励窗口
BREAK

GetCastleHumanList命令获取占领沙巴克的行会成员列表,结果存入S1变量。MOVRP1<$HUMANCOUNT>获取行会成员数量。LARGEP10和LARGEP11分别判断是否有至少一名和两名成员,通过GetListString获取列表中第一和第二位玩家(通常为正副会长)。ISADMIN检查是否为管理员,避免给GM发奖励。SENDMSG7向玩家发送私聊提示,最后调用专门的奖励窗口脚本。

奖励窗口脚本文件为沙城奖励.txt,放置在\功能\目录下。该脚本定义奖励内容并处理领取逻辑。

奖励窗口脚本代码如下:

[@奖励窗口]
#IF
#ACT
OPENMERCHANTBIGDLG14790105050
#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
MOVG881
SENDMSG0“玩家【<$USERNAME>】成功领取了沙巴克城主奖励,获得了50000元宝和专属称号!”
SENDMSG0“恭喜沙巴克行会【<$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调用称号系统和装备系统发放时限奖励。MOVG881设置全局变量,可用于其他脚本判断奖励已发放。SENDMSG0发送两条全服公告,第一条针对领取玩家,第二条针对胜利行会。GMexecute命令触发全服彩色公告。

全服彩色公告脚本需要单独创建,被GMexecute命令调用。该脚本实现彩色字体在屏幕上移动的公告效果。

全服彩色公告脚本代码如下:

[@全服彩色公告]
#IF
#ACT
SENDMOVINGMSG02531350“════════════════════════════════════════”
SENDMOVINGMSG02501350“【系统公告】玩家【%s】成功领取沙巴克城主至尊奖励!”
SENDMOVINGMSG02541350“════════════════════════════════════════”
SENDMOVINGMSG02501350“感谢全体参战行会的激情角逐,下次攻城战再见!”
SENDMOVINGMSG02531350“════════════════════════════════════════”
BREAK

SENDMOVINGMSG命令发送滚动屏幕的彩色公告,参数依次为:0(全服可见)、颜色代码(253为粉色,250为红色,254为黄色)、1(从右向左移动)、350(移动速度,数值越小越快)。%s会被替换为传递的参数,即<$USERNAME>城主名称。多条消息形成公告框效果,首尾为装饰线,中间为具体公告内容。

计时器初始化和变量声明需放在QManage.txt开头部分。在[@Login]段添加计时器启动命令,并初始化相关变量。

初始化脚本代码如下:

[@Login]
#IF
#ACT
SETONTIMER55
MOVAFTERATTACKMIN0

SETONTIMER55表示每5秒执行一次编号为5的计时器,对应前面的[@OnTimer5]段。MOVAFTERATTACKMIN0初始化计时变量为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秒,快速验证整个流程。
[顶部]