Вопрос Как взрывать только определенные блоки при взрыве динамита

Polik

Пользователь
Сообщения
70
Здравствуйте, я хочу чтобы при взрыве динамита взрывались только определенные блоки, к примеру чтобы при взрыве взрывались только сундуки, а остальные блоки не задевало.
И ещё вопрос как сделать, чтобы когда ты поставил динамит он сразу поджигался?
 
при взрыве динамита взрывались только определенные блоки, к примеру чтобы при взрыве взрывались только сундуки, а остальные блоки не задевало.
EntityExplodeEvent#blockList. Проходишься по каждому блоку, сравнивая его с сундуком. Если сундук, то убираешь из списка; если другой блок - ломаешь его.
Посмотреть реализацию можно, например, здесь:


когда ты поставил динамит он сразу поджигался?
BlockPlaceEvent
Если поставили динамит, то убираешь этот блок (setType(Material.AIR)) и призываешь на том месте динамит.
 
EntityExplodeEvent#blockList. Проходишься по каждому блоку, сравнивая его с сундуком. Если сундук, то убираешь из списка; если другой блок - ломаешь его.
Посмотреть реализацию можно, например, здесь:



BlockPlaceEvent
Если поставили динамит, то убираешь этот блок (setType(Material.AIR)) и призываешь на том месте динамит.
Не понял как мне призвать этот динамит? Убрать то я убрал..
Можно примерный код?
 
Можно примерный код?
Java:
TNTPrimed tnt = event.getBlock().getWorld().spawnEntity(event.getBlock().getLocation().add(0.5, 0, 0.5), EntityType.PRIMED_TNT);
tnt.setSource(Игрок);
tnt.setFuseTicks(через сколько тиков произойдёт бабах);
 
EntityExplodeEvent#blockList. Проходишься по каждому блоку, сравнивая его с сундуком. Если сундук, то убираешь из списка; если другой блок - ломаешь его.
Посмотреть реализацию можно, например, здесь:

Не работает, что я не так сделал?

Java:
    @EventHandler
    public void onExplode(EntityExplodeEvent event) {

        List<Block> bl = new ArrayList<>(event.blockList());

        for (Block b : bl)
        if (b.getType() != Material.CHEST) {
            event.setCancelled(true);
            if (b.getType() == Material.CHEST) {
                event.setCancelled(false);
 
Во-первых, event.setCancelled отменяет весь ивент взрыва.
Во-вторых, тебе надо оставлять/убирать из списка блоки, которые (не) надо взрывать.
В-третьих, Iterator используй, иначе ошибки поплывут (Пример не просто так скидывал).
 
Во-первых, event.setCancelled отменяет весь ивент взрыва.
Во-вторых, тебе надо оставлять/убирать из списка блоки, которые (не) надо взрывать.
В-третьих, Iterator используй, иначе ошибки поплывут (Пример не просто так скидывал).
Извиняюсь за мою возможно тупость, все мы учимся :)
Я не понял как мне убирать со списка или оставлять блоки, в примере он берет строки из конфига насколько я понимаю, а как мне обозначить четкие предметы именно в коде?
 
Извиняюсь за мою возможно тупость, все мы учимся :)
Я не понял как мне убирать со списка или оставлять блоки, в примере он берет строки из конфига насколько я понимаю, а как мне обозначить четкие предметы именно в коде?
"List<Block> bl = new ArrayList<>(event.blockList());" создаст новый список, вам нужно использовать старый "List<Block> bl = event.blockList();".
Переберите все блоки в списке. Для каждого блока проверти является ли материал блока который нужно взорвать или нет. Если нужно более чем один материал удобнее использовать .
Java:
//bl - список блоков, которые взрываются
//block - одно значение из списка bl

//switch для каждого блока
switch (block.getType()){ // Получить материал блока
    case CHEST: //Материалы блоков (которые мы оставляем в списке и взрываем их)
    case TRAPPED_CHEST:
        break; //Остановка выполнения switch если материал соответствует одному из блока
    default: //Все остальные материалы блоков
        bl .remove(block); //Удаляем из списка блоков, которые должны не взрываться
}

//if для каждого блока
if(block.getType() != Material.CHEST)
    blocks.remove(block);
}
 
при взрыве взрывались только сундуки, а остальные блоки не задевало.
Java:
    @EventHandler
    public void onEntityExplode(EntityExplodeEvent e) {
        e.blockList().removeIf(block -> block.getState() instanceof Chest);
    }
 
Java:
    @EventHandler
    public void onEntityExplode(EntityExplodeEvent e) {
        e.blockList().removeIf(block -> block.getState() instanceof Chest);
    }
Так получается внести только 1 блок, я чуть поменял код

Java:
List<Block> bloc = event.blockList();

bloc.removeIf(block -> block.getType() != Material.CHEST);

Но при добавлении 2 блока ничего не происходит :(

Код:
List<Block> bloc = event.blockList();

bloc.removeIf(block -> block.getType() != Material.CHEST);
bloc.removeIf(block -> block.getType() != Material.ACACIA_DOOR);
 
Так получается внести только 1 блок, я чуть поменял код

Java:
List<Block> bloc = event.blockList();

bloc.removeIf(block -> block.getType() != Material.CHEST);
Но при добавлении 2 блока ничего не происходит :(
Java:
    private final List<Material> materials = List.of(Material.CHEST, Material.FURNACE);

    @EventHandler
    public void onBlockExplode(EntityExplodeEvent e) {
        e.blockList().removeIf(block -> materials.contains(block.getType()));
    }
 
Назад
Сверху Снизу