- Баллы
- 66
Какой ивент в этом может помочь? Как проверять?
Заверяю - перегуглил много, ничего не помогло и решения нет
Заверяю - перегуглил много, ничего не помогло и решения нет
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
public void onItemDamage(EntityDamageByEntityEvent e) {
if (!e.getCause().equals(EntityDamageEvent.DamageCause.LAVA)){
return;
}
if (!e.getCause().equals(EntityDamageEvent.DamageCause.FIRE)){
return;
}
e.setCancelled(true);
}
Дело в том что мне нужно чтобы броня не ломалась, а игрок получал уронЗдраствуй, существует PlayerItemDamageEvent, если правильно помню, он отвечает за уменьшение прочности на предмете.
Попробуй вот такой вариант:
Первый и второй if'ы - проверка на тип урона, лаву и огонь соответственно.Код:public void onItemDamage(EntityDamageByEntityEvent e) { if (!e.getCause().equals(EntityDamageEvent.DamageCause.LAVA)){ return; } if (!e.getCause().equals(EntityDamageEvent.DamageCause.FIRE)){ return; } e.setCancelled(true); }
Код примерный, сам не тестировал.
Извиняюсь, написал про один ивент, а в примере кода другой указал!!!Дело в том что мне нужно чтобы броня не ломалась, а игрок получал урон
public void onItemDamage(PlayerItemDamageEvent e) {
// Проверка на горение. если есть время горения, то игрок горит
// Если грок не горит, возвращает метод
if (!(e.getPlayer().getFireTicks() > 0)) {
return;
}
// Проверка на предмет. броня игрока == прдемету ивента, то true
// Если никакая броня не равна предмету ивента, возвращает метод
if(!(e.getPlayer().getEquipment().getBoots().equals(e.getItem())
|| e.getPlayer().getEquipment().getChestplate().equals(e.getItem())
|| e.getPlayer().getEquipment().getLeggings().equals(e.getItem())
|| e.getPlayer().getEquipment().getHelmet().equals(e.getItem()))){
return;
}
e.setCancelled(true);
}
Это не то. Этот ивент отвечает за ломание вещей игроком, тоесть: лопата, кирка, топор, мотыга и тд.Извиняюсь, написал про один ивент, а в примере кода другой указал!!!
Изменил под PlayerItemDamageEvent
Код:public void onItemDamage(PlayerItemDamageEvent e) { // Проверка на горение. если есть время горения, то игрок горит // Если грок не горит, возвращает метод if (!(e.getPlayer().getFireTicks() > 0)) { return; } // Проверка на предмет. броня игрока == прдемету ивента, то true // Если никакая броня не равна предмету ивента, возвращает метод if(!(e.getPlayer().getEquipment().getBoots().equals(e.getItem()) || e.getPlayer().getEquipment().getChestplate().equals(e.getItem()) || e.getPlayer().getEquipment().getLeggings().equals(e.getItem()) || e.getPlayer().getEquipment().getHelmet().equals(e.getItem()))){ return; } e.setCancelled(true); }
А с чего ты взял, что он не вызовется на броню? У брони та же самая прочность, что и у лопат с кирками. Проверь для началаЭто не то. Этот ивент отвечает за ломание вещей игроком, тоесть: лопата, кирка, топор, мотыга и тд.
И что тут не так? Броня - это не предмет? Или игрок не использует этот предмет?C документации
Посмотреть вложение 66725
Если лень проверить, то могу предложить ещё вариант.C документации
Посмотреть вложение 66725
проверил, не работаетИ что тут не так? Броня - это не предмет? Или игрок не использует этот предмет?
Я не вижу противоречий в твоей задаче и том, что указано в описании события.
И в чём вообще проблема проверить?
Ты просишь помощи, но упорно сопротивляется предложенному решению по непонятной мне причине
Единственная проблема - сравниваемые предметы лучше поменять местами, чтобы не наткнуться на NPE. А так - всё вроде работает, об огонь по крайней мере.проверил, не работает
@EventHandler
public void onItemDamage(PlayerItemDamageEvent e) {
Player player = e.getPlayer();
if (player.getFireTicks() == 0) {
return;
}
EntityEquipment equipment = player.getEquipment();
ItemStack item = e.getItem();
if (item.equals(equipment.getBoots())
|| item.equals(equipment.getChestplate())
|| item.equals(equipment.getLeggings())
|| item.equals(equipment.getHelmet())) {
e.setCancelled(true);
}
}
Благодарю, за правки, а то писал в попыхах и даже вместо равенства поставил знак больше...Единственная проблема - сравниваемые предметы лучше поменять местами, чтобы не наткнуться на NPE. А так - всё вроде работает, об огонь по крайней мере.
Другое дело, что тебе это всё равно не очень подходит - если игрок в огне, и его будут бить, то урон по броне тоже будет отменяться. Проще всего будет хранить какой-нибудь Set<UUID>, куда записывать игроков, которые получили урон от лавы, и потом в PlayerItemDamageEvent проверять наличие игрока в сете вместо проверки значения getFireTicks(). Очищать этот список каждый тик.PHP:@EventHandler public void onItemDamage(PlayerItemDamageEvent e) { Player player = e.getPlayer(); if (player.getFireTicks() == 0) { return; } EntityEquipment equipment = player.getEquipment(); ItemStack item = e.getItem(); if (item.equals(equipment.getBoots()) || item.equals(equipment.getChestplate()) || item.equals(equipment.getLeggings()) || item.equals(equipment.getHelmet())) { e.setCancelled(true); } }