群英争夺战和行会争霸是两套经常一起出现的团队玩法。前者以个人为单位报名,混战后按存活和击杀排名;后者以行会为单位对抗,按行会总积分定胜负。两套玩法底层是同一套逻辑,报名、进场、计分、结算、发奖五步,区别只在统计的对象是个人还是行会。下面把两套脚本按搭建顺序拆开写。
两套玩法的共性和差别
共性在于都依赖一个封闭的战场地图、一个报名入口、一段实时计分、一次统一结算。差别在于统计粒度。群英争夺战统计到人,脚本里每个玩家一份积分变量;行会争霸统计到会,积分要按行会名归集,同一个行会的人打的分数要合并成一个数。
行会归集这一步最容易出错。脚本不能只拿玩家变量去比高低,得先按行会名把成员的分数加总,再加总结果去排队。加总的地方写错,会出现一个人分很高但行会没排名的情况,玩家必然要问。
报名入口和分组
两套玩法都从主城NPC进。报名要有门槛,也要有中止,人满了、时间过了、等级不够都进不去。
text
[@群英报名]
#IF
CHECKLEVELEX > 49
CheckVar Human QYJoin = 0
CheckVar Human QYPoint = 0
#ACT
CalcVar Human QYJoin = 1
CalcVar Human QYPoint = 0
MAPMOVE QYMAP 20 20
SENDMSG 5 报名成功,已传送至战场
BREAK
#IF
#ACT
MESSAGEBOX 等级不足或本次已报名
BREAK
QYJoin是报名标记,报名时置1,进图用。QYPoint是本次战场的积分,报名时归零,防止上一场的分数带到这一场。归零这一步不能漏,漏了之后上一场的高分玩家一进场就顶着分,排名从头就错。
分组的做法有两种。一种是先报名、到点统一传进场,大家同时开始;另一种是随报随进,先来先进。前者公平,后者方便。多数版本用前者,把报名标记置1之后先不传送,等到开战那一刻由定时触发统一把人拉进去。
text
[@开战传送]
#IF
CheckVar Human QYJoin = 1
#ACT
MAPMOVE QYMAP 20 20
BREAK
这里统计的是全体报名者,定时触发会把所有人都传一遍。传送落点要选好,统一落在一个位置容易被人提前守着,最好按坐标范围随机散开,落点写在确认过的空白格上,别把人传进装饰物或者墙里。
战场内的击杀计分
进图之后就是打。每次击杀对手,脚本给击杀者加一笔分。这段挂在击杀触发上,和日常PK是同一套触发文件,靠地图编号区分。
text
[@群英计分]
#IF
CheckVar Human QYJoin = 1
#ACT
CalcVar Human QYPoint + 10
CalcVar Human QYKill + 1
SENDMSG 5 击杀成功,积分加十
BREAK
CalcVar用的是自增。写成赋值等于每次击杀都把积分抹回原值,玩家杀到结束还是一笔分,看日志能明显看出击杀数在涨而积分不动。
积分和击杀数分开记是有用的。复盘的时候能看出谁靠存活拿分、谁靠硬击杀拿分,调规则时有依据。但两个变量都要管好编号,别和版本里其他脚本撞车。
被击杀的一方要不要扣分,看玩法设计。不扣分更宽松,扣分更刺激。扣分就加一句减法,减到零为止,别让积分变成负数,负数会让排名和结算逻辑都添麻烦。
text
#IF
CheckVar Human QYPoint > 9
#ACT
CalcVar Human QYPoint - 10
SENDMSG 5 被击杀,积分减十
BREAK
行会争霸的分数归集
行会争霸和群英的区别就在这一段。玩家个人的击杀分,最后要合并到行会头上。
text
[@行会计分]
#IF
CheckVar Human HHJoin = 1
#ACT
CalcVar Human HHPoint + 10
SENDMSG 5 击杀成功,为行会累积积分
BREAK
个人分记完之后,另外一段脚本负责按行会名做累加。这里的关键是拿到玩家所属行会的名字,用行会变量去累加,而不是用个人变量。行会变量一般是全局变量或者行会名下的共享变量,写法看引擎支持哪一套。
加总的时候要注意行会解散、退会、换会这些情况。一个人中途退会,他的分算哪个会,规则得先定死。常见做法是开战后锁定归属,中途退会也不改变他这场为原行会拿的分。锁定用的是报名那一刻记下来的行会名,记在玩家的一个变量里,中途改会不动这个变量。
死亡复活与退场
战场里死了怎么处理,是玩法节奏的一部分。可以原地复活继续打,也可以阵亡即退场。前者人多,后者更像淘汰赛。
原地复活的话,复活点要单独设,别回到主城,不然玩家一死就被传出去,还得重新报名。脚本里用复活命令把玩家拉回战场内的复活点。
阵亡即退场的做法是死亡触发里直接传送出场,同时把报名标记置回0,让这个人本场不能再进。置回标记这一步重要,不置的话死出去的玩家靠报名入口还能再进来,淘汰制就废了。
存活计分和持续加分
很多群英玩法不只按击杀给分,在场存活也持续给分。这一类靠定时触发,每分钟给所有还在场的人加一笔。
text
[@存活加分]
#IF
CheckVar Human QYJoin = 1
#ACT
CalcVar Human QYPoint + 1
BREAK
这一条全图统一发,判断条件只有一个,他在场。这就带来一个坑,退场的人如果报名标记没清,照样每分钟领加分,人都不在战场里,分数还在涨。所以退场逻辑里把报名标记清干净,和这条存活加分是绑死的两件事,任何一边松了都会出问题。
结算和排名
时间到,收工结算。结算要做的是把所有人的积分拿出来排个序,取前几名发奖。排序这块多数引擎不直接提供,脚本要么用循环比较,要么把积分写进一个临时列表再读出来。写法因引擎而异,核心是把所有在场玩家的积分变量遍历一遍。
遍历的名单要锁定在本次报名的人身上,别把全场玩家都扫一遍。用一个名单变量或者报名标记筛选,避免误发给没参加的人。
发奖的时候,人名要对上,积分要对上,名次对应的奖励要对上。三样里错一样,玩家马上就会来问,尤其是头名奖励发错人这种,影响最坏。
text
[@结算发奖]
#IF
CHECKVAR GLOBAL QYTop1Name = 玩家名
#ACT
GIVE 冠军礼包 1
SENDMSG 5 恭喜获得群英第一名
BREAK
行会争霸的结算同理,只是把名字换成行会名,奖励发给会长或者发给行会仓库,规则先定。
清理现场和变量重置
一场结束,战场要清干净,变量要全重置。人留在图里、分留在账上、标记没收,下一次活动就会出乱子。
清场是把战场地图里的人全传出去,配一句全服提示。重置是把报名标记、个人积分、击杀数、归集用的行会分这些全部归零。行会分归零尤其要盯,它是全局变量,不清的话下一场直接接着上一场的数走,行会排名从头就是错的。
text
[@本场重置]
#ACT
SetVar Human QYJoin = 0
SetVar Human QYPoint = 0
SetVar Human QYKill = 0
SetVar Global HHPoint = 0
全局变量的重置要确认是所有人可见的清除,而不是只清了当前玩家那份。
防刷和公平性
团队玩法最怕刷。同一个人开几个号进场互刷,或者两个行会商量好轮流送分,这类事在活动里很常见。判定上能做的有几样。同一对账号之间的击杀不重复给分,同一个IP下的账号击杀不给分,积分短时间暴涨的账号进观察名单。
进场也要防。一个人多开几个号同时报名,会影响人数和排名。报名时可以做一道检测,同一IP限制报名数。这道限制别设得太死,网吧、宿舍这种共用一个出口的场景容易误伤,数值要留余地。
上线前的核对清单
两套玩法的脚本都写完,先核对变量编号有没有撞车,群英和行会各用一批号,别共用。核对地图编号、传送坐标、物品名三者一致,差一个字就传不进去或者发不出东西。
然后让服务端重新加载触发文件和NPC脚本,没加载等于没改。拿测试号把报名、进场、击杀、被杀、存活加分、退场、结算、清场整条链走两遍,第二遍重点看变量有没有重置干净,第一遍的残留会不会影响第二遍。
群英争夺战和行会争霸的代码量都不算大,难的是变量管理和状态收尾。把报名标记、积分、归集、重置这四块钉住,两套玩法就能稳稳地跑在一台服务端上,交替开也不互相干扰。
传奇群英争夺战与行会争霸完整脚本从报名分组到积分结算的搭建方法全解
来源:
作者:
点击:

