Помогите Если здоровье меньше...

  • Автор темы Автор темы _Rudey_
  • Дата начала Дата начала
Почему бы не сделать вот так?
Java:
    @EventHandler
    public void entitySpawn(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        LivingEntity livingEntity = (LivingEntity) entity;
        if(livingEntity.getCustomName() == null) return;
        String customName = livingEntity.getCustomName();
        switch (customName){
            case "§1" :
                livingEntity.setCustomName("§2");
                spawnEntity(1, entity);
                break;
            case "§2" :
                livingEntity.setCustomName("§3");
                spawnEntity(2, entity);
                break;
            case "§3" :
                livingEntity.setCustomName("§4");
                spawnEntity(4, entity);
                break;
            case "§4" :
                livingEntity.setCustomName("§5");
                spawnEntity(6, entity);
                break;
            case "§5" :
                livingEntity.setCustomName("§6");
                spawnEntity(8, entity);
                break;
            case "§6" :
                livingEntity.setCustomName("§7");
                spawnEntity(12, entity);
                break;
            case "§7" :
                livingEntity.setCustomName("§8");
                spawnEntity(14, entity);
                break;
        }
    }

    private void spawnEntity(int i, Entity entity) {
        for(int x = 0;x < i;x++)
            entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE);
    }
Тут, конечно, нет зависимости от хп и нет защиты от большого урона(если убить моба с 1 удара, то заспавнится только 1 зомби), но я думаю суть ясна.Зачем использовать именно Pattern и ifы?
Чтоб не пропустить спавн мобов при сильном дамаге.
Фу-фу-фу. Entity же Metadatable. Кидаешь мету в энтитю, и все дела. И игрок не видит разницы, и работа выполняется.
Не знал.
 
Чтоб не пропустить спавн мобов при сильном дамаге
И ради этого столько говнокода?А так что, нельзя было?
Java:
if(livingEntity.getLastDamage()>livingEntity.getHealth()) 
    spawnEntity(47, entity);
Да, кстати, в общем, спавнится 47 мобов.
 
Нету такого The method spawnEntity(Location, EntityType) in the type World is not applicable for the arguments (int, Location, EntityType)
Я выше его предоставил, я переписал его, что бы каждый раз не передавать в параметры имя моба.Делал я это учитывая то, что значение будет получаться из конфига.Ну, а пока, спавнится могут только зомби.Вот этот метод:
Java:
    private void spawnEntity(int i, Entity entity) {
        for(int x = 0;x < i;x++)
            entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE);
    }
 
Писать овер90 методов для спавна разных мобов?

Java:
    Pattern pt(String i) {
        return Pattern.compile("(?i)§["+i+"]");
    }
  
    @EventHandler
    public void on(EntityDamageByEntityEvent e) {
        Entity mob = e.getEntity();
        LivingEntity en = (LivingEntity) mob;
        List<MetadataValue> ms =  mob.getMetadata("boss");
        if(ms.size()==0) return;
        String s = (String) ms.get(0).value();
        double i = en.getHealth()-e.getDamage();
        if(pt("1").matcher(s).find() && i < 20) {
            en.setMetadata("boss", m(pt("1").matcher(s).replaceAll("§2")));
            Spawn(1, mob, "SLIME");
        }
        if(pt("1-2").matcher(s).find() && i < 17) {
            en.setMetadata("boss", m(pt("1-2").matcher(s).replaceAll("§3")));
            Spawn(2, mob, "ZOMBIE");
        }
        if(pt("1-3").matcher(s).find() && i < 14) {
            en.setMetadata("boss", m(pt("1-3").matcher(s).replaceAll("§4")));
            Spawn(4, mob, "ENDERMITE");
        }
        if(pt("1-4").matcher(s).find() && i < 11) {
            en.setMetadata("boss", m(pt("1-4").matcher(s).replaceAll("§5")));
            Spawn(6, mob, "CREEPER");;
        }
        if(pt("1-5").matcher(s).find() && i < 8) {
            en.setMetadata("boss", m(pt("1-5").matcher(s).replaceAll("§6")));
            Spawn(8, mob, "SILVERFISH");
        }
        if(pt("1-6").matcher(s).find() && i < 5) {
            en.setMetadata("boss", m(pt("1-6").matcher(s).replaceAll("§7")));
            Spawn(12, mob, "SKELETON");
        }
        if(pt("1-7").matcher(s).find() && i < 2) {
            en.setMetadata("boss", m(pt("1-7").matcher(s).replaceAll("§8")));
            Spawn(14, mob, "BLAZE");
        }
    }
  
    FixedMetadataValue m(String s) {
        return new FixedMetadataValue(this.plugin,s);
    }
  
  
    void Spawn(int i, Entity mob, String name) {
        for(int x= 0; x<i;x++) {
            mob.getWorld().spawnEntity(mob.getLocation(), EntityType.valueOf(name));
        }
    }
  
    //Тест
    @EventHandler
    void on(CreatureSpawnEvent e) {
        if(e.getEntityType() == EntityType.valueOf("ZOMBIE") && e.getSpawnReason() == SpawnReason.NATURAL) {
            e.getEntity().setMetadata("boss", m("§1"));
        }
    }

Как то не айс, согласись?
Ну, я изначально планировал спавнить одного моба, тогда да, в параметры передавать не нужно.Но если разные мобы на разных этапах, то да.А это, зачем использовать регулярки?
 
Чтоб уменьшить код разумеется. Ну для одноразового спавна не требуется.
Вот, я убрал регулярки, и код наоборот стал короче.Что скажешь?
Java:
    @EventHandler
    public void on(EntityDamageByEntityEvent e) {
        Entity mob = e.getEntity();
        LivingEntity en = (LivingEntity) mob;
        String metaData = en.getMetadata("boss").get(0).asString();
        double i = en.getHealth() - e.getDamage();
        if (metaData.equalsIgnoreCase("§1") && i < 20) {
            en.setMetadata("boss", m("§2"));
            Spawn(1, mob, "SLIME");
        }
        if (metaData.equalsIgnoreCase("§2") && i < 17) {
            en.setMetadata("boss", m("§3"));
            Spawn(2, mob, "ZOMBIE");
        }
        if (metaData.equalsIgnoreCase("§3") && i < 14) {
            en.setMetadata("boss", m("§4"));
            Spawn(4, mob, "ENDERMITE");
        }
        if (metaData.equalsIgnoreCase("§4") && i < 11) {
            en.setMetadata("boss", m("§5"));
            Spawn(6, mob, "CREEPER");
        }
        if (metaData.equalsIgnoreCase("§5") && i < 8) {
            en.setMetadata("boss", m("§6"));
            Spawn(8, mob, "SILVERFISH");
        }
        if (metaData.equalsIgnoreCase("§6") && i < 5) {
            en.setMetadata("boss", m("§7"));
            Spawn(12, mob, "SKELETON");
        }
        if (metaData.equalsIgnoreCase("§7") && i < 2) {
            en.setMetadata("boss", m("§8"));
            Spawn(14, mob, "BLAZE");
        }
    }

    FixedMetadataValue m(String s) {
        return new FixedMetadataValue(this,s);
    }
 
Последнее редактирование:
Скажу то, что ты выкинул часть проверок и код работает не правильно! И IgnoreCase тут не имеет смысла, ну вообще. Так что, подумай еще раз. Или ты вообще не вкурсе что такое регекс и как оно работает? Тогда иди гуглить.
Код работал правильно, единственным недостающим звеном была защита от слишком высокого урона.equalsIgnoreCase я делал с расчётом на то, что вместо символов в мете будет какая-нибудь надпись, а спавнится моб будет не обязательно в нашем плагине, соотв. решил избавиться от зависимости, но это мелочи.Так вот, защиту от слишком большого урона я сделал, выглядит всё равно плохо, но уже лучше чем с регулярками.
Java:
    @EventHandler
    public void on(EntityDamageByEntityEvent e) {
        Entity mob = e.getEntity();
        LivingEntity en = (LivingEntity) mob;
        String metaData = en.getMetadata("boss").get(0).asString();
        double i = en.getHealth() - e.getDamage();
        if (metaData.equals("§1") && i < 20) {
            en.setMetadata("boss", m("§2"));
            Spawn(1, mob, "SLIME");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§2") && i < 17) {
            en.setMetadata("boss", m("§3"));
            Spawn(2, mob, "ZOMBIE");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§3") && i < 14) {
            en.setMetadata("boss", m("§4"));
            Spawn(4, mob, "ENDERMAN");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§4") && i < 11) {
            en.setMetadata("boss", m("§5"));
            Spawn(6, mob, "CREEPER");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§5") && i < 8) {
            en.setMetadata("boss", m("§6"));
            Spawn(8, mob, "SILVERFISH");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§6") && i < 5) {
            en.setMetadata("boss", m("§7"));
            Spawn(12, mob, "SKELETON");
            metaData = en.getMetadata("boss").get(0).asString();
        }
        if (metaData.equals("§7") && i < 2) {
            en.setMetadata("boss", m("§8"));
            Spawn(14, mob, "BLAZE");
        }
    }
А вообще, регулярки обычно работают медленнее.В итоге, зачем было писать лишние методы, лишний трудночитаемый код?
 
Написал человек, который предлагал решить эту проблему через шедулер:lol:
Ты хотел вариант решения, я тебе предложил? Еще вопросы? Знаешь, все темы которые я видел с тобой скатываются в какую-то ***ню, думаю, я дал повод тебе задуматься о себе.
 
Ок, скажу приминивным языком, если ты такой даун. Если я с твоим кодом сниму полностью живому мобу 18 урона, сколько миньонов он призовет? Че осадился?
Ты не поверишь.Столько же, сколько и твой код.Вот результат выполнения моего кода(Проверял на свинье):

А вот результат выполнения твоего кода:

Но, я вижу, что ты не способен вести конструктивную дискуссию, так что я не вижу смысла продолжать.
Ты хотел вариант решения, я тебе предложил? Еще вопросы? Знаешь, все темы которые я видел с тобой скатываются в какую-то ***ню, думаю, я дал повод тебе задуматься о себе.
Это не решение проблемы, даже близко.Больше вопросов нет, выводы я сделал.
 
Ну да, просто работает по ТЗ.
К сожалению, оно не работает.И даже ТЗ оно не соответствует.Ну, можешь написать через шедулер, посмотрим, что из этого получится.И заметь, я сейчас не пытаюсь спровоцировать или что-то ещё, я действительно хочу найти наилучший способ решения этой проблемы.Если ты напишешь и предоставишь код, и он будет действительно лучшим чем все варианты, которые предоставлены в этой теме, то, я думаю, никто оспаривать это не станет.
 
И не поверю, ибо под условие попадет только одна ифка.
Не буду возражать если ты вставишь этот код к себе и собственноручно проверишь.Можешь даже видео снять, только я не знаю на какой версии ты тестируешь, я вот на 1.7.10.Но исправить под более новые не составит труда.
 
К сожалению, оно не работает.И даже ТЗ оно не соответствует.Ну, можешь написать через шедулер, посмотрим, что из этого получится.И заметь, я сейчас не пытаюсь спровоцировать или что-то ещё, я действительно хочу найти наилучший способ решения этой проблемы.Если ты напишешь и предоставишь код, и он будет действительно лучшим чем все варианты, которые предоставлены в этой теме, то, я думаю, никто оспаривать это не станет.
Еще раз говорю, это лишь вариант решения, разумеется есть лучше, я сам не люблю шудуллеры
 
Еще раз говорю, это лишь вариант решения, разумеется есть лучше, я сам не люблю шудуллеры
Ну вот я и говорю, решение не является решением до тех пор, пока оно не решает проблему.Твой вариант проблему не решает, соотв. решением не является.Но, возможно, если ты реализуешь это в коде, то такой вариант будет решать эту проблему лучше всех реализаций, предоставленных в этой теме, кто знает.
 
Ну вот я и говорю, решение не является решением до тех пор, пока оно не решает проблему.Твой вариант проблему не решает, соотв. решением не является.Но, возможно, если ты реализуешь это в коде, то такой вариант будет решать эту проблему лучше всех реализаций, предоставленных в этой теме, кто знает.
Лучшее решение точно не шудуллер, смотря в каком ивенте делать, я лично думал что надо взять всех мобов с мира и если хп больше то спаунить кого то еще
 
Лучшее решение точно не шудуллер, смотря в каком ивенте делать, я лично думал что надо взять всех мобов с мира и если хп больше то спаунить кого то еще
Я сначала так же думал, выше есть реализации.Ну..Ошибаются все.
Что случилось, Алекс?Где все твои сообщения?
 
Назад
Верх