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

В разработке Кодинг Плагинов, как отменить взрыв блока и его перемещение поршнями?

Ratewio

Активный участник
Заблокирован
Пользователь
Баллы
61
Имя в Minecraft
Ratewio
к примеру нужно запретить взрыв и смещение алмазного блока
пробовал:

Код:
public void ExplodeBlock(EntityChangeBlockEvent  event) {
       Block block = event.getBlock();
       final String name = block.getType().toString();
       if(name.equalsIgnoreCase("DIAMOND_BLOCK")) {
           event.setCancelled(true);
       }
   }
и

Код:
@EventHandler
   public void ExplodeBlock(EntityChangeBlockEvent event) {
       if(event.getEntityType()==EntityType.PRIMED_TNT) {
           if(event.getBlock().getType() == Material.DIAMOND_BLOCK) {
               event.setCancelled(true);
           }
       }
   }
попробовал также и EntityType.MINECART_TNT

я начинающий, так что сильно камнями не кидайтесь
 
Для сдвига точно есть отдельный евент, для взрыва, думаю, тоже. А EntityChangeBlockEvent - это вообще другое
 
Проверяй наличие блоков алмазов в событиях BlockPistonExtendEvent и BlockPistonRetractEvent, и если есть - отменяй событие; для взрывов - убирай из списка взрывающихся блоков блоки алмазов в EntityExplodeEvent и BlockExplodeEvent.
 
Проверяй наличие блоков алмазов в событиях BlockPistonExtendEvent и BlockPistonRetractEvent, и если есть - отменяй событие; для взрывов - убирай из списка взрывающихся блоков блоки алмазов в EntityExplodeEvent и BlockExplodeEvent.

я пробовал сделать @EventHandler с event'ом BlockPistonExtendEvent и с BlockPistonRetractEvent тоже, отменял ивент: event.setCancelled(true) - всё рано не робит, поршни двигают
 
Покажи, что писал. Желательно и код, где регистрируешь слушатели.
у меня два класса:
Main:
Код:
public class Main extends JavaPlugin {
    public static String[] ProtectionBlocksNames = new String[] {"DIAMOND_BLOCK"};
    public static Integer[] ProtectionBlocksRadius = new Integer[] {7};
    Logger l = Logger.getLogger("Minecraft");
    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(new ProtectionBlockEvents(), this);
        Log.info("[PBP] Protection Block Plus enabled!");
    }
    @Override
    public void onDisable() {
        Log.info("[PBP] Protection Block Plus disabled!");
    }
}

и ProtectionBlockEvents:
Код:
public class ProtectionBlockEvents implements Listener{
    ArrayList<Integer[]> DB_b = new ArrayList<Integer[]>();
    ArrayList<Player[]> DB_p = new ArrayList<Player[]>();
//здесь я пытался и пытаюсь отменить взрыв блока и т.п:
    @EventHandler
    public void ExplodeBlock(EntityChangeBlockEvent event) {
        if(event.getBlock().getType().toString().equalsIgnoreCase("DIAMOND_BLOCK")) {
            event.setCancelled(true);
        }
    }
    @EventHandler
    public void PlaceBlock(BlockPlaceEvent event) {
        Player player = event.getPlayer();
        Block block = event.getBlock();
        final int X = block.getX();
        final int Y = block.getY();
        final int Z = block.getZ();
        final String name = block.getType().toString();
        int radius;
        if(CanEventHere(player, X, Y, Z)) {
            if((radius=GetProtectionBlockRadius(name))!=-1) {
                if(CanCreateRegion(X, Y, Z, radius)) {
                    CreateRegion(player, X, Y, Z, radius);
                    player.sendMessage("area created!");
                }else {
                    event.setCancelled(true);
                    player.sendMessage("areas crossing!");
                }
            }
        }else {
            event.setCancelled(true);
            player.sendMessage("u cant place a block here!");
        }
    }
    @EventHandler
    public void BreakBlock(BlockBreakEvent event) {
        Player player = event.getPlayer();
        Block block = event.getBlock();
        final int X = block.getX();
        final int Y = block.getY();
        final int Z = block.getZ();
        final String name = block.getType().toString();
        int radius;
        if(CanEventHere(player, X, Y, Z)) {
            if((radius=GetProtectionBlockRadius(name))!=-1) {
                if(DeleteRegion(X, Y, Z, radius)) {
                    player.sendMessage("area succefily deleted!");
                }else {
                    player.sendMessage("Its block didnt be a protection, any areas r not deleted :/");
                }
            }
        }else {
            event.setCancelled(true);
            player.sendMessage("u cant place a block here!");
        }
    }
всё скидыватьл не буду, зачем тонна лишнего
 
у меня два класса:
Main:
Код:
public class Main extends JavaPlugin {
    public static String[] ProtectionBlocksNames = new String[] {"DIAMOND_BLOCK"};
    public static Integer[] ProtectionBlocksRadius = new Integer[] {7};
    Logger l = Logger.getLogger("Minecraft");
    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(new ProtectionBlockEvents(), this);
        Log.info("[PBP] Protection Block Plus enabled!");
    }
    @Override
    public void onDisable() {
        Log.info("[PBP] Protection Block Plus disabled!");
    }
}

и ProtectionBlockEvents:
Код:
public class ProtectionBlockEvents implements Listener{
    ArrayList<Integer[]> DB_b = new ArrayList<Integer[]>();
    ArrayList<Player[]> DB_p = new ArrayList<Player[]>();
//здесь я пытался и пытаюсь отменить взрыв блока и т.п:
    @EventHandler
    public void ExplodeBlock(EntityChangeBlockEvent event) {
        if(event.getBlock().getType().toString().equalsIgnoreCase("DIAMOND_BLOCK")) {
            event.setCancelled(true);
        }
    }
    @EventHandler
    public void PlaceBlock(BlockPlaceEvent event) {
        Player player = event.getPlayer();
        Block block = event.getBlock();
        final int X = block.getX();
        final int Y = block.getY();
        final int Z = block.getZ();
        final String name = block.getType().toString();
        int radius;
        if(CanEventHere(player, X, Y, Z)) {
            if((radius=GetProtectionBlockRadius(name))!=-1) {
                if(CanCreateRegion(X, Y, Z, radius)) {
                    CreateRegion(player, X, Y, Z, radius);
                    player.sendMessage("area created!");
                }else {
                    event.setCancelled(true);
                    player.sendMessage("areas crossing!");
                }
            }
        }else {
            event.setCancelled(true);
            player.sendMessage("u cant place a block here!");
        }
    }
    @EventHandler
    public void BreakBlock(BlockBreakEvent event) {
        Player player = event.getPlayer();
        Block block = event.getBlock();
        final int X = block.getX();
        final int Y = block.getY();
        final int Z = block.getZ();
        final String name = block.getType().toString();
        int radius;
        if(CanEventHere(player, X, Y, Z)) {
            if((radius=GetProtectionBlockRadius(name))!=-1) {
                if(DeleteRegion(X, Y, Z, radius)) {
                    player.sendMessage("area succefily deleted!");
                }else {
                    player.sendMessage("Its block didnt be a protection, any areas r not deleted :/");
                }
            }
        }else {
            event.setCancelled(true);
            player.sendMessage("u cant place a block here!");
        }
    }
всё скидыватьл не буду, зачем тонна лишнего
Собственно, не вижу варианта с поршнем. В любом случае, это должно быть как-то так:
PHP:
public void onPistonExtend(BlockPistonExtendEvent event) {
    if (checkBlocks(event.getBlocks())) event.setCancelled(true);
}

public void onPistonRetract(BlockPistonRetractEvent event) {
    if (checkBlocks(event.getBlocks())) event.setCancelled(true);
}

private static boolean checkBlocks(List<Block> blocks) {
    for (Block block : blocks) if (block.getType() == Material.DIAMOND_BLOCK) return true;
    return false;
}
 

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

Назад
Верх