1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Copter533, 9 сен 2023.

  1. Автор темы
    Copter533

    Copter533 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Copter533
    До этого я пробовал это:

    PHP:
    for (int axis 0axis 3axis++)
    for (
    int offset = -1offset <= -1offset+=2) {
       
    int[] coords = new int[]{000};
       
    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.FIRETblock.setType(Material.AIR);
    Но оно не тушит
     
  2. DestKoder

    DestKoder Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    DestKoder
    А ты уверен что оно доходит до стадии тушения? К слову момент

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

    Copter533 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Copter533
    там была 1, но я уже решил эту проблему. В ивенте поджога блока, event.getIgnitingBlock (или как-то так, по памяти пишу) нужно было поставить тип на воздух
     
  4. H4kt

    H4kt Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    H4kt
    Еще проще можно отменить событие
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    В данном случае вместо работы с оффсетами лучше использовать метод
    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.NORTHBlockFace.EASTBlockFace.SOUTHBlockFace.WESTBlockFace.UPBlockFace.DOWN};

    private 
    void extinguish(Block block) {
        for (
    BlockFace face RELATIVE_FACES) {
            
    Block relative block.getRelative(face);
            if (
    relative.getType() == Material.FIRErelative.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 = (Firerelative.getBlockData();
            if (!
    fire.hasFace(face.getOppositeFace())) continue;
            
    relative.setType(Material.AIR);
        }
    }
    Но, как уже сказали выше, можно просто отменять сожжение блока при помощи BlockIgniteEvent. Правда в этом случае всё равно блоки огня будут визуально присутствовать рядом с целевым блоком
     
    Последнее редактирование: 11 сен 2023

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