MC Toolkit

Rehberler / Komutlar ve Veriler

Negatif koordinatlar chunk matematiğini iki yerde bozuyor, tek yerde değil

Kırpma yönlü bölme, −1 bloğunu −1 yerine 0. chunk'a koyuyor ve düz bir % işlemi 15 yerine −1'lik chunk içi ofset veriyor. İkisi de hatalı ve ikisi de spawn'ın batısına gidene kadar doğru görünüyor.

Her chunk hesaplaması pozitif çeyrekte önemsiz, diğer üçünde ise yanlıştır. Tam olarak iki yerde bozulur, bunlar birbirinden bağımsızdır ve ikisi de akla yatkın görünen sonuçlar üretir.

İki işlem

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

Bölge koordinatları aynı çiftin bir üst seviyesidir; 16 yerine 32 kullanılır:

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

Yani bir bölge 32 × 32 chunk, yani 512 × 512 bloktur.

Her biri nerede ısırıyor

Bölme. Çoğu dil sıfıra doğru kırpar, floor ise negatif sonsuza yuvarlar. Pozitiflerde anlaşırlar, tam kat olmayan her negatifte ayrılırlar:

  • blok −1 → floor(−1/16) = −1 ✓, ama trunc(−1/16) = 0 ✗

−1 bloğu başlangıç noktasının bir blok batısındadır ve −1. chunk'a aittir. Kırpma onu +1 bloğunun yanına, 0. chunk'a koyar. Her negatif chunk indeksi bir fazla çıkar.

Kalan. JavaScript, Java, C ve çoğu diğer dilde % sol operandın işaretini korur:

  • blok −1 → doğru ofset 15, ama −1 % 16 = −1 ✗

−1'lik bir ofset, 16 genişliğindeki bir chunk'ın içinde bir konum değildir. Bir blok dizisini bununla indekslemek ya hata fırlatır ya da sessizce yanlış hücreyi okur.

İşlenmiş bir örnek

Tek bir eksende −1290 bloğu:

adımdoğrusaf
chunkfloor(−1290/16) = −81trunc = −80 ✗
chunk içi ofset6−1290 % 16 = −10 ✗
bölgefloor(−81/32) = −3trunc = −2 ✗
bölge içi ofset15−81 % 32 = −17 ✗

Dört değer, dört yanlış cevap; hiçbiri bariz şekilde bozuk görünecek kadar aralık dışında değil. −3 bölgesi −96 ile −65 arasındaki chunk'ları kapsar ve −81. chunk başlangıcından 15 içeride oturur — düzeltilmiş kalanın döndürdüğü tam değer de budur.

Nether dönüşümü tek yönde kayıplıdır

Overworld'den Nether'a geçiş 8'e böler ve o da aşağı yuvarlar:

netherX = floor(overworldX / 8)

Geri dönerken tam konumunuz 8 ile çarpılır, yani Nether'daki 125 bloğunun tamamı, o bloğun neresinde durduğunuza bağlı olarak 1000–1007 arasında bir yere eşlenir. Bu, blok koordinatları için gidiş-dönüş değildir. floor kalanı atar:

  • Overworld 1000 → Nether 125 → geri 1000 ✓
  • Overworld 1007 → Nether 125 → blok koordinatı 1000 der ✗ — yedi blok eksik

Hata eksen başına 0 ile 7 blok arasındadır, yani aynı anda X'te 7 ve Z'de 7'ye kadar. Hassas portal bağlamanın Nether koordinatını yeniden türetmek yerine yazılı tutmasının tüm sebebi budur: böldükten sonra geldiği overworld konumu artık kurtarılamaz.

Bir Nether merkezi için bu nadiren önemlidir — 7 blok bir portalın kendi yakalama yarıçapı içindedir. Birbirinin trafiğini çalmaması gereken iki portalı bağlamak içinse çok şey ifade eder.

Negatif overworld koordinatları işi tanıdık şekilde daha da kötüleştirir: overworld −1 Nether'da floor(−1/8) = −1 verirken, kırpma 0 verir ve sizi eksenin yanlış tarafına gönderir.

Koordinat araç kutusu →

Daha fazla rehber

Tümünü gör →