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

Помогите Упростить код

Статус
Закрыто для дальнейших ответов.

alekseichik

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
maxicraft2020
Java:
if (b.getType() == Material.WOOL) {
    if (b.getLocation().getX() == config.getInt("XB1P3")) {
        if (b.getLocation().getY() == config.getInt("YB1P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB1P3")) {
                if (random == 0) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.HORSE);
                    p.playEffect(loc, Effect.TILE_BREAK, 1);
                    b.setType(Material.AIR);
                    String PN1 = p.getName();
                    config.set("BlockStopP3", 9);
                    config.set("PlayerP3", PN1);
                }
                if (random == 1) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.BAT);
                    p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                    b.setType(Material.AIR);
                }
            }
        }
    }

    if (b.getLocation().getX() == config.getInt("XB2P3")) {
        if (b.getLocation().getY() == config.getInt("YB2P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB2P3")) {
                int XB2 = config.getInt("XB1P3");
                int YB2 = config.getInt("YB1P3");
                int ZB2 = config.getInt("ZB1P3");
                World w = p.getWorld();
                Location locb2 = new Location(w, XB2, YB2, ZB2);
                config.set("BlockStopP3", 8);
                if (locb2.getBlock().getType() == Material.AIR) {
                    if (random == 0) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                        p.playEffect(loc, Effect.TILE_BREAK, 1);
                        b.setType(Material.AIR);
                    }
                    if (random == 1) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                        p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                        b.setType(Material.AIR);
                    }
                } else {
                    Location loc = b.getLocation();
                    p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
                    e.setCancelled(true);
                    e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                }
            }
        }
    }


1) Можно ли упростить данный код?

2) можно ли вынести Random в отдельный класс , а потом импортировать?(чтобы уменьшить объём кода)
 
Последнее редактирование:
pastebin.com . В таком виде я нихрена не понимаю.
 
Табуляция - ? Так и быть, за тебя сделаю.
Java:
if (b.getType() == Material.WOOL) {
    if (b.getLocation().getX() == config.getInt("XB1P3")) {
        if (b.getLocation().getY() == config.getInt("YB1P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB1P3")) {
                if (random == 0) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.HORSE);
                    p.playEffect(loc, Effect.TILE_BREAK, 1);
                    b.setType(Material.AIR);
                    String PN1 = p.getName();
                    config.set("BlockStopP3", 9);
                    config.set("PlayerP3", PN1);
                }
                if (random == 1) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.BAT);
                    p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                    b.setType(Material.AIR);
                }
            }
        }
    }

    if (b.getLocation().getX() == config.getInt("XB2P3")) {
        if (b.getLocation().getY() == config.getInt("YB2P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB2P3")) {
                int XB2 = config.getInt("XB1P3");
                int YB2 = config.getInt("YB1P3");
                int ZB2 = config.getInt("ZB1P3");
                World w = p.getWorld();
                Location locb2 = new Location(w, XB2, YB2, ZB2);
                config.set("BlockStopP3", 8);
                if (locb2.getBlock().getType() == Material.AIR) {
                    if (random == 0) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                        p.playEffect(loc, Effect.TILE_BREAK, 1);
                        b.setType(Material.AIR);
                    }
                    if (random == 1) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                        p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                        b.setType(Material.AIR);
                    }
                } else {
                    Location loc = b.getLocation();
                    p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
                    e.setCancelled(true);
                    e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                }
            }
        }
    }
 
Табуляция - ? Так и быть, за тебя сделаю.
Java:
if (b.getType() == Material.WOOL) {
    if (b.getLocation().getX() == config.getInt("XB1P3")) {
        if (b.getLocation().getY() == config.getInt("YB1P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB1P3")) {
                if (random == 0) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.HORSE);
                    p.playEffect(loc, Effect.TILE_BREAK, 1);
                    b.setType(Material.AIR);
                    String PN1 = p.getName();
                    config.set("BlockStopP3", 9);
                    config.set("PlayerP3", PN1);
                }
                if (random == 1) {
                    Location loc = b.getLocation();
                    p.getWorld().spawnEntity(loc, EntityType.BAT);
                    p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                    b.setType(Material.AIR);
                }
            }
        }
    }

    if (b.getLocation().getX() == config.getInt("XB2P3")) {
        if (b.getLocation().getY() == config.getInt("YB2P3")) {
            if (b.getLocation().getZ() == config.getInt("ZB2P3")) {
                int XB2 = config.getInt("XB1P3");
                int YB2 = config.getInt("YB1P3");
                int ZB2 = config.getInt("ZB1P3");
                World w = p.getWorld();
                Location locb2 = new Location(w, XB2, YB2, ZB2);
                config.set("BlockStopP3", 8);
                if (locb2.getBlock().getType() == Material.AIR) {
                    if (random == 0) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                        p.playEffect(loc, Effect.TILE_BREAK, 1);
                        b.setType(Material.AIR);
                    }
                    if (random == 1) {
                        Location loc = b.getLocation();
                        p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                        p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                        b.setType(Material.AIR);
                    }
                } else {
                    Location loc = b.getLocation();
                    p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
                    e.setCancelled(true);
                    e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                }
            }
        }
    }

редактировал тему
редактировал тему
так можно ли упростить?
 
Сравнивать Location напрямую (через equals, емнип).
Впрочем, можно это написать более красиво, но и количество строк возрастёт.
это-то понятно, а можно ли вынести random , а потом импортировать его?
например:
Код:
if (b.getType() == Material.WOOL) {
   if (b.getLocation().getX() == config.getInt("XB1P3")) {
     if (b.getLocation().getY() == config.getInt("YB1P3")) {
          if (b.getLocation().getZ() == config.getInt("ZB1P3"))
{
   // а тут импортируем всё из класса Random
             }









а в классе Random находится:

Код:
Random r = new Random();
    int random = r.nextInt(20);

if(random == 20)
{
p.sendmessage("ббб")
}

и т.д.
 
Как минимум можно убить лестницу if'ов, если использовать оператор "И"
 
Тогда лестница превратится в огромную строку, которую очень тяжело будет понять)
 
Java:
if (b.getType() == Material.WOOL)
{
    final Location loc = b.getLocation();
    if (loc.getBlockX() == config.getInt("XB1P3")&&
        loc.getBlockY() == config.getInt("YB1P3")&&
        loc.getBlockZ() == config.getInt("ZB1P3"))
    {
        if (random == 0)
        {
            p.getWorld().spawnEntity(loc, EntityType.HORSE);
            p.playEffect(loc, Effect.TILE_BREAK, 1);
            config.set("BlockStopP3", 9);
            config.set("PlayerP3", p.getName());
            b.setType(Material.AIR);
        else if (random == 1)
        {
            p.getWorld().spawnEntity(loc, EntityType.BAT);
            p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
            b.setType(Material.AIR);
        }
    }
    if (loc.getBlockX() == config.getInt("XB2P3")&&
        loc.getBlockY() == config.getInt("YB2P3")&&
        loc.getBlockZ() == config.getInt("ZB2P3"))
    {
        Location locb2 = new Location(
            p.getWorld(),
            config.getInt("XB1P3"),
            config.getInt("YB1P3"),
            config.getInt("ZB1P3"));
           
        config.set("BlockStopP3", 8);
        if (locb2.getBlock().getType() == Material.AIR)
        {
            if (random == 0)
            {
                p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                p.playEffect(loc, Effect.TILE_BREAK, 1);
                b.setType(Material.AIR);
            }
            else if (random == 1)
            {
                p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                b.setType(Material.AIR);
            }
        } else
        {
            p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
            e.setCancelled(true);
            e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
        }
    }
}
Максимум, что я смог сделать за 5 минут. По хорошему нужно давать более полный код или хотя бы описание. Мало что понятно из этого куска. Опять же адекватного сравнения double координаты и int из конфига можно и не добиться, используйте getBlock?()
 
Кстати, зачем каждый раз получать данные из конфига, когда можно создать переменную, а в неё при старте плагина поместить значение из конфига?
 
Кстати, зачем каждый раз получать данные из конфига, когда можно создать переменную, а в неё при старте плагина поместить значение из конфига?
На сколько мне помнится, значения при загрузке конфига кэшируются и требуется перезагрузка, чтобы вытащить их ещё раз. Давно было, могу ошибаться.
 
На сколько мне помнится, значения при загрузке конфига кэшируются и требуется перезагрузка, чтобы вытащить их ещё раз. Давно было, могу ошибаться.
Так и есть. Просто таки парсинг ключа и прохождение по дереву из хэшмап требует времени. И зачастую достаточно большого.
 
Так и есть. Просто таки парсинг ключа и прохождение по дереву из хэшмап требует времени. И зачастую достаточно большого.
Верно, но всё зависит от конкретного случая. Но я бы это перенёс в разряд оптимизаций с усложнением кода.
 
Мой вариант.
Java:
    public void onBlockBreak(BlockBreakEvent e)
    {
        Block  b = e.getBlock();
        Player p = e.getPlayer();
        FileConfiguration config = getConfig();
        boolean random = new Random().nextInt() % 2 != 0;
      
        if(b.getType().equals(Material.WOOL))
        {
            Location loc = b.getLocation();
            int locX  = loc.getBlockX();
            int locY  = loc.getBlockY();
            int locZ  = loc.getBlockZ();
            int cfgX1 = config.getInt("XB1P3");
            int cfgY1 = config.getInt("YB1P3");
            int cfgZ1 = config.getInt("ZB1P3");
            if(locX == cfgX1 && locY == cfgY1 && locZ == cfgZ1)
            {
                b.setType(Material.AIR);
                if(random)
                {
                    p.getWorld().spawnEntity(loc, EntityType.BAT);
                    p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                } else {
                    p.getWorld().spawnEntity(loc, EntityType.HORSE);
                    p.playEffect(loc, Effect.TILE_BREAK, 1);
                    config.set("BlockStopP3", 9);
                    config.set("PlayerP3", p.getName());
                }
            }
            int cfgX2 = config.getInt("XB2P3");
            int cfgY2 = config.getInt("YB2P3");
            int cfgZ2 = config.getInt("ZB2P3");
            if(locX == cfgX2 && locY == cfgY2 && locZ == cfgZ2)
            {
                Location blockLoc = new Location(p.getWorld(), cfgX2, cfgY2, cfgZ2);
                config.set("BlockStopP3", 8);
                if(blockLoc.getBlock().getType().equals(Material.AIR))
                {
                    b.setType(Material.AIR);
                    if(random)
                    {
                        p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                        p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                    } else {
                        p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                        p.playEffect(loc, Effect.TILE_BREAK, 1);
                    }
                } else {
                    p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
                    e.setCancelled(true);
                    e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                }
            }
        }
    }

Ещё где-то потеряны были скобки, так что полностью логику восстановить я не смог, и голову напрягать было лень.
 
Мой вариант.
Java:
    public void onBlockBreak(BlockBreakEvent e)
    {
        Block  b = e.getBlock();
        Player p = e.getPlayer();
        FileConfiguration config = getConfig();
        boolean random = new Random().nextInt() % 2 != 0;
     
        if(b.getType().equals(Material.WOOL))
        {
            Location loc = b.getLocation();
            int locX  = loc.getBlockX();
            int locY  = loc.getBlockY();
            int locZ  = loc.getBlockZ();
            int cfgX1 = config.getInt("XB1P3");
            int cfgY1 = config.getInt("YB1P3");
            int cfgZ1 = config.getInt("ZB1P3");
            if(locX == cfgX1 && locY == cfgY1 && locZ == cfgZ1)
            {
                b.setType(Material.AIR);
                if(random)
                {
                    p.getWorld().spawnEntity(loc, EntityType.BAT);
                    p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                } else {
                    p.getWorld().spawnEntity(loc, EntityType.HORSE);
                    p.playEffect(loc, Effect.TILE_BREAK, 1);
                    config.set("BlockStopP3", 9);
                    config.set("PlayerP3", p.getName());
                }
            }
            int cfgX2 = config.getInt("XB2P3");
            int cfgY2 = config.getInt("YB2P3");
            int cfgZ2 = config.getInt("ZB2P3");
            if(locX == cfgX2 && locY == cfgY2 && locZ == cfgZ2)
            {
                Location blockLoc = new Location(p.getWorld(), cfgX2, cfgY2, cfgZ2);
                config.set("BlockStopP3", 8);
                if(blockLoc.getBlock().getType().equals(Material.AIR))
                {
                    b.setType(Material.AIR);
                    if(random)
                    {
                        p.getWorld().spawnEntity(loc, EntityType.CAVE_SPIDER);
                        p.playEffect(loc, Effect.VILLAGER_THUNDERCLOUD, 1);
                    } else {
                        p.getWorld().spawnEntity(loc, EntityType.BLAZE);
                        p.playEffect(loc, Effect.TILE_BREAK, 1);
                    }
                } else {
                    p.playSound(loc, Sound.SKELETON_DEATH, 1, 1);
                    e.setCancelled(true);
                    e.getPlayer().sendMessage(ChatColor.DARK_GRAY + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                }
            }
        }
    }

Ещё где-то потеряны были скобки, так что полностью логику восстановить я не смог, и голову напрягать было лень.
У него там блоков 8-10 будет. К тому же, он это делает на паблик, значит некоторые могут и до 40 блоков сделать. Не очень приятный код будет, не так ли?
 
Да, если надо 40, я бы сделал какое-то перечисление по вариантам в цикле :)
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх