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

传奇攻城结束沙城主奖励脚本实现:弹窗领取与全服提示方案

热度:
传奇攻城玩法中,沙城主奖励发放是提升玩家参与度的关键环节。实现“攻城结束5分钟后沙城主弹窗领奖励,领取后全服彩色提示”的脚本,需精准把控时间触发、身份判定、交互反馈三大核心,以下是完整实现逻辑与细节。

脚本实现的核心逻辑框架

该脚本需串联“攻城结束事件捕获-延时触发机制-沙城主身份校验-弹窗生成-奖励发放-全服通知”六大环节,各环节环环相扣,确保功能稳定生效。核心逻辑可概括为:以攻城结束为起点,通过延时命令触发后续流程,精准定位两名沙城主并推送弹窗,领取操作完成后触发全服彩色消息广播。

脚本开发需依托传奇服务端主流引擎(如GOM、GEE、HERO)的基础命令,不同引擎核心命令语法一致,仅部分辅助命令存在差异,下文以通用语法为例,适配多数服务端环境。

关键技术点拆解与实现方法

1.攻城结束事件捕获:脚本触发的起点

脚本需先精准捕获“攻城战结束”这一核心事件,传奇服务端引擎均内置专属事件命令,无需额外开发监听模块。核心命令为“OnSiegeEnd”,该命令会在攻城战系统判定结束后自动触发,是整个脚本的启动开关。

需注意,攻城结束的判定由服务端系统控制(如规定时间到、城堡旗帜被占领等),脚本仅需绑定该事件即可,无需干预判定逻辑。事件绑定后,脚本会在攻城结束瞬间进入待执行状态,等待后续延时命令触发。

2.5分钟延时控制:精准触发弹窗的核心

攻城结束后并非立即弹窗,需设置5分钟(300秒)延时,避免攻城刚结束时的混乱场景影响奖励领取。实现延时需使用引擎的“Delay”命令,该命令可让脚本在指定秒数后执行后续代码,且不影响服务端其他进程运行。

使用“Delay”命令时需注意两点:一是命令后需紧跟具体秒数(300秒对应5分钟),二是延时后执行的代码需用“Begin”和“End”包裹,形成独立代码块,确保延时逻辑不与其他代码冲突。示例逻辑如下:

;攻城结束事件绑定
OnSiegeEnd
;输出攻城结束提示(仅管理员可见)
SendMsg1攻城战已结束,5分钟后将为沙城主推送奖励领取弹窗
;设置5分钟(300秒)延时
Delay300
Begin
;延时后执行的沙城主奖励逻辑
...
End
EndOnSiegeEnd

3.沙城主身份判定:精准定位奖励对象

脚本需准确识别两名沙城主(通常为城堡占领行会的会长与指定副会长),核心依赖引擎的“CheckCastleLord”身份校验命令与“GetGuildMember”行会成员获取命令。判定逻辑分两步:先获取占领沙巴克的行会ID,再从该行会中筛选出符合条件的沙城主。

第一步,通过“GetCastleOwner”命令获取占领沙巴克的行会ID,该命令返回值为行会唯一标识;第二步,使用“LoopGuildMember”循环遍历该行会成员,结合“CheckCastleLord”命令判断成员是否为沙城主,符合条件则记录其角色ID,用于后续弹窗推送。

需特别注意,部分服务端支持自定义沙城主数量(如1-3名),脚本中需通过“GetCastleLordCount”命令获取当前配置的沙城主数量,确保不遗漏或误判奖励对象。完整判定逻辑示例:

;获取占领沙巴克的行会ID
CastleGuildID=GetCastleOwner()
;若无人占领(返回0),则终止脚本
IfCastleGuildID=0Then
SendMsg1沙巴克无占领行会,奖励发放脚本终止
Return
EndIf
;获取沙城主数量(此处以2名为例)
LordCount=GetCastleLordCount()
;定义数组存储沙城主角色ID
DimLordList[LordCount]
;循环遍历行会成员,筛选沙城主
LoopGuildMemberCastleGuildID
;判断当前成员是否为沙城主
IfCheckCastleLordCurrentMemberID=1Then
;将沙城主ID存入数组
LordList[Index]=CurrentMemberID
Index=Index+1
;达到沙城主数量则退出循环
IfIndex=LordCountThen
Break
EndIf
EndIf
EndLoop

4.领取弹窗生成:实现沙城主交互反馈

向两名沙城主推送自动弹窗,需使用引擎的“ShowDialog”弹窗命令,该命令可自定义弹窗标题、内容、按钮文本及点击后的触发事件。弹窗需包含明确的奖励说明(如奖励物品、数量)与“领取”“稍后领取”两个按钮,提升用户体验。

“ShowDialog”命令的核心参数包括:目标角色ID、弹窗标题、弹窗内容、按钮1文本、按钮1触发脚本、按钮2文本、按钮2触发脚本。其中按钮1绑定奖励领取逻辑,按钮2绑定弹窗关闭逻辑(不执行奖励发放)。弹窗生成示例代码:

;循环为每名沙城主推送弹窗
Fori=0ToLordCount-1
;当前沙城主角色ID
CurrentLordID=LordList[i]
;判断角色是否在线(避免向离线角色推送)
IfCheckOnlineCurrentLordID=1Then
;生成奖励领取弹窗
ShowDialogCurrentLordID
"沙城主专属奖励"
"恭喜您成为沙城主,点击领取以下奖励:\n1.金币500万\n2.高级装备宝箱1个\n3.声望值100点"
"立即领取""OnRewardGetCurrentLordID"
"稍后领取""OnRewardCancelCurrentLordID"
Else
;向离线沙城主发送邮件通知
SendMailCurrentLordID"沙城主奖励提醒""您有一份沙城主奖励待领取,请上线后通过系统弹窗领取"
EndIf
Next

上述代码中,“\n”用于实现弹窗内容换行,提升可读性;“CheckOnline”命令用于判断角色是否在线,避免向离线角色推送无效弹窗,同时通过邮件通知确保离线玩家不遗漏奖励信息。

5.奖励发放与全服提示:完成流程闭环

沙城主点击“立即领取”后,脚本需执行两项核心操作:一是发放奖励至角色背包,二是触发全服彩色提示。奖励发放依赖“GiveItem”物品发放命令与“AddReputation”声望增加命令,需提前确认奖励物品的ID及数量,避免发放错误。

全服彩色提示需使用“SendBroadMsg”全服广播命令,该命令的第二个参数用于指定消息颜色(不同引擎颜色参数对应不同,通常7代表红色、8代表黄色、9代表绿色,可通过引擎手册查询)。提示内容需包含领取奖励的沙城主名称与奖励明细,增强全服互动性。

同时需添加奖励发放校验逻辑,通过“CheckBagSpace”命令判断角色背包是否有足够空间,避免因背包满导致奖励发放失败,若空间不足则提示玩家清理背包后重新领取。奖励发放与全服提示完整逻辑:

;奖励领取触发函数(CurrentLordID为传递的沙城主角色ID)
FunctionOnRewardGet(CurrentLordID)
;获取角色名称
LordName=GetUserNameCurrentLordID
;检查背包空间(需2格空位,对应金币与宝箱)
IfCheckBagSpace2<1Then
SendMsg2CurrentLordID"背包空间不足2格,请清理后重新领取"
Return
EndIf
;发放奖励
GiveItemCurrentLordID金币5000000;金币ID通常为1
GiveItemCurrentLordID高级装备宝箱1;假设宝箱ID为1010
AddReputationCurrentLordID100
;发送领取成功提示(仅当前沙城主可见)
SendMsg2CurrentLordID"奖励领取成功!已发放至您的背包,请查收"
;全服彩色提示(参数7代表红色,可按需调整)
SendBroadMsg7"全服恭喜:沙城主【"+LordName+"】成功领取专属奖励,包含500万金币、1个高级装备宝箱及100点声望!"
EndFunction

;取消领取触发函数
FunctionOnRewardCancel(CurrentLordID)
SendMsg2CurrentLordID"您已选择稍后领取,奖励弹窗将在10分钟后重新推送"
;10分钟后重新推送弹窗
Delay600
Begin
ShowDialogCurrentLordID"沙城主专属奖励""您有未领取的沙城主奖励,请及时领取""立即领取""OnRewardGetCurrentLordID""稍后领取""OnRewardCancelCurrentLordID"
End
EndFunction

完整脚本示例与适配说明

1.通用完整脚本代码

;传奇沙城主奖励脚本:攻城结束5分钟弹窗领取+全服提示
;作者:传奇技术站
;适配引擎:GOM/GEE/HERO(需根据引擎调整颜色参数)

;全局变量定义(存储沙城主ID)
DimLordList[2]
DimIndex=0

;1.攻城结束事件绑定与延时设置
OnSiegeEnd
;管理员通知
SendMsg1攻城战已结束,沙城主奖励发放流程启动,5分钟后推送弹窗
;5分钟(300秒)延时
Delay300
Begin
;2.沙巴克占领行会判定
CastleGuildID=GetCastleOwner()
IfCastleGuildID=0Then
SendMsg1沙巴克无占领行会,脚本终止
Return
EndIf

;3.筛选沙城主身份
LoopGuildMemberCastleGuildID
IfCheckCastleLordCurrentMemberID=1Then
LordList[Index]=CurrentMemberID
Index=Index+1
IfIndex=2Then
Break
EndIf
EndIf
EndLoop

;4.向沙城主推送领取弹窗
Fori=0To1
CurrentLordID=LordList[i]
IfCheckOnlineCurrentLordID=1Then
;弹窗内容与按钮配置
ShowDialogCurrentLordID
"沙巴克城主荣耀奖励"
"恭喜您荣登沙巴克城主之位,专属奖励如下:\n1.绑定金币5000000\n2.高级装备宝箱*1(必出紫装)\n3.声望值100(可用于提升称号)"
"立即领取""OnRewardGetCurrentLordID"
"稍后领取""OnRewardCancelCurrentLordID"
Else
;离线邮件通知
SendMailCurrentLordID"沙城主奖励待领取""您在本次攻城战中成为沙城主,获得专属奖励一份。请尽快上线,系统将自动推送领取弹窗,奖励有效期7天。"
SendMsg1沙城主【%LordName%】当前离线,已发送邮件通知
EndIf
Next
End
EndOnSiegeEnd

;5.奖励领取核心函数
FunctionOnRewardGet(CurrentLordID)
LordName=GetUserNameCurrentLordID
;背包空间校验
IfCheckBagSpace2<1Then
SendMsg2CurrentLordID"背包空间不足2格,请清理背包后重新点击领取"
Return
EndIf
;发放奖励(物品ID需根据服务端配置调整)
GiveItemCurrentLordID15000000;1为金币ID
GiveItemCurrentLordID10101;1010为高级装备宝箱ID
AddReputationCurrentLordID100
;个人领取提示
SendMsg2CurrentLordID"【沙城主奖励】领取成功!\n金币500万已到账\n高级装备宝箱已放入背包\n声望值+100"
;全服彩色广播(GOM引擎7=红色,GEE引擎9=红色,需按需调整)
SendBroadMsg7"【沙城荣耀】全服祝贺!玩家【"+LordName+"】凭借卓越实力成为沙巴克城主,现已领取专属荣耀奖励,让我们共同见证王者风采!"
;记录奖励发放日志(便于后期查询)
WriteLog"沙城主奖励发放""玩家"+LordName+"("+CurrentLordID+")于"+GetTime+"领取沙城主奖励"
EndFunction

;6.取消领取处理函数
FunctionOnRewardCancel(CurrentLordID)
LordName=GetUserNameCurrentLordID
SendMsg2CurrentLordID"您已选择稍后领取奖励,系统将在10分钟后再次推送弹窗。若需立即领取,可通过NPC【沙城管理员】手动触发。"
;10分钟后重新推送
Delay600
Begin
IfCheckOnlineCurrentLordID=1Then
ShowDialogCurrentLordID"沙城主奖励提醒""您有一份沙城主奖励尚未领取,点击立即领取即可获得丰厚奖励""立即领取""OnRewardGetCurrentLordID""稍后领取""OnRewardCancelCurrentLordID"
Else
SendMsg1沙城主【%LordName%】仍处于离线状态,弹窗推送失败
EndIf
End
EndFunction

2.不同引擎的适配调整

上述脚本为通用版本,不同服务端引擎需进行以下细节调整,确保功能正常:

-GOM引擎:全服消息颜色参数为1-10,7代表红色,可直接使用;物品发放命令“GiveItem”支持绑定属性,若需发放绑定金币,可在命令后添加“Bind1”参数,如“GiveItemCurrentLordID15000000Bind1”。

-GEE引擎:全服消息颜色参数为1-20,9代表红色,需将“SendBroadMsg7”改为“SendBroadMsg9”;身份校验命令为“IsCastleLord”,需替换脚本中的“CheckCastleLord”。

-HERO引擎:延时命令为“Wait”,需将“Delay300”改为“Wait300”;弹窗命令为“OpenDialog”,参数顺序与“ShowDialog”一致,仅命令名称不同。

3.脚本部署与调试要点

脚本编写完成后,需按以下步骤部署与调试,避免出现功能异常:

1.放置路径:将脚本文件(后缀为.txt或.scp)放入服务端“Scripts”目录下,该目录为引擎默认脚本读取路径,若自定义路径需在引擎配置文件“Setup.txt”中添加“ScriptPath=自定义路径”。

2.权限设置:确保脚本文件权限为“可读可写”,避免服务端因权限不足无法加载脚本;同时在引擎“权限配置”中开放脚本执行权限,部分服务端默认关闭自定义脚本执行功能。

3.调试方法:通过“@测试攻城结束”命令手动触发“OnSiegeEnd”事件,无需等待真实攻城结束;使用“SendMsg1调试信息”在管理员聊天框输出关键变量值(如沙城主ID、行会ID),定位逻辑错误。

4.异常处理:添加“Try-Catch”异常捕获逻辑(部分引擎支持),避免因单个沙城主数据异常导致整个脚本崩溃,示例:“Try...CatchSendMsg1脚本执行异常:%ErrorMsg%EndTry”。

常见问题与解决方案

1.弹窗仅推送一名沙城主,另一名无反应

核心原因:沙城主身份判定逻辑遗漏。解决方案:一是通过“GetCastleLordList”命令直接获取沙城主ID列表,替代循环遍历行会成员的方式,该命令返回值为所有沙城主ID数组,更精准;二是检查服务端“沙巴克设置”中是否正确配置两名沙城主,部分服务端默认仅设置1名城主。

2.领取奖励后全服提示不显示或颜色错误

核心原因:颜色参数与引擎不匹配或广播命令错误。解决方案:查阅对应引擎的“消息广播命令手册”,确认全服消息颜色参数;若使用HERO引擎,需将“SendBroadMsg”改为“SendAllMsg”,该引擎全服广播命令名称不同。

3.延时后脚本未执行,无弹窗推送

核心原因:延时命令使用错误或服务端进程被占用。解决方案:GOM/GEE引擎使用“Delay”,HERO引擎使用“Wait”,不可混用;同时检查服务端是否开启“脚本超时保护”,若超时时间设置小于300秒,需在配置文件中调整为“ScriptTimeout=600”(10分钟)。

4.奖励发放成功但背包中无物品

核心原因:物品ID错误或背包空间校验失效。解决方案:通过“@查看物品ID”命令在游戏内获取正确的物品ID,避免使用网上流传的通用ID;将“CheckBagSpace2”改为“CheckBagSpace3”,预留额外空间用于系统自动拆分物品。

总结

实现攻城结束后沙城主奖励脚本,核心在于精准绑定事件、控制延时、判定身份与反馈交互,各环节需严格遵循服务端引擎的命令规范。脚本编写完成后,务必进行多次调试,结合不同场景(如沙城主在线/离线、背包满/空)验证功能稳定性。通过上述方法编写的脚本,可完美实现需求中的全部功能,同时兼顾易用性与可维护性,适配多数传奇服务端环境。
[顶部]