Guides / Commands & Data

Ujemne współrzędne psują matematykę chunków w dwóch, a nie w jednym miejscu

Dzielenie z obcinaniem umieszcza blok −1 w chunku 0 zamiast −1, a zwykłe % daje przesunięcie w chunku −1 zamiast 15. Oba są błędne i oba wyglądają poprawnie, dopóki nie pójdziesz na zachód od spawnu.

Każde obliczenie chunka jest trywialne w dodatnim kwadrancie i błędne w pozostałych trzech. Istnieją dokładnie dwa miejsca, w których jest ono błędne, są one od siebie niezależne i oba dają wyniki, które wyglądają wiarygodnie.

Dwie operacje

chunk  = floor(block / 16)          not  trunc(block / 16)
offset = ((block % 16) + 16) % 16   not  block % 16

Współrzędne regionu to ta sama para, jeden poziom wyżej, z 32 zamiast 16:

region     = floor(chunk / 32)   ->  r.<x>.<z>.mca
regionOff  = ((chunk % 32) + 32) % 32

Zatem region to 32 × 32 chunki, czyli 512 × 512 bloków.

Gdzie każda z nich gryzie

Dzielenie. Większość języków obcina w kierunku zera, a floor zaokrągla w kierunku ujemnej Nieskończoności (Infinity). Zgadzają się dla wartości dodatnich i nie zgadzają się dla każdej wartości ujemnej, która nie jest dokładną wielokrotnością:

  • blok −1floor(−1/16) = −1 ✓, ale trunc(−1/16) = 0

Blok −1 znajduje się jeden blok na zachód od początku i należy do chunka −1. Obcinanie umieszcza go w chunku 0, obok bloku +1. Każdy ujemny indeks chunka wychodzi o jeden za wysoko.

Reszta. W JavaScript, Java, C i większości innych języków, % zachowuje znak lewego operandu:

  • blok −1 → poprawne przesunięcie 15, ale −1 % 16 = −1

Przesunięcie −1 w ogóle nie jest pozycją wewnątrz 16-blokowego chunka. Indeksowanie nim tablicy bloków albo wyrzuca błąd, albo po cichu odczytuje niewłaściwą komórkę.

Przykład

Blok −1290 na jednej osi:

krokpoprawnenaiwne
chunkfloor(−1290/16) = −81trunc = −80 ✗
przesunięcie w chunku6−1290 % 16 = −10 ✗
regionfloor(−81/32) = −3trunc = −2 ✗
przesunięcie w regionie15−81 % 32 = −17 ✗

Cztery wartości, cztery błędne odpowiedzi, żadna z nich nie jest na tyle poza zakresem, by wyglądać na ewidentnie zepsutą. Region −3 obejmuje chunki od −96 do −65, a chunk −81 znajduje się 15 od jego początku — co dokładnie zwraca skorygowana reszta.

Konwersja Netheru jest stratna w jednym kierunku

Przejście ze Zwykłego Świata (Overworld) do Netheru dzieli przez 8 i również zaokrągla w dół:

netherX = floor(overworldX / 8)

Powrót mnoży przez 8. To nie jest podróż w obie strony. floor odrzuca resztę, więc powrót ląduje na wielokrotności 8:

  • Zwykły Świat 1000 → Nether 125 → z powrotem do 1000
  • Zwykły Świat 1007 → Nether 125 → z powrotem do 1000 ✗ — siedem bloków za mało

Błąd wynosi od 0 do 7 bloków na oś, więc do 7 na X i 7 na Z jednocześnie. To jest cały powód, dla którego precyzyjne łączenie portali wymaga zapisania współrzędnych Netheru, a nie ponownego ich wyprowadzania: po podzieleniu, pozycja w Zwykłym Świecie, z której pochodziły, nie jest już do odzyskania.

Dla centrum Netheru rzadko ma to znaczenie — 7 bloków mieści się w promieniu przechwytywania portalu. Dla łączenia dwóch portali, które nie mogą sobie wzajemnie kraść ruchu, ma to ogromne znaczenie.

Ujemne współrzędne Zwykłego Świata pogarszają sytuację w znany sposób: Zwykły Świat −1 daje Nether floor(−1/8) = −1, podczas gdy obcinanie daje 0 i wysyła cię na niewłaściwą stronę osi.

Zestaw narzędzi do współrzędnych →

More guides

Browse all →

Szukasz innych narzędzi do Minecrafta?

Zestaw generatorów, podglądów i konwerterów działających w przeglądarce — wszystkie za darmo.