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✓, amatrunc(−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 ofset15, 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ım | doğru | saf |
|---|---|---|
| chunk | floor(−1290/16) = −81 | trunc = −80 ✗ |
| chunk içi ofset | 6 | −1290 % 16 = −10 ✗ |
| bölge | floor(−81/32) = −3 | trunc = −2 ✗ |
| bölge içi ofset | 15 | −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→ Nether125→ geri1000✓ - Overworld
1007→ Nether125→ blok koordinatı1000der ✗ — 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.