我的世界 我想建一個地圖,用什麼指令能做到在一定秒數後兩個人互換位置?
幾個指令組合在一起的
(假設這個時間是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
推薦閱讀: