我的世界 我想建一个地图,用什么指令能做到在一定秒数后两个人互换位置?
几个指令组合在一起的
(假设这个时间是60秒)
scoreboard objectives add swap_player dummy
scoreboard players add delay swap_player 1
execute if score delay swap_player matches 1200.. run execute as @r run tag @s add swap_a
execute at @a[tag=swap_a] run summon minecraft:area_effect_cloud ~ ~ ~ {Duration:2147483647,Tags:["swap_a"]}
execute as @a[tag=swap_a] at @s run tp @s @a[limit=1,sort=nearest,tag=!swap_a]
execute as @a[tag=!swap_a] at @s run tp @s @e[type=minecraft:area_effect_cloud,limit=1,sort=nearest,tag=swap_a]
kill @e[type=minecraft:area_effect_cloud,tag=swap_a]
tag @e[tag=swap_a] remove swap_a
execute if score delay swap_player matches 1200.. run scoreboard players set delay swap_player 0
凭感觉写的,没实测,可能有bug
如果是命令方块跑的话第一个循环保持开启,其他的连锁保持开启就行了
不想用那么多命令方块的话打包在function里,然后直接使用或者命令方块跑也行。如果还想懒一点的话,也可以把斜体全删了,然后在最后加一条schedule function & 60s
scoreboard objectives add delay dummy
summon area_effect_cloud ~ ~ ~ {Duration:999999,CustomName:"timer"}
下面都是循环
scoreboard players add timer delay 1
execute @e[score_delay_min=100,type=area_effect_cloud,name=timer] ~ ~ ~ execute @a ~ ~ ~ summon area_effect_cloud ~ ~ ~ {CustomName:"changer",Duration:1}
execute @a ~ ~ ~ tp @e[type=area_effect_cloud,name=changer,c=-1]
scorebord players set @e[type=area_effect_cloud,name=timer,score_delay_min=100] delay 0
20游戏刻为一秒,延迟的值在100处改为20*想要延迟的秒数
这是互换最近俩玩家位置的思路,有需要题主可以自己小改一下
很多人应该都会想到找个中间者来实现,但「先把A tp到B 再把B tp到A」 这种常识上一看就是错的做法,的确是可行的。
假设我现在要将一个tag为a的人与tag为b的人调换位置
如果在两个命令方块分别输入
tp @e[limit=1,tag=a] @e[limit=1,tag=b]
tp @e[limit=1,tag=b] @e[limit=1,tag=a]
然后依次运行,结果很显然,a被tp到b后,b又tp到a,b肯定是在原位
然而,如果我们定义函数minecraft:tp
tp @s @e[limit=1,tag=b]
tp @e[limit=1,tag=b] ~ ~ ~
然后使用execute as @e[limit=1,tag=a] at @s run function tp调用
看上去和上面的方法并无二致,但却的确能实现调换两者位置的目的
这是因为一个function在运行时会被赋予命令环境,如执行坐标(即at),执行者(即as)等等。而~ ~ ~指代的便是命令环境中的执行坐标,也就是execute中at后的@s在命令执行开始时的坐标。在第一次tp后,虽然执行者@s的坐标发生了改变,但命令环境未发生改变,也就是说~ ~ ~指代的仍然是@s在命令执行开始时的坐标。因此第二次tp可以将b传送到a原来的位置。
再比如,如果把函数tp改成:
tp @s @e[limit=1,tag=b]
tp @e[limit=1,tag=b] @s
那么将会失败,因为第二次tp时@s的坐标已经改变
至于每经过一段时间触发的问题,各位大佬已经说的很清楚了,schedule或者scoreboard都可以实现,我这里不再赘述
a的xyz坐标增加b,b的xyz坐标设为a-b,a的xyz坐标设为a-b。
- execute as 玩家1 at @s run summon minecraft:armor_stand ~ ~ ~ {Tags:[SwapTemp]}
- tp 玩家1 玩家2
- tp 玩家2 @e[tag=SwapTemp, limit=1]
- kill @e[tag=SwapTemp]
这个armor_stand可以换
玩家1和玩家2换成名字或者选择器
未测
现有待传送玩家A和B
创建计分板计时器,检测分数达成后
创建隐形盔甲架C传送到传送到A上,然后把A传送至B再把B传送到C,最后清除盔甲架C
推荐阅读: