Поясню примером.
Рассматриваем мир в 2D, без учёта высоты
y.
Допустим, карта имеет координаты min (
x = -4789,
z = -2050); max (
x = 3765,
z = 1023).
Плоскость мира делится на чанки блоков, размером по 16×16 блоков.
Блок с координатой (0; 0) находится в чанке с координатой (0; 0) и имеет координату внутри этого чанка (0; 0).
Блок с координатой (16; 15) находится в чанке с координатой (1; 0) и имеет координату внутри чанка (0; 15).
Имея только координаты блока
bx и
bz мы можем найти координаты чанка
cx и
cz и координаты блока внутри чанка
bcx и
bcz (я буду писать формулы только для x, т.к. для
z они отличаются только буквой
z):
cx = bx / 16 (целочисленное деление),
bcx = bx % 16 (остаток от целочисленного деления).
Обратно, если мы знаем координату чанка и координату блока внутри чанка, мы можем найти абсолютное положение блока в мире:
bx = cx * 16 + bcx.
Интереснее с отрицательной стороны координаты: если по формуле выше получается
bcx < 0, то нужно сделать { bcx += 16; cx -= 1; }, чтобы привести координату блока в чанке в допустимые пределы [0; 15].
Найдём границы условного мира в чанках. Сперва для отрицательного угла:
cx1 = -4789 / 16 = -299; bcx = -4789 % 16 = -5.
Применим фикс:
cx1 = -300, bcx = 11.
Аналогично находим для координаты
z:
cz1 = -129; bcz1 = 14.
Для положительного угла:
cx2 = 235; cz2 = 63. Я опускаю координаты блоков, так как они дальше никуда не сдались.
Помним, что сервер не умеет работать с неполными чанками.
Наш мир в чанках имеет следующие размеры:
min (-300; -129); max (235; 63) — это то, что мы искали.
Если интересна, то вот площадь мира в чанках:
(235 - (-300) + 1) × (63 - (-129) + 1) = 103 448 чанка.
Java:
// Исходные данные: координаты угловых блоков мира
void aaa(long minX, long minZ, long maxX, long maxZ) {
// Вычисление границ мира в чанках
long minCX = minX / 16;
long minCZ = minZ / 16;
long maxCX = maxX / 16;
long maxCZ = maxZ / 16;
if(minX % 16 < 0)
minCX -= 1;
if(minZ % 16 < 0)
minCZ -= 1;
// Дальше можно итерировать по ним
for(long CZ = minCZ; CZ <= maxCZ; CZ++)
for(long CX = minCX; CX <= maxCX; CX++)
{
// CX и CZ -- координата очередного чанка, принадлежащего имеющейся карте.
// Надо их все запомнить куда-то для последующей обработки.
}
}