MC Toolkit

Panduan / Perintah & Data

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 ✓, tetapi trunc(−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 benar 15, 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:

langkahbenarnaif
chunkfloor(−1290/16) = −81trunc = −80 ✗
offset dalam chunk6−1290 % 16 = −10 ✗
regionfloor(−81/32) = −3trunc = −2 ✗
offset dalam region15−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 → Nether 125 → kembali ke 1000 ✓
  • Overworld 1007 → Nether 125 → koordinat bloknya menyatakan 1000 ✗ — 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.

Kotak alat koordinat →

Panduan lainnya

Lihat semua →