几个指令组合在一起的


(假设这个时间是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


推荐阅读:
相关文章