MC Toolkit

Guias / Comandos e dados

Coordenadas negativas quebram a matemática dos chunks em dois lugares, não em um

A divisão por truncamento coloca o bloco -1 no chunk 0 em vez de -1, e um % simples dá um deslocamento dentro do chunk de -1 em vez de 15. Ambos estão errados e parecem corretos até você ir para o oeste do spawn.

Todo cálculo de chunk é trivial no quadrante positivo e errado nos outros três. Há exatamente dois lugares onde ele erra, eles são independentes um do outro, e ambos produzem respostas que parecem plausíveis.

As duas operações

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

As coordenadas de região são o mesmo par, um nível acima, com 32 em vez de 16:

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

Assim, uma região é de 32 × 32 chunks, o que equivale a 512 × 512 blocos.

Onde cada uma falha

Divisão. A maioria das linguagens trunca em direção a zero, e floor arredonda em direção ao infinito negativo. Elas concordam para números positivos e discordam para todo número negativo que não seja um múltiplo exato:

  • bloco −1floor(−1/16) = −1 ✓, mas trunc(−1/16) = 0

O bloco -1 está um bloco a oeste da origem e pertence ao chunk -1. O truncamento o coloca no chunk 0, ao lado do bloco +1. Todo índice de chunk negativo sai um a mais.

Resto. Em JavaScript, Java, C e na maioria das outras linguagens, % mantém o sinal do operando esquerdo:

  • bloco −1 → deslocamento correto 15, mas −1 % 16 = −1

Um deslocamento de -1 não é uma posição dentro de um chunk de 16 de largura. Indexar um array de blocos com ele ou gera um erro ou lê silenciosamente a célula errada.

Um exemplo prático

Bloco -1290 em um eixo:

passocorretoingênuo
chunkfloor(−1290/16) = -81trunc = -80 ✗
deslocamento no chunk6−1290 % 16 = -10 ✗
regiãofloor(−81/32) = -3trunc = -2 ✗
deslocamento na região15−81 % 32 = -17 ✗

Quatro valores, quatro respostas erradas, nenhuma delas fora do intervalo o suficiente para parecer obviamente quebrada. A região -3 abrange os chunks de -96 a -65, e o chunk -81 está 15 posições a partir do seu início — que é exatamente o que o resto corrigido retorna.

A conversão do Nether é com perda em uma direção

Do Overworld para o Nether, divide-se por 8, e também se arredonda para baixo (floor):

netherX = floor(overworldX / 8)

Voltar multiplica por 8. Isso não é uma viagem de ida e volta. floor descarta o resto, então o retorno o leva a um múltiplo de 8:

  • Overworld 1000 → Nether 125 → de volta para 1000
  • Overworld 1007 → Nether 125 → de volta para 1000 ✗ — sete blocos a menos

O erro é de 0 a 7 blocos por eixo, então até 7 em X e 7 em Z ao mesmo tempo. Essa é a razão pela qual a ligação precisa de portais exige que a coordenada do Nether seja anotada em vez de ser recalculada: uma vez que você dividiu, a posição do Overworld de onde ela veio não é mais recuperável.

Para um hub no Nether, isso raramente importa — 7 blocos estão dentro do raio de captura de um portal. Para ligar dois portais que não devem "roubar" o tráfego um do outro, isso importa muito.

Coordenadas negativas no Overworld pioram a situação da maneira familiar: Overworld −1 resulta em Nether floor(−1/8) = −1, enquanto o truncamento resulta em 0 e o envia para o lado errado do eixo.

Caixa de ferramentas de coordenadas →

Mais guias

Ver todos →

Procurando mais ferramentas de Minecraft?

Um conjunto de geradores, visualizadores e conversores que rodam no navegador — tudo grátis.