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
−1→floor(−1/16) = −1✓, aletrunc(−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ęcie15, 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:
| krok | poprawne | naiwne |
|---|---|---|
| chunk | floor(−1290/16) = −81 | trunc = −80 ✗ |
| przesunięcie w chunku | 6 | −1290 % 16 = −10 ✗ |
| region | floor(−81/32) = −3 | trunc = −2 ✗ |
| przesunięcie w regionie | 15 | −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→ Nether125→ z powrotem do1000✓ - Zwykły Świat
1007→ Nether125→ z powrotem do1000✗ — 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.