Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

Статус темы:
Закрыта.
  1. Автор темы
    alekseichik

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

    Баллы:
    76
    Имя в Minecraft:
    maxicraft2020
    Код:
    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 в отдельный класс , а потом импортировать?(чтобы уменьшить объём кода)
     
    Последнее редактирование: 27 окт 2015
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    pastebin.com . В таком виде я нихрена не понимаю.
     
  4. Автор темы
    alekseichik

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

    Баллы:
    76
    Имя в Minecraft:
    maxicraft2020
    http://pastebin.com/t9kTaexW
     
  5. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Табуляция - ? Так и быть, за тебя сделаю.
    Код:
    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 + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                    }
                }
            }
        }
     
  6. Автор темы
    alekseichik

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

    Баллы:
    76
    Имя в Minecraft:
    maxicraft2020
    редактировал тему[DOUBLEPOST=1445944370,1445944337][/DOUBLEPOST]
    так можно ли упростить?
     
  7. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Сравнивать Location напрямую (через equals, емнип).
    Впрочем, можно это написать более красиво, но и количество строк возрастёт.
     
  8. Автор темы
    alekseichik

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

    Баллы:
    76
    Имя в Minecraft:
    maxicraft2020
    это-то понятно, а можно ли вынести random , а потом импортировать его?[DOUBLEPOST=1445945806,1445945568][/DOUBLEPOST]например:
    Код:
    
    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("ббб")
    }
    
    и т.д.
     
  9. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Зачем?
     
  10. Автор темы
    alekseichik

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

    Баллы:
    76
    Имя в Minecraft:
    maxicraft2020
    если этого не сделать, то у меня код получится очень ОЧень ОЧЕНЬ большой
     
  11. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Как минимум можно убить лестницу if'ов, если использовать оператор "И"
     
  12. Agravaine

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

    Баллы:
    88
    Имя в Minecraft:
    Agravaine25
    Тогда лестница превратится в огромную строку, которую очень тяжело будет понять)
     
  13. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Код:
    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?()
     
  14. MrTrojan

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

    Баллы:
    98
    Skype:
    mrtrojan.ru
    Имя в Minecraft:
    MrTrojan
    Кстати, зачем каждый раз получать данные из конфига, когда можно создать переменную, а в неё при старте плагина поместить значение из конфига?
     
  15. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    На сколько мне помнится, значения при загрузке конфига кэшируются и требуется перезагрузка, чтобы вытащить их ещё раз. Давно было, могу ошибаться.
     
  16. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Так и есть. Просто таки парсинг ключа и прохождение по дереву из хэшмап требует времени. И зачастую достаточно большого.
     
  17. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Верно, но всё зависит от конкретного случая. Но я бы это перенёс в разряд оптимизаций с усложнением кода.
     
  18. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Разве стало тяжело понять то что написал господин Ission?
     
  19. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Мой вариант.
    Код:
        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 + "Ты не можешь сломать этот блок, пока не сломаешь предыдущие блоки");
                    }
                }
            }
        }
    Ещё где-то потеряны были скобки, так что полностью логику восстановить я не смог, и голову напрягать было лень.
     
  20. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    У него там блоков 8-10 будет. К тому же, он это делает на паблик, значит некоторые могут и до 40 блоков сделать. Не очень приятный код будет, не так ли?
     
  21. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Да, если надо 40, я бы сделал какое-то перечисление по вариантам в цикле :)
     
Статус темы:
Закрыта.

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