(1.16.2) Qual è il modo più efficiente per / diffondere i giocatori in una dimensione diversa?

Aug 24 2020

Sto cercando di teletrasportare istantaneamente tutte le entità che viaggiano nel Nether in una posizione casuale nell'Overworld.

Il /spreadplayerscomando è perfetto per la posizione casuale:

spreadplayers 0 0 0 45 under 30 false @s

E posso rilevare qualsiasi entità nel nether con un predicato:

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "location": {
      "dimension": "minecraft:the_nether"
    }
  }
}

Così: spreadplayers 0 0 0 45 under 30 false @e[predicate=namespace:in_nether]

Sfortunatamente, questo comando diffonde tutte le entità in modo casuale intorno a 0x 0z nel Nether, non nell'Overworld.


Ho quindi provato:

execute in minecraft:overworld run spreadplayers 0 0 0 45 under 30 false @e[predicate=namespace:in_nether]

Il risultato è stato lo stesso.


Ho deciso di fare dei test, quindi ho sostituito il primo comando /spreadplayerscon /tp:

tp @e[predicate=namespace:in_nether] 0 1 0

Ha funzionato perfettamente. Tutte le entità che hanno viaggiato nel Nether sono state immediatamente teletrasportate in Overworld 0x 1y 0z.


Sembrava che /tpfunzionasse diversamente da /spreadplayers. Quindi, il mio prossimo tentativo è stato di inserire i seguenti comandi in una funzione che ho chiamato portal:

tp @s 0 1 0
spreadplayers 0 0 0 45 under 30 false @s

Ho eseguito questa funzione ogni tick:

execute as @e[predicate=namespace:in_nether] run function namespace:portal

Ha funzionato: ogni volta che il mio giocatore ha attraversato il portale, è stato immediatamente teletrasportato su Overworld 0x 1y 0z e poi si è diffuso casualmente in Overworld 0x 0z. Ma poi ho scoperto che sembrava funzionare solo per il mio lettore .

Quando qualsiasi altro tipo di entità viaggiava nel Nether, veniva teletrasportato nell'Overworld 0x 1y 0z, ma non si diffondeva in modo casuale.


Ho finalmente trovato una soluzione funzionante: ( e ha creato un problema tecnico visivo lato client )

tag @e[predicate=namespace:in_nether] add in_nether
tp @e[predicate=namespace:in_nether] 0 1 0
spreadplayers 0 0 0 45 under 30 false @e[tag=in_nether]
tag @e[tag=in_nether] remove in_nether

Questa soluzione è più lenta e complessa di quello che inizialmente pensavo avrebbe funzionato. Non sono sicuro del motivo per cui / spreadplayers si comporta in questo modo, quindi per riaffermare la mia domanda: qual è il modo più efficiente per / spreadplayers in una dimensione diversa? (E perché le mie altre soluzioni più eleganti non hanno funzionato ?!) Grazie

Risposte

ExpertCoder14 Sep 02 2020 at 01:14

La tua idea potrebbe essere la migliore che puoi fare.

Sembra che il nostro amico Fabian Röling abbia segnalato un bug report su questo problema. Poiché è stato confermato come un bug, significa che /spreadplayersnon dovrebbe agire in questo modo.

Pertanto, per rispondere alla tua domanda originale, il modo teorico più efficace per /spreadplayersentrare in una dimensione diversa è una delle tue prove originali:

execute in minecraft:overworld run spreadplayers 0 0 0 45 under 30 false @e[predicate=namespace:in_nether]

Ma a causa del bug, non funziona. E dovevi trovare una soluzione alternativa.