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

来源: 作者: 点击:
传奇攻城战结束后,精准发放沙城主奖励并触发全服提示,是提升玩法粘性的关键。脚本需实现三大核心:攻城结束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):

#TIMER 60 ;每60秒扫描一次时间,平衡性能与精准度
#IF
CheckTime 22:05:00 22: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_GetDialogBtn 1
; 验证当前角色是沙城主或副城主
CheckSandLord || CheckSandViceLord ;||代表“或”逻辑
; 检查是否已领取(防重复)
#GOM_CheckVar 奖励已领 0 ;0代表未领取
#ACT
; 发放城主奖励(根据身份判断发放不同奖励)
#IF
CheckSandLord ;当前是城主
#ACT
#GOM_GiveItem 3013 1 ;发放屠龙刀(ID3013)x1
#GOM_GiveItem 1001 1000 ;发放元宝(ID1001)x1000
; 全服推送红色提示(频道6 颜色255 内容)
#GOM_SendAllMsg 6 255 0 0 【沙城喜讯】恭喜玩家{$SandOwner}夺得沙巴克,领取专属奖励屠龙刀x1! ;彩色字体
#ELSE
; 当前是副城主
#GOM_GiveItem 3014 1 ;发放裁决之杖(ID3014)x1
#GOM_GiveItem 1001 500 ;发放元宝x500
#GOM_SendAllMsg 6 255 0 0 【沙城喜讯】恭喜玩家{$SandViceOwner}助力夺沙,领取专属奖励裁决之杖x1!
#ENDIF
; 标记为已领取,防止重复
#GOM_SetVar 奖励已领 1
; 关闭对话框
#GOM_CloseDialog
#ELSE
; 点击“稍后领取”按钮(按钮序号2)
#GOM_GetDialogBtn 2
#ACT
#GOM_CloseDialog
#GOM_SendMsg 6 255 0 0 奖励已为您保留,可通过沙巴克管理员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. 计时与奖励推送脚本

#TIMER 60
#IF
CheckServerTime 22:05:00 22:05:30 ;HeroM2时间判断指令
SandWarEnd ;HeroM2验证攻城结束指令
#ACT
Call 沙城主奖励推送
#ENDIF

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

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

2. 领取与全服提示脚本

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

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

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

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

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

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

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

2. 脚本调试三步法

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

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

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

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

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

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

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