Koordinat negatif merusak perhitungan chunk di dua tempat, bukan satu
Pembagian pemotongan menempatkan blok −1 di chunk 0 alih-alih −1, dan % biasa menghasilkan offset dalam chunk sebesar −1 alih-alih 15. Keduanya salah, dan keduanya tampak benar sampai Anda pergi ke barat spawn.
Setiap perhitungan chunk itu sepele di kuadran positif dan salah di tiga kuadran lainnya. Ada tepat dua tempat yang salah, keduanya saling independen, dan keduanya menghasilkan jawaban yang tampak masuk akal.
Dua operasi
chunk = floor(block / 16) not trunc(block / 16)
offset = ((block % 16) + 16) % 16 not block % 16
Koordinat region adalah pasangan yang sama, satu tingkat di atasnya, dengan 32 sebagai ganti 16:
region = floor(chunk / 32) -> r.<x>.<z>.mca
regionOff = ((chunk % 32) + 32) % 32
Jadi satu region adalah 32 × 32 chunk, yaitu 512 × 512 blok.
Di mana masing-masing menggigit
Pembagian. Sebagian besar bahasa memotong ke arah nol, dan floor membulatkan ke arah negatif tak hingga. Keduanya sepakat untuk bilangan positif dan berbeda untuk setiap bilangan negatif yang bukan kelipatan persis:
- blok
−1→floor(−1/16) = −1✓, tetapitrunc(−1/16) = 0✗
Blok −1 berada satu blok di barat titik asal dan termasuk chunk −1. Pemotongan menempatkannya di chunk 0, bersamaan dengan blok +1. Setiap indeks chunk negatif keluar satu terlalu tinggi.
Sisa bagi. Dalam JavaScript, Java, C dan sebagian besar lainnya, % mempertahankan tanda operan kiri:
- blok
−1→ offset yang benar15, tetapi−1 % 16 = −1✗
Offset sebesar −1 sama sekali bukan posisi di dalam chunk selebar 16. Mengindeks array blok dengannya entah melempar error atau diam-diam membaca sel yang salah.
Contoh perhitungan
Blok −1290 pada satu sumbu:
| langkah | benar | naif |
|---|---|---|
| chunk | floor(−1290/16) = −81 | trunc = −80 ✗ |
| offset dalam chunk | 6 | −1290 % 16 = −10 ✗ |
| region | floor(−81/32) = −3 | trunc = −2 ✗ |
| offset dalam region | 15 | −81 % 32 = −17 ✗ |
Empat nilai, empat jawaban salah, tak satu pun cukup di luar rentang untuk tampak jelas rusak. Region −3 mencakup chunk −96 hingga −65, dan chunk −81 berada 15 dari awalnya — yang persis merupakan hasil dari sisa bagi yang telah dikoreksi.
Konversi Nether bersifat lossy di satu arah
Dari Overworld ke Nether dibagi 8, dan juga di-floor:
netherX = floor(overworldX / 8)
Saat kembali, posisi persis Anda dikalikan 8, sehingga seluruh blok Nether 125 memetakan kembali ke suatu tempat di 1000–1007, tergantung di mana Anda berdiri di dalam blok itu. Itu bukan perjalanan bolak-balik untuk koordinat blok. floor membuang sisanya:
- Overworld
1000→ Nether125→ kembali ke1000✓ - Overworld
1007→ Nether125→ koordinat bloknya menyatakan1000✗ — kurang tujuh blok
Errornya 0 hingga 7 blok per sumbu, jadi hingga 7 pada X dan 7 pada Z sekaligus. Itulah alasan utama mengapa penautan portal yang presisi memerlukan koordinat Nether yang dicatat alih-alih diturunkan ulang: setelah Anda membaginya, posisi overworld asalnya tidak lagi dapat dipulihkan.
Untuk hub Nether, hal ini jarang penting — 7 blok masih di dalam radius tangkap portal itu sendiri. Untuk menautkan dua portal yang tidak boleh saling mencuri lalu lintas, ini sangat penting.
Koordinat overworld negatif memperburuknya dengan cara yang sudah familiar: overworld −1 menghasilkan Nether floor(−1/8) = −1, sementara pemotongan menghasilkan 0 dan mengirim Anda ke sisi sumbu yang salah.