Perché la pozione di livello 128 fornisce alcune pozioni a effetti strani?

In Minecraft, alcuni effetti pozione sembrano avere strani effetti se usi il livello 128.

Questo sembra accadere con:

  • Rapidità, alcuni blocchi saranno instabili, alcuni blocchi non possono essere estratti. Anche l'animation a rotazione manuale è molto lenta.
  • Fatica Mineraria, mentre non puoi estrarre nulla come con il livello 127, l'animation a mano libera è sparita.
  • Salta la spinta, non puoi saltare.
  • Rigenerazione, sembra molto più lento del livello 127.
  • Wither, sembra molto più lento del livello 127.
  • Levitazione, sembra aumentare la gravità. Non appena salti o cadi, sei molto più veloce a terra, quindi normale.

Perché la pozione di livello 128 fornisce alcune pozioni a effetti strani e perché non succede con tutte le pozioni?

Ogni effetto pozione viene gestito in modo diverso, ma la cosa importnte da notare è la dimensione della memory.

Internamente l'amplificatore viene memorizzato come un numero integer (minimo di -2,147,483,648, massimo di 2.147.483.647), ma quando si scrive l'amplificatore su NBT viene salvato come un byte (minimo di -128, massimo di 127). Se il valore fornito è al di fuori di tale intervallo, sarà forzato a rientrare in tale intervallo.

Pertanto, quando si tenta di impostare l'amplificatore tramite NBT (ad esempio con /give o /summon ), si è limitati a tale intervallo e il tentativo di superare 127 causerà un overflow a valori negativi (128 diventa -128). Non è ansible get un amplificatore di 128 con NBT.

Ma il command /effect non passa attraverso NBT per assegnare un effetto. Imposta direttamente l'amplificatore (che viene memorizzato come numero integer) e consente di superare il massimo. Tuttavia, se l'entity framework; viene salvata in NBT, l'effetto viene salvato, il che causerà un overflow del valore appropriato, potenzialmente modificando l'effetto dovuto al valore negativo.


Quando si tenta di utilizzare /effect per applicare un amplificatore più alto di 127 su un lettore, al client viene inviato un amplificatore tipizzato a byte tramite il pacchetto SPacketEntityEffect , che riduce l'amplificatore nell'intervallo di byte. Il client e il server stanno combattendo su ciò che il valore deve essere.

Ad esempio, con il seguente:

 /effect @p minecraft:levitation 1 255 

Il server dice "255" (poiché è salvato internamente come numero integer) ma il client sta dicendo "0" (poiché è inviato tramite pacchetto come byte). Il risultato è che il cliente vede se stesso non muoversi. Alcuni problemi vengono di conseguenza, ad esempio l'assunzione di danni farà sì che il giocatore spari in aria nel tentativo di risincronizzare.

Questo è ciò che causa stranezze con i giocatori, ma questo non funziona allo stesso modo con le entity framework; non giocanti. Il loro amplificatore è internamente memorizzato come un numero integer e nessun pacchetto interferisce, consentendo al server il pieno controllo. Se l'entity framework; viene salvata in NBT, ad esempio tramite lo scaricamento di blocchi, l'effetto verrà quindi traboccato nell'intervallo di byte:

 /effect @e[type=Creeper,c=1] minecraft:levitation 1 255