全景
简介
在服务器设计一个完整的PVP游戏,需要考虑的技术问题主要是:
- 场地建设
- 容纳人数
- 开始程序
- 地图特色
- 胜者判定
- 结束程序
- 反作弊:反作弊思想要贯穿从比赛开始到结束整个设计,尽量保证公平
一、场地建设&容纳人数
场地建设包括大厅和比赛场地,我们设计的是在一个盒子中,上方为大厅,下方比赛场地,中间用屏障方块隔开,玩家死亡后自动传送到上方大厅,可以观看下方的战斗。优势是建造方便,是一种比较讨巧的办法。比赛场地建设时要考虑到最大容纳人数,并设计出生点。
出生点(中心处,设计最大12人参赛)
二、开始程序
我主要考虑到以下几点
自动/手动开始:我设计的是OP手动,因为服务器人少,活动都是喊一嗓子才组织起来,手动方便管理,而且设计也方便。决定开始的时候OP拉一下拉杆就可以
冒险模式:防止破坏地形;在服务器里肯定要考虑这个问题,不然维护地形要累死
命令:gamemode @a[坐标范围]
重置出生点:重置出生点至上方大厅,确保玩家被击杀后传送到场地上方,可以直接观看后续战斗
命令:spawnpoint @a[坐标范围] 大厅坐标
清怪:这个看大家喜好,服里PVP不喜欢还有怪物干扰,所以设计了这条,最直接的思路是循环命令kill @e[type=!Player,坐标范围],但是要注意,这样做的话点燃的TNT,射出去的箭,扔出去的小黑眼,地上掉落的物品都会被清除,这样可玩性就小了。因此,我想了另外一个办法,先给所有type=!Items的实体添加一个变量,然后依次重置玩家,tnt,箭,小黑眼的这个变量,最后kill所有拥有这个变量的实体(包括了所有mob以及其他实体)命令:
循环Scoreboard players set @e[type=!Item,坐标范围] 变量a 1
连锁Scoreboard players reset @a 变量a
连锁Scoreboard players reset @e[type=Arrow,坐标范围] 变量a
连锁Scoreboard players reset @e[type=tnt,坐标范围] 变量a
连锁Scoreboard players reset @e[type=ender_pearl,坐标范围] 变量a
连锁Minecraft:kill @e[score_变量a_min=1,坐标范围]
传送:将玩家随机传送到各个出生点
命令:tp @r[大厅坐标范围] 出生点1坐标(依次类推)
公告:比赛开始肯定要有个酷炫的显示
命令:/Title @a[坐标范围] title {"text":"血战到底!","color":"dark_red"}
清空背包:防止夹带私人装备(其实应该装备栏也清空因为clear命令只能清空背包,但我比较懒还没更新XD)
命令:clear @a[坐标范围]
清空效果:考虑到比赛开始前玩家身上可能有各种效果,清除一下保证统一
命令:effect @a[坐标范围] clear
治疗:玩家开始比赛前可能有受伤
命令:heal @a[坐标范围]
三、地图特色
这个是整张地图的亮点,单纯打打杀杀没什么新意,增添一些新的元素可能会带来更多的乐趣
我设计的这张PVP地图,我认为最好玩的地方就是加入了可引爆的房屋这一设定,如果想得到好装备,就要进小楼房,但进了小楼房,就要冒被炸死的风险,所以玩这张地图,尤其是人多的时候,临场的决定比较重要
具体实现上,因为tnt对地形破坏力巨大,我采用两种方式,一是用屏障方块尽可能堵住tnt防止乱飞,二是用结构方块,游戏结束后重新加载,恢复局部地形
因此,要把房屋及周边一定范围先设计好并保存到结构方块中
命令:
脉冲Setblock ~ ~4 ~ structure_block 1 0 {metadata:"",mirror:"NONE",ignoreEntities:1b,powered:0b,seed:0L,author:"MineCrocodile",rotation:"CLOCKWISE_180",posX:0,mode:"LOAD",posY:0,sizeX:11,posZ:0,integrity:1.0f,showair:0b,name:"保存的文件名",id:"minecraft:structure_block",sizeY:18,sizeZ:10,showboundingbox:1b}
连锁setblock ~ ~2 ~ redstone_block
连锁setblock ~ ~1 ~ air
另外,地图散落的宝箱每局应该都更新,不可能每次比赛结束后都人工去维护,宝箱最好分等级,采用不同的loottable可以比较好的实现
命令:setblock 坐标 chest 0 replace {LootTable:chests/village_blacksmith}
宝箱内容
四、胜者判定
自动判定胜出玩家,使用testfor探测玩家数目结合非门即可,当玩家数少于2人会输出一个红石信号,激活结束程序
命令:testfor @a[坐标范围]
五、结束程序
结束同样也包括很多方面
公告:游戏结束,宣布获胜玩家
传送:将冠军传送回大厅
模式:将模式修改为原模式
清背包:根据情况决定是否清背包
重置出生点:将出生点重置为服务器出生点
加载结构方块并重置宝箱:同前
命令基本同前,大家可以举一反三
实战截图