Отловить взрыв

Версия Minecraft
1.7.10
API
Forge
290
5
80
Добрый день!
Есть способ отловить взрыв, чтоб он не сломал блоки?
Искал в самом майне, ничего не нашёл :)
Проще говоря, мне нужно написать метод/эвент который будет отлавливать взрыв и в нужных мне местах по координатам не ломать блоки.

Менять работу тнт или крипера не вижу смысла, т.к в других модах полно вещей, которые взрываются ломая блоки(тот же ядерный реактор из IC2)
 
Полностью убрать взрывы одним хуком нельзя т.к. взрыв это замена блоков на воздух по определенному алгоритму в том числе самописному, чтобы убрать все взрывы нужно лезть в код модов и менять его, менять код майна имеет смысл, т.к. не каждый мододел будет писать свой алгоритм взрыва и может использоваться ванильный.

Либо можешь сделать какой нибудь мега жёсткий алгоритм который будет смотреть на поломку блоков и если она похожа на взрыв то отменять еë
 
Последнее редактирование:
Explosion никаких ивентов не отправляет
Может я как-то не так понял вопрос, но отправляет же.
мне нужно написать метод/эвент который будет отлавливать взрыв и в нужных мне местах по координатам не ломать блоки
Писать ничего не нужно, за вас всё уже сделано в Forge:
Kotlin:
@SubscribeEvent
fun onExplode(e: ExplosionEvent.Detonate) {
    e.affectedBlocks.removeIf { pos ->
        pos.chunkPosY % 2 == 0
    }
}
 
Добрый день!
Есть способ отловить взрыв, чтоб он не сломал блоки?
Искал в самом майне, ничего не нашёл :)
Проще говоря, мне нужно написать метод/эвент который будет отлавливать взрыв и в нужных мне местах по координатам не ломать блоки.

Менять работу тнт или крипера не вижу смысла, т.к в других модах полно вещей, которые взрываются ломая блоки(тот же ядерный реактор из IC2)
OnExplosions:
 @SubscribeEvent
    public void onExplosion(ExplosionEvent.Detonate event) {
        BlockPos explosionPos = new BlockPos(event.getExplosion().getPosition()); // Преобразуем Vec3d в BlockPos
        ChunkPos chunkPos = new ChunkPos(explosionPos); // Получаем ChunkPos из BlockPos

        // Проверка, принадлежит ли взрыв чанк города
        City city = CityManager.getCityByChunk(chunkPos);
        boolean inCity = (city != null && city.isChunkClaimed(chunkPos));

        // Создаём временный список для хранения затронутых блоков, которые нужно удалить
        List<BlockPos> blocksToRemove = new ArrayList<>();

        // Проверка, затрагивает ли взрыв какие-либо блоки в зачищенных чанках
        for (BlockPos pos : event.getAffectedBlocks()) {
            ChunkPos affectedChunk = new ChunkPos(pos); // Получаем ChunkPos затронутого блока
            City affectedCity = CityManager.getCityByChunk(affectedChunk); // Проверяем, принадлежит ли затронутый чанк городу

            // Если взрыв происходит в городе
            if (inCity) {
                if (affectedCity != null && affectedCity.isChunkClaimed(affectedChunk)) {
                    // Если взрыв затрагивает зачищенный чанк, добавляем затронутый блок в список для удаления
                    if (!city.areExplosionsAllowed()) {
                        blocksToRemove.add(pos); // Блок добавляется в список на удаление
                    }
                }
            } else { // Если взрыв происходит за пределами города
                if (affectedCity != null && affectedCity.isChunkClaimed(affectedChunk)) {
                    // Если взрыв затрагивает зачищенный чанк, добавляем затронутый блок в список для удаления
                    blocksToRemove.add(pos); // Блок добавляется в список на удаление
                }
            }
        }

        // Удаляем затронутые блоки после итерации
        event.getAffectedBlocks().removeAll(blocksToRemove);
    }
Это хоть и на 1.12.2 но может по аналогии поймешь.
 
В общем, заключаю сея поиск тем, что решил использовать через EntityJoinWolrdEvent
Когда спавнится EntityTNT возле места где нельзя ему быть, просто его килять)
Идея вроде прикольная, она даже рабочая, но у нас существуют другие моды, а там у большинства своя реализация и собственно такой вариант решения не совсем подходит)
ExplosionEvent не существует на моей версии, поэтому увы, буду плагином уже тогда далее делать, хоть это было и нежелательно.
Всем ещё раз спасибо)
 
Назад
Сверху