传奇家族对战脚本的核心是“家族报名、宣战、开战、夺旗/占城、奖励结算、全服公告”五段流程。不同引擎命令差异较大,LEG、GEE、GOM、996等引擎部分功能需要以当前引擎M2帮助和插件说明为准。
一、家族城堡争霸脚本结构
脚本通常分为四个文件:
NPC脚本:用于报名、宣战、查看家族信息。
QFunction-0.txt:用于杀敌、夺旗、死亡、攻城开始/结束触发。
QManage.txt:用于登录刷新家族状态。
攻城触发脚本:用于攻城开始、结束、占领城堡时发放奖励。
二、家族报名脚本
家族争霸开始前,需要先登记家族信息。
[@main]
IF
CHECKGUILDNAME
ACT
GOTO@已加入家族
ELSESAY
你还没有加入家族,无法参与城堡争霸。\
<离开/@exit>
[@已加入家族]
IF
EQUAL<FAMILYWAR>0
ACT
GOTO@可报名
ELSESAY
你已经报名本次家族争霸。\
<查看规则/@规则>\
<离开/@exit>
[@可报名]
SAY
家族城堡争霸即将开启。\
报名后不可随意退出。\
\
<报名参战/@报名>\
<查看规则/@规则>\
<离开/@exit>
[@报名]
IF
CHECKGUILDNAME
CHECKBAGGAGE
ACT
MOV<FAMILYWAR>1
SET[101]1
SENDMSG0家族【<GUILDNAME>】已报名城堡争霸,请准备集结!
GOTO@报名成功
ELSESAY
报名失败,请检查背包空间或家族状态。
[@报名成功]
SAY
报名成功。\
开战时请前往城堡战场。\
<离开/@exit>
[@规则]
SAY
必须加入家族才能报名。\
开战后进入城堡地图。\
占领城堡核心区域获胜。\
获胜家族获得专属奖励。\
<返回/@main>
三、家族宣战脚本
家族报名完成后,可以由家族掌门发起宣战。
[@宣战]
IF
CHECKISGUILDMASTER
EQUAL<FAMILYWAR>1
ACT
GOTO@输入对手家族
ELSESAY
只有家族掌门可以发起宣战,或你尚未报名。
[@输入对手家族]
SAY
请输入要宣战的家族名称。\
<输入/@输入家族名>
[@输入家族名]
IF
ACT
MOVS10<INPUTSTR>
GOTO@确认宣战
[@确认宣战]
IF
ACT
MOV<TARGETGUILD><STR(S10)>
MOV<WARSTATE>1
SENDMSG0【家族争霸】家族【<GUILDNAME>】向家族【<TARGETGUILD>】发起城堡宣战!
GOTO@宣战成功
[@宣战成功]
SAY
宣战成功。\
等待系统开启城堡战场。\
<离开/@exit>
四、强制开启城堡战场
如果引擎支持手动触发攻城,可以在GM面板或定时脚本中调用开战命令。ESP插件类引擎可使用ESPLaunchCastlBattle命令强制开启攻城战,第一个参数为城堡名称,第二个参数为持续分钟数。
示例:
ESPLaunchCastlBattle家族城堡30
开战成功后,QFunction-0.txt中的@BeginCastle会被触发。
[@BeginCastle]
ACT
SENDMSG0【家族城堡争霸】战场已开启,所有报名家族请进入城堡地图!
MOV<WARSTART>1
MOV<WARTIME>30
五、夺旗占领脚本
家族争霸常用夺旗或占城两种判定方式。
夺旗写法:
[@PickUpItemX]
IF
EQUAL<WARSTART>1
CHECKITEM家族战旗1
ACT
MOV<FLAGHOLDER><USERNAME>
MOV<FLAGGUILD><GUILDNAME>
SENDMSG0【夺旗】家族【<GUILDNAME>】的<USERNAME>夺下家族战旗!
BREAK
占城写法:
[@CastleOccupied]
IF
ACT
SENDMSG0【城堡占领】家族【<GUILDNAME>】成功占领家族城堡!
MOV<WINNERGUILD><GUILDNAME>
MOV<CASTLEOWNER>1
LEG等引擎的行会领地争夺、宣战、结盟功能需要以对应引擎说明为准。
六、杀敌积分脚本
家族战中击杀敌对家族成员可以增加积分。
[@OnKillPlayer]
IF
EQUAL<WARSTART>1
ACT
INC<KILLSCORE>1
INC<GUILDSCORE>1
SENDMSG6你击败一名敌对家族成员,积分+1
BREAK
如果引擎不支持@OnKillPlayer,可改为在QFunction-0.txt中通过玩家死亡或自定义按钮触发。
七、战斗结束与奖励结算
攻城时间结束后,需要判定获胜家族并发放奖励。
[@EndCastle]
IF
EQUAL<CASTLEOWNER>1
ACT
SENDMSG0【家族争霸结束】家族【<WINNERGUILD>】获得本次城堡争霸胜利!
CALL[家族战奖励发放.txt]@发放胜利奖励
MOV<WARSTART>0
MOV<CASTLEOWNER>0
MOV<FLAGHOLDER>
MOV<FLAGGUILD>
BREAK
IF
ACT
SENDMSG0【家族争霸结束】本次城堡争霸未产生获胜家族。
MOV<WARSTART>0
MOV<CASTLEOWNER>0
MOV<FLAGHOLDER>
MOV<FLAGGUILD>
[@发放胜利奖励]
IF
CHECKGUILDNAME<WINNERGUILD>
ACT
GIVE家族勋章1
GIVE城堡令牌1
GAMEGOLD+5000
SENDMSG6你获得家族争霸胜利奖励。
BREAK
八、定时结束战场
如果引擎没有自动结束事件,可以用定时器脚本倒计时结束。
[@战场倒计时]
IF
EQUAL<WARSTART>1
ACT
DEC<WARTIME>1
SENDMSG0家族城堡争霸剩余时间:<STR(WARTIME)>分钟
GOTO@战场倒计时
ELSEACT
GOTO@EndCastle
九、调试要点
报名、宣战、开战、结束必须使用独立变量,避免互相覆盖。
开战触发要确认QFunction-0.txt中对应标签是否生效。
夺旗物品名必须与数据库一致。
奖励发放前必须再次判断获胜家族。
战场结束后要清空所有临时变量。
脚本修改后需要重新加载或重启服务端。
ESPLaunchCastlBattle等命令只在支持该插件的引擎中生效。
一、家族城堡争霸脚本结构
脚本通常分为四个文件:
NPC脚本:用于报名、宣战、查看家族信息。
QFunction-0.txt:用于杀敌、夺旗、死亡、攻城开始/结束触发。
QManage.txt:用于登录刷新家族状态。
攻城触发脚本:用于攻城开始、结束、占领城堡时发放奖励。
二、家族报名脚本
家族争霸开始前,需要先登记家族信息。
[@main]
IF
CHECKGUILDNAME
ACT
GOTO@已加入家族
ELSESAY
你还没有加入家族,无法参与城堡争霸。\
<离开/@exit>
[@已加入家族]
IF
EQUAL<FAMILYWAR>0
ACT
GOTO@可报名
ELSESAY
你已经报名本次家族争霸。\
<查看规则/@规则>\
<离开/@exit>
[@可报名]
SAY
家族城堡争霸即将开启。\
报名后不可随意退出。\
\
<报名参战/@报名>\
<查看规则/@规则>\
<离开/@exit>
[@报名]
IF
CHECKGUILDNAME
CHECKBAGGAGE
ACT
MOV<FAMILYWAR>1
SET[101]1
SENDMSG0家族【<GUILDNAME>】已报名城堡争霸,请准备集结!
GOTO@报名成功
ELSESAY
报名失败,请检查背包空间或家族状态。
[@报名成功]
SAY
报名成功。\
开战时请前往城堡战场。\
<离开/@exit>
[@规则]
SAY
必须加入家族才能报名。\
开战后进入城堡地图。\
占领城堡核心区域获胜。\
获胜家族获得专属奖励。\
<返回/@main>
三、家族宣战脚本
家族报名完成后,可以由家族掌门发起宣战。
[@宣战]
IF
CHECKISGUILDMASTER
EQUAL<FAMILYWAR>1
ACT
GOTO@输入对手家族
ELSESAY
只有家族掌门可以发起宣战,或你尚未报名。
[@输入对手家族]
SAY
请输入要宣战的家族名称。\
<输入/@输入家族名>
[@输入家族名]
IF
ACT
MOVS10<INPUTSTR>
GOTO@确认宣战
[@确认宣战]
IF
ACT
MOV<TARGETGUILD><STR(S10)>
MOV<WARSTATE>1
SENDMSG0【家族争霸】家族【<GUILDNAME>】向家族【<TARGETGUILD>】发起城堡宣战!
GOTO@宣战成功
[@宣战成功]
SAY
宣战成功。\
等待系统开启城堡战场。\
<离开/@exit>
四、强制开启城堡战场
如果引擎支持手动触发攻城,可以在GM面板或定时脚本中调用开战命令。ESP插件类引擎可使用ESPLaunchCastlBattle命令强制开启攻城战,第一个参数为城堡名称,第二个参数为持续分钟数。
示例:
ESPLaunchCastlBattle家族城堡30
开战成功后,QFunction-0.txt中的@BeginCastle会被触发。
[@BeginCastle]
ACT
SENDMSG0【家族城堡争霸】战场已开启,所有报名家族请进入城堡地图!
MOV<WARSTART>1
MOV<WARTIME>30
五、夺旗占领脚本
家族争霸常用夺旗或占城两种判定方式。
夺旗写法:
[@PickUpItemX]
IF
EQUAL<WARSTART>1
CHECKITEM家族战旗1
ACT
MOV<FLAGHOLDER><USERNAME>
MOV<FLAGGUILD><GUILDNAME>
SENDMSG0【夺旗】家族【<GUILDNAME>】的<USERNAME>夺下家族战旗!
BREAK
占城写法:
[@CastleOccupied]
IF
ACT
SENDMSG0【城堡占领】家族【<GUILDNAME>】成功占领家族城堡!
MOV<WINNERGUILD><GUILDNAME>
MOV<CASTLEOWNER>1
LEG等引擎的行会领地争夺、宣战、结盟功能需要以对应引擎说明为准。
六、杀敌积分脚本
家族战中击杀敌对家族成员可以增加积分。
[@OnKillPlayer]
IF
EQUAL<WARSTART>1
ACT
INC<KILLSCORE>1
INC<GUILDSCORE>1
SENDMSG6你击败一名敌对家族成员,积分+1
BREAK
如果引擎不支持@OnKillPlayer,可改为在QFunction-0.txt中通过玩家死亡或自定义按钮触发。
七、战斗结束与奖励结算
攻城时间结束后,需要判定获胜家族并发放奖励。
[@EndCastle]
IF
EQUAL<CASTLEOWNER>1
ACT
SENDMSG0【家族争霸结束】家族【<WINNERGUILD>】获得本次城堡争霸胜利!
CALL[家族战奖励发放.txt]@发放胜利奖励
MOV<WARSTART>0
MOV<CASTLEOWNER>0
MOV<FLAGHOLDER>
MOV<FLAGGUILD>
BREAK
IF
ACT
SENDMSG0【家族争霸结束】本次城堡争霸未产生获胜家族。
MOV<WARSTART>0
MOV<CASTLEOWNER>0
MOV<FLAGHOLDER>
MOV<FLAGGUILD>
[@发放胜利奖励]
IF
CHECKGUILDNAME<WINNERGUILD>
ACT
GIVE家族勋章1
GIVE城堡令牌1
GAMEGOLD+5000
SENDMSG6你获得家族争霸胜利奖励。
BREAK
八、定时结束战场
如果引擎没有自动结束事件,可以用定时器脚本倒计时结束。
[@战场倒计时]
IF
EQUAL<WARSTART>1
ACT
DEC<WARTIME>1
SENDMSG0家族城堡争霸剩余时间:<STR(WARTIME)>分钟
GOTO@战场倒计时
ELSEACT
GOTO@EndCastle
九、调试要点
报名、宣战、开战、结束必须使用独立变量,避免互相覆盖。
开战触发要确认QFunction-0.txt中对应标签是否生效。
夺旗物品名必须与数据库一致。
奖励发放前必须再次判断获胜家族。
战场结束后要清空所有临时变量。
脚本修改后需要重新加载或重启服务端。
ESPLaunchCastlBattle等命令只在支持该插件的引擎中生效。

