策划
总之又是活动鬼才兽兽的注意啦。最近在 Inf 服务器中深得命令方块和 RGI 的精髓,于是就想着用到一些自定义道具。考虑到往年五一活动都会破坏一部分人的游戏体验,于是今年我们也做成了 pvp。 然后就是加入在活动中喜闻乐见的小队元素,再加入一点职业元素…… 最后就变成了现在的样子。
确定下这样的游戏形式之后,剩下的系统就非常简单。排名就按照小队击杀数,职业也是大家耳熟能详的名字。
职业以及技能设计
基本就是遵循这个职业的特性,搞几个大家比较喜闻乐见的技能。参考的内容包括守望先锋、雨中冒险等。具体的技能数值都是按照单抓秒不了,集火瞬间躺的感觉来安排的。由于是 pvp 的形式,在设计技能时我们也考虑了很多操作性元素在里面。
具体的道具制作就不写了,RGI 使用不是一句两句能说清楚的。如果感兴趣的话之后我考虑单独发帖。
平衡调整
这次的职业平衡调整花去了我们大部分的准备时间。关于这个话题,我和兽兽也讨论了很久,有很多职业的技能被调整甚至重做。考虑到的因素包括了技能爆发、操作性、团队配合等等。
比如游侠的shift技能,在最初的时候只是一个普通的加速。但当其它职业都完成后,我们感觉这一个技能太过普通没有亮点,于是改成了跳跃射击,并在跳跃期间增加伤害。但由于在空中时太难射中,而配合左键输出又会打出过高的爆发伤害,所以我们最后改为了箭雨这个技能。为了防止玩家卡地形平地施放箭雨技能,我们添加了只能在高空中施放的限制。之后我们意外的发现游侠的大招配合这个技能可以稳定秒杀一个玩家,也算是一个合理的加强吧。
经过上面的调整之后,游侠的可玩性大大提高了,即使是对于那些不怎么会玩弓的玩家来说。
顺便一提这把弓真的是我有史以来做过的最复杂的道具…… 除了RPGItem, 还有一些命令方块的配合。
服务器搭建
插件需求和之前的活动大致相同。插件配置和一些服务器设定也基本一样。
在出生岛和重生点添加了两个pvp保护区,并且在这两个区域里面,玩家也无法使用道具。(RGI 的特性……似乎默认无法在保护区里使用)
CB
喜闻乐见的 CB 环节。这里介绍几个主要功能。
血包
具体的思路为:创建一个控制血包刷新 CD 的计分项 kit_hp_cd
。为每个血包指定一个该计分项下的变量 hp_x
。如果该变量的值为0且血包不存在,则刷新一个带有 tag hp_x
的盔甲架并刷新CD。再用高频来控制血包的旋转、CD 的减少、以及玩家走近时的效果——给玩家治疗、清除血包。
具体的高频 CB 链如下:
/execute unless entity @e[tag=hp_1] if score hp_1 kit_hp_cd matches ..0 run summon * * * armor_stand {Tags:["hp_1","hp"], ...(其它的NBT)... }
/execute if entity @e[tag=hp_1] if score hp_1 kit_hp_cd matches ..0 run scoreboard players set hp_1 kit_hp_cd 600
/execute unless entity @e[tag=hp_1] run scoreboard players remove hp_1 kit_hp_cd 1
//基本的控制命令
/execute as @e[tag=hp] at @s run tp @s ~ ~ ~ ~10 ~
/execute as @e[tag=hp] at @s run ...
//自身的旋转以及粒子效果
/execute as @e[tag=hp] at @s if entity @p[distance=..1] run effect give @p regeneration 3 10
/execute as @e[tag=hp] at @s if entity @p[distance=..1] run ......
//玩家走近的效果
复活控制
玩家复活后,会进入一个复活等待室,等待复活时间过去后再进入传送室。传送时要求不能传送到正在等待复活的玩家身上。
制作思路为:创建一个 death
的计分项来追踪玩家死亡数,再创建一个 death_cd
的计分项来控制玩家复活等待时间。玩家死亡后,为其添加 death
的 tag,重设其复活 CD 为 30 秒。复活 CD 结束后,传送玩家至传送室。玩家传送后,移除他的 death
标签。
高频 CB 如下:
/tag add @a[scores={death=1..}] death
/tag add @a[scores={death=1..}] death_cd
/scoreboard players set @a[scores={death=1..}] death_cd 600
/scoreboard players remove @a[scores={death_cd=1..}] death_cd 1
/scoreboard players set @a death 0
//玩家死亡时的操作以及 CD 倒数
/title @a[scores={death_cd=599}] actionbar "复活等待时间 30 秒"
......
//CD 倒数的提示信息
/tp @a[tag=death_cd,scores={death_cd=0}] * * *
/tag remove @a[tag=death_cd,scores={death_cd=0}] death_cd
//CD 倒数结束后,传送以及移除倒数 tag
传送按钮的 CB 如下:
/tag add @p[distance=..5] tp_1
/execute as @a[tag=!death] at @s if score @s team = @p[tag=tp_1] team run tp @p[tag=tp_1] ~ ~ ~
//传送到未死亡的队友身边
/tag remove @p[tag=tp_1,distance=10..] death
//如果传送成功,移除 `death` tag
/tag remove @a tp_1
临时加一个 tp_1
的 tag 是防止不同 CB 的选择器选到了不一样的玩家。这里提前创建了一个名为 team
的计分项,通过高频使其追踪玩家所在的队伍。
另一个随机传送的 CB 与上面的类似 只是把第二条改为了 /spreadplayers
。
队伍击杀统计
因为 MC 原生不支持统计队伍击杀数,所以自己用 CB 实现了一个。思路就是每有一个玩家完成一次击杀,使该队伍的击杀数+1。需要提前创建一个 kill
计分项来追踪玩家击杀数,和一个 teamkill
计分项来记录队伍击杀数。以下是高频 CB:
/execute as @a[team=1,scores={kill=1..}] run scoreboard players operation Team-1 teamkill += @s kill
/execute as @a[team=2,scores={kill=1..}] run scoreboard players operation Team-2 teamkill += @s kill
......
/scoreboard players set @a kill 0
流程控制
整体的流程如下:
加入->分队->传送并开打->结束
所以相当简单。分队方法就是使用那个平台,踩踏板加队伍,满队之后关门并发装备。传送的话也只要一个普通的 /spreadplayers
就能搞定。结束的时候只要清空个背包再给个抗性就完事了。
中途有新玩家加入的话,倒是需要手动操作下。这种形式的也不太好做自动化。
文案
我相信一个足够好玩的活动不需要特别的活动文案,也不需要过分的宣传造势。其实是我们没人会写
奖励设计
都是原版物品。据说毛线现在产能严重不足,于是我们整了一堆建材。既然是劳动节,当然要鼓励大家多多劳(tian)动(keng)啦。