Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как потушить блок?

Copter533

Участник
Пользователь
Баллы
31
Имя в Minecraft
Copter533
До этого я пробовал это:

PHP:
for (int axis = 0; axis < 3; axis++)
for (int offset = -1; offset <= -1; offset+=2) {
   int[] coords = new int[]{0, 0, 0};
   coords[axis] = offset;
   Location target = ev.getIgnitingBlock().getLocation();
   target.add(coords[0], coords[1], coords[2]);
   Block Tblock = map_world.getBlockAt(target);
                
    if (Tblock.getType() == Material.FIRE) Tblock.setType(Material.AIR);

Но оно не тушит
 
До этого я пробовал это:

PHP:
for (int axis = 0; axis < 3; axis++)
for (int offset = -1; offset <= -1; offset+=2) {
   int[] coords = new int[]{0, 0, 0};
   coords[axis] = offset;[CODE]for (int offset = -1; offset <= -1; offset+=2)[/CODE]
   Location target = ev.getIgnitingBlock().getLocation();
   target.add(coords[0], coords[1], coords[2]);
   Block Tblock = map_world.getBlockAt(target);
               
    if (Tblock.getType() == Material.FIRE) Tblock.setType(Material.AIR);

Но оно не тушит
А ты уверен что оно доходит до стадии тушения? К слову момент

Код:
for (int offset = -1; offset <= -1; offset+=2)
В чём смысл? int offset = -1; условие выполняется, +2 = 1, не проще сразу написать что offset = 1 ? смысл от цикла?
 
А ты уверен что оно доходит до стадии тушения? К слову момент

Код:
for (int offset = -1; offset <= -1; offset+=2)
В чём смысл? int offset = -1; условие выполняется, +2 = 1, не проще сразу написать что offset = 1 ? смысл от цикла?
там была 1, но я уже решил эту проблему. В ивенте поджога блока, event.getIgnitingBlock (или как-то так, по памяти пишу) нужно было поставить тип на воздух
 
В данном случае вместо работы с оффсетами лучше использовать метод
Block#getRelative(BlockFace)

https://jd.papermc.io/paper/1.16/org/bukkit/block/Block.html#getRelative(org.bukkit.block.BlockFace)

Получится гораздо читабельней:
PHP:
private static final BlockFace[] RELATIVE_FACES = new BlockFace[]{
    BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN};

private void extinguish(Block block) {
    for (BlockFace face : RELATIVE_FACES) {
        Block relative = block.getRelative(face);
        if (relative.getType() == Material.FIRE) relative.setType(Material.AIR);
    }
}

А можно пойти ещё дальше и для более корректной работы проверять, что не просто рядом блок огня, а что он затрагивает именно на целевой блок:
PHP:
private void extinguish(Block block) {
    for (BlockFace face : RELATIVE_FACES) {
        Block relative = block.getRelative(face);
        if (relative.getType() != Material.FIRE) continue;
        Fire fire = (Fire) relative.getBlockData();
        if (!fire.hasFace(face.getOppositeFace())) continue;
        relative.setType(Material.AIR);
    }
}

Но, как уже сказали выше, можно просто отменять сожжение блока при помощи BlockIgniteEvent. Правда в этом случае всё равно блоки огня будут визуально присутствовать рядом с целевым блоком
 
Последнее редактирование:

Поделиться этой страницей

Назад
Верх