- Что вы хотите получить
- Подготовьте логику: какие блоки ломать
- Вариант 1 (самый простой для модов): перехват добычи и ручное разрушение соседей
- Вариант 2: сделать “3x3” через разметку области и утилиты добычи
- Пример логики (псевдокод)
- Типичные ошибки
- Как понять, что вы сделали правильно
- Полезные ссылки
Что вы хотите получить
В игре нужно, чтобы при ударе киркой ломались блоки в квадрате 3x3 (центр - это блок, по которому попали). Обычно это делается на уровне мода - перехватом события добычи или обработкой инструмента при клике.
Ниже - рабочие подходы, которые встречаются в моддинге и плагинах. Схема общая, но конкретные классы и хуки зависят от версии Minecraft и от того, делаете вы мод под Forge или Fabric.
Подготовьте логику: какие блоки ломать
При добыче нужно вычислить позиции девяти блоков:
- центр: позиция блока, на который сработал удар
- по X: центр +/- 1
- по Z: центр +/- 1
- по Y: тот же уровень, что и у центра (если вы хотите именно 3x3 на одной плоскости)
Итого координаты:
(x-1, y, z-1) ... (x+1, y, z+1)
Если хотите 3x3 “по направлению” (например, чтобы ломать плоскость перед игроком в зависимости от взгляда), тогда приходится учитывать направление цели. Но для большинства “копает 3 на 3” достаточно ровно одной плоскости в Y.
Вариант 1 (самый простой для модов): перехват добычи и ручное разрушение соседей
Смысл: вы позволяете игре сломать “центр” обычным способом, а затем вручную запускаете разрушение для ещё восьми блоков с тем же шансом/совместимостью, что и у центра.
Шаги
- Найдите, на какой версии вы пишете мод и какой API используете (Forge/Fabric).
- Найдите событие/хук, который вызывается при использовании инструмента по блоку.
- Внутри обработчика:
- берите
BlockPosцели (центр) - соберите сетку 3x3
- для каждого
BlockPos:- проверьте, что блок реально можно ломать киркой (в противном случае кирка будет “магически” разрушать всё)
- сломайте блок или инициируйте добычу в мире так, чтобы выпали предметы как положено
Частые правила для корректной работы
Чтобы кирка не ломала лишнее и не ломала всё “в ноль”:
- проверяйте, что инструмент достаточно эффективен (или хотя бы что это кирка нужного уровня, если вы делаете баланс)
- проверяйте расстояние до блока (иначе получится чит на дальность)
- следите за тем, чтобы не спамить ломанием, если событие вызвалось несколько раз
Вариант 2: сделать “3x3” через разметку области и утилиты добычи
Если у вас уже есть код, который ломает один блок, обычно удобнее обернуть его в функцию:
breakBlockAt(player, pos, tool, fortune/flags)- дальше просто вызываете её 9 раз для позиций 3x3
Так вы сохраните всю вашу текущую логику: выпадение дропа, шанс на ресурсы, обработку “не ломается” и т.д.
Пример логики (псевдокод)
Ниже намеренно не привязан к конкретным пакетам, чтобы вы могли перенести идею в minecraft-мод под вашу версию:
onToolUseOnBlock(player, targetPos, tool):
world = player.world
breakCenter = canBreak(targetPos, tool, player)
if not breakCenter:
return
breakBlockAt(player, targetPos, tool)
for dx in [-1, 0, 1]:
for dz in [-1, 0, 1]:
pos = (targetPos.x + dx, targetPos.y, targetPos.z + dz)
if pos == targetPos:
continue
if canBreak(pos, tool, player):
breakBlockAt(player, pos, tool)
Если ломать нужно “только если центр сломался” - это как раз то, что делает breakCenter и return.
Типичные ошибки
| Ошибка | Как проявляется | Как исправить |
|---|---|---|
Ломаете 3x3 без проверок canBreak |
кирка разрушает блоки, которые не должны ломаться | добавьте проверку, что блок подходит под инструмент и условия |
| Позиция цели берётся не ту | ломает не ту плоскость или смещается | используйте BlockPos именно того блока, по которому сработал удар/целевание |
| Обработчик срабатывает несколько раз | ломание рывками, дубли выпадения, лаги | защититесь флагом на тик/вызов или используйте правильный хук именно на “фактическое” разрушение |
| Ломание сразу девяти блоков “без синхронизации” | визуально игрок бьет один блок, но ломается больше | при необходимости синхронизируйте поведение с механикой добычи или ломайте только после подтверждения |
| Плоскость всегда фиксирована по Y | 3x3 выглядит странно при углах | определите, что вы хотите: строго 3x3 по горизонтали или плоскость перед игроком |
Как понять, что вы сделали правильно
Проверьте на тестовом участке:
- камень с киркой (должно ломаться 9 блоков)
- блоки, которые киркой не ломаются (не должны ломаться в 3x3)
- руды и блоки с дропом (должны выдавать дроп корректно, включая fortune, если вы его поддерживаете)
Полезные ссылки
- Форум с примером идеи “киракой 3x3” для модов: https://forum.mcmodding.ru/threads/kak-sozdat-kirku-kotoraja-kopaet-bloki-3x3.21728/
- Тема про инструменты с областью разрушения на базе команд/средств редактирования (как ориентир по механике области): https://ru-minecraft.ru/forum/showtopic-19677/