一、原脚本问题解析:为何多城主可领取奖励
原脚本仅通过“ISCASTLEMASTER”命令判断是否为沙城主,该命令仅验证角色是否拥有沙城主权限,无法区分城主排位。部分服务端中,沙巴克行会的会长、副会长等核心职位,可能均被配置为“城主权限”,导致多个角色触发“ISCASTLEMASTER”条件,均可领取奖励。
解决核心是新增“排位判断逻辑”,通过脚本命令定位沙巴克行会的“第一位城主”(即行会会长,对应游戏内沙老大身份),仅允许该角色触发奖励领取,排除其他拥有城主权限但排位非第一的角色。以下提供3套适配不同服务端版本的脚本方案,可直接复制替换原脚本使用。
二、3套脚本方案:仅第一位沙老大可领取奖励
方案一:行会会长判断(通用版,适配所有服务端)
核心逻辑:沙巴克行会的第一位城主默认是行会会长,通过“ISGUILDMASTER”命令判断角色是否为沙巴克行会会长,仅会长可领取奖励,从根源限制多城主领取。
[@验证身份]
#IF
ISCASTLEMASTER ; 验证是否为沙城主
ISGUILDMASTER ; 新增:验证是否为行会会长(第一位沙老大)
#say
恭喜!你带领行会成功占领沙巴克,身为沙老大可领取最高荣誉奖励!\
\
<确认领奖/@开始奖励>\
[@开始奖励]
#if
ISCASTLEMASTER
ISGUILDMASTER ; 新增:双重验证,确保是第一位沙老大
#act
GAMEGOLD + 100000 (送元宝10万)
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
mapmove 3 333 333
break
#ELSE
#say
抱歉!仅沙巴克第一位沙老大(行会会长)可领取奖励!
break
适配说明:无需修改数据库,仅新增“ISGUILDMASTER”命令即可,适合新手快速配置。若需调整提示语,可直接修改“#say”后的文本内容,不影响脚本逻辑。
方案二:沙老大专属变量判断(进阶版,避免权限误判)
核心逻辑:通过全局变量记录沙巴克第一位沙老大(会长)名称,领取奖励时验证角色名与变量值一致,仅匹配成功可领取,适配部分特殊权限配置的服务端。
; 第一步:沙巴克占领后,自动记录第一位沙老大(行会会长)到变量
[@CastleTake] ; 沙巴克占领触发事件(服务端默认事件)
#act
GETGUILDMASTERNAME 沙巴克 S1 ; 获取沙巴克行会会长名称,存入S1变量
SETGLOBALVAR G_ShaLaoda <$S1> ; 全局变量G_ShaLaoda存储沙老大名称
SENDMSG 1 沙巴克占领成功!沙老大[<$S1>]已登记,可领取专属奖励!
break
; 第二步:奖励领取验证(替换原[@验证身份]和[@开始奖励])
[@验证身份]
#IF
ISCASTLEMASTER
#say
恭喜!你带领行会成功占领沙巴克,\
仅登记沙老大可领取最高荣誉奖励!\
\
<确认领奖/@开始奖励>\
[@开始奖励]
#if
ISCASTLEMASTER
CHECKGLOBALVAR G_ShaLaoda <$USERNAME> ; 验证角色名是否与沙老大变量一致
#act
GAMEGOLD + 100000 (送元宝10万)
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
mapmove 3 333 333
break
#ELSE
#say
抱歉!仅登记的沙老大[<$G_ShaLaoda>]可领取奖励!
break
适配说明:需确保服务端支持“@CastleTake”占领触发事件,若不支持可手动触发变量设置(游戏内GM命令输入“SETGLOBALVAR G_ShaLaoda 沙老大角色名”)。沙巴克易主后,变量会自动更新,无需手动修改。
方案三:职位等级判断(特殊版本适配,区分城主排位)
核心逻辑:部分服务端通过“职位等级”区分沙城主排位,会长(第一位沙老大)职位等级为1,其他城主为2及以上,通过判断职位等级实现专属领取。
[@验证身份]
#IF
ISCASTLEMASTER ; 验证是否为沙城主
CHECKGUILDPOSITION 沙巴克 1 ; 新增:验证沙巴克行会职位等级为1(第一位沙老大)
#say
恭喜!你身为沙巴克第一位沙老大,可领取最高荣誉奖励!\
\
<确认领奖/@开始奖励>\
[@开始奖励]
#if
ISCASTLEMASTER
CHECKGUILDPOSITION 沙巴克 1 ; 双重验证职位等级
#act
GAMEGOLD + 100000 (送元宝10万)
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
mapmove 3 333 333
break
#ELSE
#say
抱歉!仅沙巴克第一位沙老大(职位等级1)可领取奖励!
break
适配说明:若职位等级对应不同,可修改“CHECKGUILDPOSITION 沙巴克 1”中的“1”,具体等级可在DBC2000行会数据库中查询(“GuildPosition”字段)。
三、脚本配置步骤(新手必看,确保生效)
1. 备份原脚本:找到原脚本所在路径(通常为“D:\MirServer\Mir200\Envir\QuestDiary”),复制原文件并命名为“沙城奖励_备份.txt”,避免修改错误无法恢复。
2. 替换脚本内容:用记事本或Notepad++打开原脚本文件,删除原有[@验证身份]和[@开始奖励]段落,复制上述任意一套方案的脚本内容粘贴进去,保存文件。
3. 开启脚本权限:打开M2引擎,依次点击“选项→功能设置→脚本功能”,勾选“启用自定义脚本”“启用全局变量命令”(方案二需勾选),点击保存并重启M2引擎。
4. 测试验证:登录游戏,用沙巴克行会会长(第一位沙老大)和副会长账号分别测试,确认会长可正常领取,副会长提示“仅沙老大可领取”,验证脚本生效。
四、常见问题排查:避免脚本失效或报错
1. 脚本无响应:优先检查脚本文件编码是否为ANSI(用记事本打开,点击“文件→另存为”,编码选择ANSI),编码错误会导致脚本无法执行;其次确认M2引擎已重启,配置未生效会导致命令无响应。
2. 仍可多城主领取:检查服务端是否存在“城主权限叠加”,若副会长也被设置为“会长权限”,需在DBC2000行会数据库中修改副会长职位等级(改为2及以上),避免权限误判。
3. 方案二变量不更新:沙巴克易主后未触发“@CastleTake”事件,可手动执行GM命令“SETGLOBALVAR G_ShaLaoda 新沙老大角色名”,强制更新变量值;若仍不更新,需升级M2引擎至支持占领触发事件的版本。
4. 提示语乱码:脚本中存在中文符号(如全角逗号、句号),需替换为英文符号,同时确保文本编码为ANSI,修改后保存重启服务端即可解决。
五、进阶优化:新增每日领取限制(避免重复领取)
若需搭配每日领取限制,可在脚本中新增“每日领取标记”,避免沙老大重复领取奖励,脚本修改如下(以方案一为例):
[@开始奖励]
#if
ISCASTLEMASTER
ISGUILDMASTER
CHECKVAR H_ShaReward < 1 ; 检查每日领取标记(H变量为每日重置)
#act
GAMEGOLD + 100000 (送元宝10万)
SETVAR H_ShaReward 1 ; 设置领取标记,当日不可再领
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
SENDMSG 1 恭喜伟大的沙巴克沙老大[<$USERNAME>]领取100000个元宝奖励!
mapmove 3 333 333
break
#ELSE
#say
抱歉!今日奖励已领取,明日可再次领取!
break
优化说明:H变量为每日自动重置变量,无需手动清理,适合原有每日领取设置的补充,进一步规范奖励领取规则。

