- Баллы
- 173
- Имя в Minecraft
- _Dereku
NBT хорошо, но лучше избегать его. Как и nms.Можно ещё через нбт попробовать.Через API PowerNBT или напрямую.
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
NBT хорошо, но лучше избегать его. Как и nms.Можно ещё через нбт попробовать.Через API PowerNBT или напрямую.
Почему?NBT хорошо, но лучше избегать его. Как и nms.
Будет небольшая проблема с дальнейшей поддержкой плагина.Почему?
Чтоб не пропустить спавн мобов при сильном дамаге.Почему бы не сделать вот так?
Тут, конечно, нет зависимости от хп и нет защиты от большого урона(если убить моба с 1 удара, то заспавнится только 1 зомби), но я думаю суть ясна.Зачем использовать именно Pattern и ifы?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); }
Не знал.Фу-фу-фу. Entity же Metadatable. Кидаешь мету в энтитю, и все дела. И игрок не видит разницы, и работа выполняется.
И ради этого столько говнокода?А так что, нельзя было?Чтоб не пропустить спавн мобов при сильном дамаге
if(livingEntity.getLastDamage()>livingEntity.getHealth())
spawnEntity(47, entity);
Я выше его предоставил, я переписал его, что бы каждый раз не передавать в параметры имя моба.Делал я это учитывая то, что значение будет получаться из конфига.Ну, а пока, спавнится могут только зомби.Вот этот метод:Нету такого The method spawnEntity(Location, EntityType) in the type World is not applicable for the arguments (int, Location, EntityType)
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")); } }
Как то не айс, согласись?
Вот, я убрал регулярки, и код наоборот стал короче.Что скажешь?Чтоб уменьшить код разумеется. Ну для одноразового спавна не требуется.
@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);
}
Код работал правильно, единственным недостающим звеном была защита от слишком высокого урона.equalsIgnoreCase я делал с расчётом на то, что вместо символов в мете будет какая-нибудь надпись, а спавнится моб будет не обязательно в нашем плагине, соотв. решил избавиться от зависимости, но это мелочи.Так вот, защиту от слишком большого урона я сделал, выглядит всё равно плохо, но уже лучше чем с регулярками.Скажу то, что ты выкинул часть проверок и код работает не правильно! И IgnoreCase тут не имеет смысла, ну вообще. Так что, подумай еще раз. Или ты вообще не вкурсе что такое регекс и как оно работает? Тогда иди гуглить.
@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");
}
}
Не тебе уж про трудно читаемый код говорить)трудночитаемый код
Написал человек, который предлагал решить эту проблему через шедулерНе тебе уж про трудно читаемый код говорить)
Ты хотел вариант решения, я тебе предложил? Еще вопросы? Знаешь, все темы которые я видел с тобой скатываются в какую-то ***ню, думаю, я дал повод тебе задуматься о себе.Написал человек, который предлагал решить эту проблему через шедулер![]()
Ты не поверишь.Столько же, сколько и твой код.Вот результат выполнения моего кода(Проверял на свинье):Ок, скажу приминивным языком, если ты такой даун. Если я с твоим кодом сниму полностью живому мобу 18 урона, сколько миньонов он призовет? Че осадился?


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