MC Toolkit

Hướng dẫn / Lệnh & dữ liệu

Tọa độ âm phá vỡ phép tính chunk ở hai chỗ, không phải một

Phép chia cắt cụt đặt block −1 vào chunk 0 thay vì −1, và phép % thông thường cho ra độ lệch trong chunk là −1 thay vì 15. Cả hai đều sai, và cả hai đều trông đúng cho đến khi bạn đi về phía tây của spawn.

Mọi phép tính chunk đều đơn giản ở góc phần tư dương và sai ở ba góc còn lại. Có đúng hai chỗ nó sai, chúng độc lập với nhau, và cả hai đều cho ra kết quả trông có vẻ hợp lý.

Hai phép toán

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

Tọa độ region cũng là cặp tương tự, cao hơn một cấp, với 32 thay vì 16:

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

Vậy một region là 32 × 32 chunk, tức 512 × 512 block.

Mỗi phép toán cắn ở đâu

Phép chia. Hầu hết ngôn ngữ đều cắt cụt về phía không, còn floor làm tròn về phía âm vô cực. Chúng khớp nhau với số dương và bất đồng với mọi số âm không phải bội số chính xác:

  • block −1 → floor(−1/16) = −1 ✓, nhưng trunc(−1/16) = 0 ✗

Block −1 nằm cách gốc tọa độ một block về phía tây và thuộc về chunk −1. Phép cắt cụt đặt nó vào chunk 0, cùng chỗ với block +1. Mọi chỉ số chunk âm đều bị cao hơn một đơn vị.

Phép lấy dư. Trong JavaScript, Java, C và hầu hết các ngôn ngữ khác, % giữ dấu của toán hạng bên trái:

  • block −1 → độ lệch đúng 15, nhưng −1 % 16 = −1 ✗

Độ lệch −1 hoàn toàn không phải là một vị trí bên trong chunk rộng 16. Dùng nó để đánh chỉ số vào mảng block sẽ hoặc ném lỗi, hoặc âm thầm đọc nhầm ô.

Một ví dụ cụ thể

Block −1290 trên một trục:

bướcđúngngây thơ
chunkfloor(−1290/16) = −81trunc = −80 ✗
độ lệch trong chunk6−1290 % 16 = −10 ✗
regionfloor(−81/32) = −3trunc = −2 ✗
độ lệch trong region15−81 % 32 = −17 ✗

Bốn giá trị, bốn kết quả sai, không cái nào vượt ngoài phạm vi đủ để trông rõ ràng là hỏng. Region −3 trải từ chunk −96 đến −65, và chunk −81 nằm cách điểm bắt đầu của nó 15 đơn vị — đúng bằng những gì phép lấy dư đã sửa trả về.

Chuyển đổi Nether bị mất mát theo một chiều

Từ Overworld sang Nether chia cho 8, và nó cũng làm tròn xuống:

netherX = floor(overworldX / 8)

Quay trở lại thì nhân vị trí chính xác của bạn với 8, nên toàn bộ block 125 của Nether ánh xạ ngược về một chỗ nào đó trong 1000–1007, tùy vào việc bạn đứng ở đâu trong block đó. Đó không phải là một vòng khứ hồi cho tọa độ block. floor ném đi phần dư:

  • Overworld 1000 → Nether 125 → quay lại 1000 ✓
  • Overworld 1007 → Nether 125 → tọa độ block cho ra 1000 ✗ — thiếu bảy block

Sai số là 0 đến 7 block mỗi trục, nên tối đa 7 trên X và 7 trên Z cùng lúc. Đó chính là lý do vì sao việc liên kết portal chính xác cần ghi lại tọa độ Nether thay vì tính lại từ đầu: một khi đã chia, vị trí overworld mà nó xuất phát thì không còn khôi phục được nữa.

Với một hub Nether thì điều này hiếm khi quan trọng — 7 block nằm trong bán kính bắt của chính portal. Với việc liên kết hai portal mà không được cướp traffic của nhau, nó lại rất quan trọng.

Tọa độ overworld âm làm mọi thứ tệ hơn theo cách quen thuộc: overworld −1 cho Nether floor(−1/8) = −1, trong khi phép cắt cụt cho 0 và đưa bạn sang nhầm phía của trục.

Bộ công cụ tọa độ →

Hướng dẫn khác

Xem tất cả →