相关链接:【TCP】[1.8多人原版小游戏]顺手牵羊—Sheep Quest
大家好,今天我来讲解顺手牵羊的游戏运行原理。
目录:
1、计分板系统
2、牵羊系统
3、胜利队伍判定
计分板系统:
相信看过帖子的同学都想知道,如何原版做出这样的计分板效果
这里引用乙烯大大的教程进行说明:
【乙烯】关于侧边栏的应用小技巧
像这样的倒计时系统不能通过一般的数据指令来改变假名的数据,只有通过枚举的方法实现,于是我的指令系统中出现了这样的结构
图中的所有命令方块全部为计分板系统【其实压缩得也不够充分】。
举个例子,假设我需要一个循环的3秒倒计时。步骤如下:
- /scoreboard objectives add score dummy Timer
- /scoreboard players set Time: score -2
这样倒计时系统的准备工作就做完成了。
接下来是让计时的数据以计分板目标名字的形式变化,且位置要在Time:的下面,只有将假名分数设置为-3即可,然后进行枚举:
- /scoreboard players set 3_Second score -3
然后中继器设置延迟,同时触发两道指令:
- /scoreboard players set 2_Second score -3
- /scoreboard players reset 3_Second score
- /scoreboard players reset 1_Second score
- /scoreboard players set 0_Second score -3
将1_Second的数据在score计分板移除且将0_Second积分版数据设置为-3,
然后就可以接上其他的效果指令来完成计分板计时效果的衔接,也就是说只要你不怕烦的话,1000秒计时也是可以的,因为假名是没有限制的
然后有人问了,这个游戏里的重复计时怎么办?
如果单靠这个系统进行循环的话,会出现这种情况:
如果出现这种情况也非常的简单,只要在开头加一道指令:
- /scoreboard players reset 0_Second score
下一页为牵羊系统
牵羊系统:
在这个游戏中,如何牵羊是这里唯一的难点,难就难在区分自己队伍中的羊不能再跟着你,而其他羊能跟着你,并且你可以选择移动自己的羊。
牵羊系统全部需要超频来实现,系统如下图【也混杂了其他指令】:
牵羊其实就是TP的过程,要实现以上功能,要先通过计分板判定是否符合TP条件。这里以红队【red】为例子,玩家也在红队
- /scoreboard objectives add sheep dummy sheep
创建一个名为sheep的dummy计分板
- /entitydata @e[type=Sheep,x=-661,y=61,z=-749,dx=5,dy=-1,dz=2] {Color:14b}
- /scoreboard teams join red @e[type=Sheep,x=-661,y=61,z=-749,dx=4,dy=-1,dz=1] {Color:14b}
接下来是重点,讲解可能很绕口。。:
- /execute @a[team=red,m=2] ~ ~ ~ tp @e[r=2,team=!red,type=Sheep] @p[r=2,m=2,team=red]
游戏中有这么一个规则:牵羊的玩家会获得减速的效果,这个可以通过加分实现
- /execute @e[type=Sheep,team=!red] ~ ~ ~ scoreboard players set @a[r=2,team=red,m=2] sheep 3
- /effect @a[m=2,score_sheep=3,score_sheep_min=3] minecraft:slowness 1 0 true
- /execute @e[type=Sheep,team=red] ~ ~ ~ scoreboard players set @a[r=2,m=2,team=red] sheep 0
这样就可避免离开羊后一直减速的问题。
同样的难点就是有时候需要移动自己的羊群,却不能移动。于是这里加入了一个道具<赶羊棍>,持有后可以移动自己的羊群。
- /scoreboard objectives add team dummy team
同样高频,红队为例:
- /scoreboard players set @a team 0
- /scoreboard players set @a team 5 {SelectedItem:{id:"minecraft:stick",tag:{display:{Name:"赶羊棍",Lore:["能引导自己的羊群","<持有后可移动本队颜色的羊>"]},ench:[]}}}
- /execute @a[m=2,team=red,score_team=5,score_team_min=5] ~ ~ ~ tp @e[r=2,team=red,type=Sheep] @p[r=2,team=red,score_team=5,score_team_min=5]
牵羊系统至此基本结束
下一页讲解分数判定队伍胜利条件
胜利判定:
队伍的胜利,需要判定队伍拥有羊群最多的队伍,即队伍分数最高的那一队。
所以需要通过计分板的加减法来进行运算,将同一个队伍分别减去其他3个队伍的分数,若全部结果都为正数,即判定这个队伍获胜。所以我做成了这样的一个结构:
每一条代表一个队伍,运算后若为正数,则在对应地方放置一个石头,若全部为正数,则触发后面的一系列效果。
但计分板有个特性,每次运算,计分板的数值会立刻改变,所以我们需要备份计分板数据 , 每次运算过后将备份的数据提取,再次运算,再提取……也是枚举的一部分。
再次以红队为例子。
在运算之前,创建一个备用计分板
- /scoreboard objectives add score1 dummy score1
并且在这个计分板创建一个相同的假名。
- /scoreboard players set Red score1 0
接下来就是进行计分板赋值操作(重点)
- /scoreboard players operation Red score1 = Red score
然后进行 运算 和 反向赋值 的切换执行。
按顺序执行:
- /scoreboard players operation Red score -= Blue score
然后同时按顺序触发两道指令:
- /scoreboard players test Red score 1 17
以及
- /scoreboard players operation Red score = Red score1
若在正数范围内,则比较器触发,放置方块,反之,比较器熄灭,将方块替换为空气。以此类推,最后只会有一条队伍的电路会被触发,提示队伍胜利。
===============End===================
@乙烯_中国 @1jomin1
[groupid=1009]The Command's Power[/groupid]