[1.12.2]Выполнение действий при ударе сущности

Версия Minecraft
1.12.2

WantaSanchez

Опоздун
633
17
150
Драсте (Звучит в стиле доктора Дью). По сути мне надо получить текущие ХП игрока и выдать ему такой урон, шоб осталось 1ХП. При этом я в замешательстве. Сами действия я вроде понимаю как сделать но где? Я вроде не видел в классе меча/предмета метод аля onHitEntity. Я плохо искал, или данную манипуляцию надо через событие отлавливать удар по мобу и чекать предмет в руке игрока и тд.?
 
Решение
Мне кажется можно сделать так:
В LivingHurtEvent(точное название не помню) проверять,

Java:
//Если это нужный тебе энтити
if(event.entity instanceof yourEntity){
    //Если у тебя есть в руках нужный тебе меч
    if(player.getHeldItem().getItem() == yourItem){
        //Устанавливаешь тут кол-во жизней игрока
    }
}
137
7
37
Мне кажется можно сделать так:
В LivingHurtEvent(точное название не помню) проверять,

Java:
//Если это нужный тебе энтити
if(event.entity instanceof yourEntity){
    //Если у тебя есть в руках нужный тебе меч
    if(player.getHeldItem().getItem() == yourItem){
        //Устанавливаешь тут кол-во жизней игрока
    }
}
 
Последнее редактирование:
7,099
324
1,510
Наверное потому что getItem для пустого стака возвращает AIR что не подходит под кейс ==yourItem, т.е. требуемое поведение
 

WantaSanchez

Опоздун
633
17
150
UP! Поспешил увы.
Видимо из-за диплома я атрофировался в моддинге.
Вот что у меня вышло:
EventsHandler.java:
@EventBusSubscriber
public class EventsHandler {
    
    @SubscribeEvent
    public static void onEntityAttak(LivingHurtEvent event) {
            
        if(event.getEntity() instanceof EntityMob) {
                
            EntityPlayer player = (EntityPlayer) event.getEntity();
            ItemStack heldItem = player.getHeldItem(EnumHand.MAIN_HAND);
            ItemStack strangeSword = new ItemStack(ItemsInit.STRANGE_SWORD);
                
            if(!heldItem.isEmpty()) {
                    
                if(heldItem == strangeSword) {
                        
                    player.setHealth(1.0F);
                        
                }
                    
            }
                    
        }
        
    }

}
Ну и как вы уже поняли оно не работает. Ну точнее работает не так как надо, ибо если сменить проверку на другой тип сущности, то игрок не может никому нанести урон. Но жизнь не сетается, и я не могу понять как при ударе удалить предмет с текущей руки. Дело в том, что предмет (меч) должен сломаться после первого удара, но при установке в материале прочности 0 меч имеет неограниченную прочность, а при значении 1 ломается естественно со второго раза. Что скажете господа?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Зачем вообще городить ивент, если в предмете есть метод, который вызывается при ударе по энтити?
Java:
public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker){
    target.setHealth(1.0F);
    stack.damageItem(Integer.MAX_VALUE, attacker);
    return true;
}
 

WantaSanchez

Опоздун
633
17
150
Благодарю, всё работает как надо.
Java:
@Override
public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) {
        
    attacker.setHealth(1.0F);
    attacker.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 600, 3));
    attacker.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 600, 3));
    attacker.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 600, 3));
    attacker.addPotionEffect(new PotionEffect(MobEffects.MINING_FATIGUE, 600, 3));
    stack.setItemDamage(Integer.MAX_VALUE);
        
    return true;
        
}
 
Сверху