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

传奇攻城奖励脚本实现沙城主领奖励与全服提示设置教程

热度:
传奇攻城战结束后,精准发放沙城主奖励并触发全服提示,是提升玩法粘性的关键。脚本需实现三大核心:攻城结束5分钟倒计时、沙城主自动弹奖励对话框、领取后全服彩色提示。以下分GOM、HeroM2两大主流引擎,详解完整实现流程,包含指令代码与参数说明。

一、核心逻辑:脚本如何实现“时间管控+身份识别+全服推送”

该脚本的运行闭环由四个关键模块构成,环环相扣确保功能精准触发:

1.时间触发模块:以“攻城战结束时间”为基准,启动5分钟倒计时,倒计时结束后触发后续功能,避免过早或过晚推送奖励;2.身份识别模块:精准定位两名沙城主(通常为城主与副城主),排除普通玩家,确保奖励只推送给指定角色;3.交互对话框模块:向沙城主弹出可视化领取窗口,包含奖励明细,支持“确认领取”“稍后领取”操作;4.全服消息模块:在城主点击领取后,立即向所有在线玩家推送彩色提示,同步奖励发放信息。

整个过程无需人工干预,脚本通过引擎指令自动完成“计时-识身份-弹窗口-发消息”,且能应对“城主离线”“重复领取”等异常场景。

二、实现前必备:工具、参数与核心指令储备

无论哪种引擎,前期准备都围绕“工具适配+参数精准”展开,这是脚本稳定运行的基础,缺一不可。

1.专属工具选择

优先使用对应引擎的脚本工具:GOM引擎用“GOM脚本编辑器”,自带沙城相关指令库与对话框可视化编辑功能;HeroM2引擎用“HeroM2脚本调试器”,支持沙城主身份快速校验。辅助工具需准备“地图信息查询器”(查沙城地图编号)、“物品ID数据库”(查奖励物品ID)、“引擎日志查看器”(调试时排查错误)。

2.必查核心参数

提前整理四类关键参数,建议用表格记录:

-时间与地图参数:攻城战固定结束时间(如22:00)、沙巴克地图编号(通常为3553,从MapInfo.txt查询)、倒计时时长(300秒=5分钟);

-身份标识参数:沙城主身份变量(GOM为$SandOwner,HeroM2为%SandLord%)、副城主身份变量(GOM为$SandViceOwner,HeroM2为%SandViceLord%);

-奖励与界面参数:奖励物品ID(如屠龙刀3013、元宝1001)及数量、对话框标题(如“沙城主专属奖励”)、对话框按钮文字(如“立即领取”“稍后领取”);

-消息参数:全服提示彩色代码(红色为255,黄色为250,绿色为0)、消息发送频道(通常为6号公共频道)。

3.多引擎通用核心指令

掌握6个核心指令即可搭建基础框架:一是“时间判断指令”(CheckTime/CheckServerTime),用于触发倒计时结束事件;二是“身份校验指令”(CheckSandLord/CheckSandOwner),识别沙城主;三是“对话框指令”(OpenDialog/#GOM_OpenDialog),弹出领取窗口;四是“物品发放指令”(GiveItem/#GOM_GiveItem),发放奖励;五是“全服消息指令”(SendAllMsg/#GOM_SendAllMsg),推送彩色提示;六是“状态标记指令”(SetVar/#GOM_SetVar),防止重复领取。

三、分引擎实操:完整脚本代码与步骤拆解

以“攻城22:00结束,5分钟后(22:05)触发奖励,城主领取后全服弹红色提示”为例,分引擎编写脚本,代码标注详细注释,新手可直接替换参数使用。

场景一:GOM引擎——完整实现脚本(含异常处理)

GOM引擎需分“全局计时脚本”“城主奖励脚本”“全服消息脚本”三部分,分别实现计时、发奖、推送功能。

1.全局计时脚本(控制5分钟倒计时)

作用:以攻城结束时间为基准,5分钟后触发奖励推送,添加到服务器全局脚本文件(QFunction-0.txt):

#TIMER60;每60秒扫描一次时间,平衡性能与精准度
#IF
CheckTime22:05:0022:05:30;时间窗口设为30秒,确保城主离线也能后续触发
CheckSandWarEnd;验证攻城战已结束(GOM专属指令)
#ACT
;调用沙城主奖励脚本,触发对话框
CallSub沙城主奖励推送;执行自定义的奖励推送子程序
#ENDIF

;定义沙城主奖励推送子程序
Sub沙城主奖励推送
#IF
;检测沙城主是否在线
CheckPlayerOnline$SandOwner;$SandOwner为GOM沙城主角色名变量
#ACT
;向城主弹出奖励领仍话框(标题+内容+按钮)
#GOM_OpenDialog沙城主奖励1;1代表对话框类型(确认/取消)
#GOM_DialogTitle沙巴克城主专属奖励;对话框标题
#GOM_DialogContent恭喜您夺得沙巴克!奖励:屠龙刀x1元宝x1000点击领取;奖励说明
#GOM_DialogBtn立即领取稍后领取;两个按钮
#GOM_DialogBind领取奖励回调;绑定按钮点击后的执行子程序
#ELSE
;城主离线,记录状态,下次上线触发
#GOM_SetVar城主奖励未领1;设置变量标记未领奖励
#ENDIF

;检测副城主是否在线,逻辑同城主
#IF
CheckPlayerOnline$SandViceOwner
#ACT
#GOM_OpenDialog沙城主奖励1
#GOM_DialogTitle沙巴克副城主专属奖励
#GOM_DialogContent恭喜您助力夺得沙巴克!奖励:裁决之杖x1元宝x500点击领取
#GOM_DialogBtn立即领取稍后领取
#GOM_DialogBind领取奖励回调
#ELSE
#GOM_SetVar副城主奖励未领1
#ENDIF
Return;结束子程序

2.领取奖励与全服提示回调脚本

作用:城主点击“立即领取”后,发放奖励并触发全服提示,添加在同一文件中:

;领取奖励回调子程序(与对话框绑定的函数)
Sub领取奖励回调
#IF
;判断点击的是“立即领取”按钮(按钮序号1)
#GOM_GetDialogBtn1
;验证当前角色是沙城主或副城主
CheckSandLord||CheckSandViceLord;||代表“或”逻辑
;检查是否已领取(防重复)
#GOM_CheckVar奖励已领0;0代表未领取
#ACT
;发放城主奖励(根据身份判断发放不同奖励)
#IF
CheckSandLord;当前是城主
#ACT
#GOM_GiveItem30131;发放屠龙刀(ID3013)x1
#GOM_GiveItem10011000;发放元宝(ID1001)x1000
;全服推送红色提示(频道6颜色255内容)
#GOM_SendAllMsg625500【沙城喜讯】恭喜玩家{$SandOwner}夺得沙巴克,领取专属奖励屠龙刀x1!;彩色字体
#ELSE
;当前是副城主
#GOM_GiveItem30141;发放裁决之杖(ID3014)x1
#GOM_GiveItem1001500;发放元宝x500
#GOM_SendAllMsg625500【沙城喜讯】恭喜玩家{$SandViceOwner}助力夺沙,领取专属奖励裁决之杖x1!
#ENDIF
;标记为已领取,防止重复
#GOM_SetVar奖励已领1
;关闭对话框
#GOM_CloseDialog
#ELSE
;点击“稍后领取”按钮(按钮序号2)
#GOM_GetDialogBtn2
#ACT
#GOM_CloseDialog
#GOM_SendMsg625500奖励已为您保留,可通过沙巴克管理员NPC再次领取;单独提示城主
#ENDIF
Return

3.离线城主上线补推脚本

作用:确保离线的城主上线后能收到奖励提示,添加在角色登录脚本(Login.txt):

#IF
;检测当前角色是城主且有未领奖励
CheckSandLord
#GOM_CheckVar城主奖励未领1
#ACT
#GOM_OpenDialog沙城主奖励1
#GOM_DialogTitle未领取的沙城奖励
#GOM_DialogContent您有一份沙城主奖励待领取,点击立即领取
#GOM_DialogBtn立即领取取消
#GOM_DialogBind领取奖励回调
#GOM_SetVar城主奖励未领0;清空标记

#IF
;副城主上线补推逻辑
CheckSandViceLord
#GOM_CheckVar副城主奖励未领1
#ACT
#GOM_OpenDialog沙城主奖励1
#GOM_DialogTitle未领取的沙城奖励
#GOM_DialogContent您有一份沙城副城主奖励待领取
#GOM_DialogBtn立即领取取消
#GOM_DialogBind领取奖励回调
#GOM_SetVar副城主奖励未领0
#ENDIF

场景二:HeroM2引擎——核心功能实现脚本

HeroM2引擎指令格式不同,但逻辑一致,重点替换身份校验与对话框指令:

1.计时与奖励推送脚本

#TIMER60
#IF
CheckServerTime22:05:0022:05:30;HeroM2时间判断指令
SandWarEnd;HeroM2验证攻城结束指令
#ACT
Call沙城主奖励推送
#ENDIF

;子程序:沙城主奖励推送
沙城主奖励推送:
#IF
;HeroM2沙城主身份变量为%SandLord%
PlayerOnline%SandLord%
#ACT
;HeroM2弹出对话框指令(参数:标题|内容|按钮1|按钮2|回调函数)
OpenDialog沙城主奖励|恭喜夺沙!奖励:屠龙刀x1元宝x1000|立即领取|稍后领取|OnRewardGet
#ELSE
SetVarH%SandLord%_Reward1;用角色名前缀标记未领奖励
#ENDIF

#IF
PlayerOnline%SandViceLord%;副城主变量
#ACT
OpenDialog沙城副奖励|恭喜助力夺沙!奖励:裁决x1元宝x500|立即领取|稍后领取|OnRewardGet
#ELSE
SetVarH%SandViceLord%_Reward1
#ENDIF
Return

2.领取与全服提示脚本

;回调函数:处理领取操作
OnRewardGet:
#IF
;判断按钮(HeroM2用$DialogBtn获取,1为按钮1,2为按钮2)
$DialogBtn=1
CheckSandLord;当前是城主
VarH%UserName%_Reward<=1;未领取标记
#ACT
GiveItem30131;发屠龙刀
GiveItem10011000;发元宝
;全服红色提示(HeroM2彩色代码用“<color=255>”)
SendAllMsg6<color=255>【沙城喜讯】恭喜%SandLord%夺得沙巴克,领取屠龙刀奖励!</color>
SetVarH%UserName%_Reward2;标记已领取
CloseDialog
#ELSEIF
$DialogBtn=1
CheckSandViceLord;当前是副城主
VarH%UserName%_Reward<=1
#ACT
GiveItem30141;发裁决
GiveItem1001500;发元宝
SendAllMsg6<color=255>【沙城喜讯】恭喜%SandViceLord%助力夺沙,领取裁决奖励!</color>
SetVarH%UserName%_Reward2
CloseDialog
#ELSE
;点击稍后领取
$DialogBtn=2
#ACT
CloseDialog
SendMsg625500奖励已保留,可通过沙巴克NPC领取
#ENDIF
Return

四、异常处理与脚本调试技巧

1.关键异常场景解决方案

-城主离线未领:通过“角色变量标记”(如GOM的#GOM_SetVar)记录状态,登录时检测变量触发对话框,避免奖励遗漏;

-重复领取漏洞:添加“已领取变量”,领取后将变量设为1,再次触发时校验变量,防止多领;

-攻城结束时间波动:若攻城提前或延后结束,将“固定时间判断”改为“攻城结束时间+300秒”,GOM用#GOM_GetSandWarEndTime获取结束时间,HeroM2用%SandWarEndTime%变量;

-奖励发放失败:在发放指令后添加“物品检测”,如GOM的#GOM_CheckItem30131,若未检测到物品,自动重新发放并记录日志。

2.脚本调试三步法

第一步:语法调试,用引擎脚本编辑器的“语法检查”功能,修正“缺少Return”“变量错误”等问题;第二步:模拟测试,将攻城结束时间改为当前时间+5分钟,用测试账号担任城主,观察对话框是否按时弹出;第三步:真机测试,组织2名测试玩家分别当城主、副城主,攻城结束后等待5分钟,点击领取后检查奖励是否到账、全服提示是否正常显示。

五、常见问题速查与适配技巧

1.对话框不弹出?检查沙城主身份变量是否正确,GOM在“沙巴克设置”中确认$SandOwner赋值,HeroM2通过“沙城管理”面板刷新%SandLord%变量;

2.全服提示无颜色?GOM彩色通过“SendAllMsg6颜色值00”控制(红色255、黄色250),HeroM2需用“<color=颜色值>内容</color>”包裹;

3.奖励发放重复?确保“已领取变量”在发放后正确赋值,且每次触发前都校验变量状态;

4.跨版本适配?复古版传奇需简化对话框样式,用“NPC对话”替代可视化窗口,在沙巴克管理员NPC脚本中添加“领取沙城奖励”选项,逻辑与弹窗一致。

该脚本的核心是“精准的时间与身份双重校验”,无论哪种引擎,都需确保计时模块稳定、身份识别准确。新手可先搭建基础框架,测试时间触发与奖励发放功能,再逐步添加异常处理与全服提示。若需适配特定版本或增加“奖励记录日志”功能,可根据实际需求补充指令。
[顶部]