幾個指令組合在一起的


(假設這個時間是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


推薦閱讀:
相关文章