Отловить попадание в голову

1,683
2
Как отловить попал или нет игрок в голову?Например попал и в чат выводится сообщение.Идея такая,взять коробку(AxisAlignedBox)и получить всех входящих энтити.Но как?
 
Простого способа - нету, так как стандартом майнкрафте нету такой подобной системы. (По-крайней мере я того не увидел.)
В играх обычно идёт проверка на попадание в геометрию которой принадлежит определённая кость. (скелет.кости == кость.головы).
В стандартом майнкрате нету костей, есть геометрия. Либо создавать своию систему костей или типа того, либо определять по высоте попадания.
 
Я это уже реализовал. Думал ты другое предложишь. Тема закрыта
 
А как сказать тоже самое на игроке, просто там только на мобов, а об игроке не указанно
Код:
@ForgeSubscribe
    public void onHit(LivingHurtEvent e)
    {
        if(e.entity instanceof EntityPlayer)return; //Игрока не указали 
        if(e.source.isProjectile())
        {
            Entity en = e.source.getSourceOfDamage();
            if (e.entity instanceof EntityLiving&&en instanceof IProjectile||Headshots.EntityBullet.isInstance(en)) //А вот мобов да, указали
            {
                
                if(e.entity.posY+e.entity.getEyeHeight()-0.4F<en.posY && en.posY<e.entity.posY+e.entity.getEyeHeight()+0.4F&&!isBadEntity(e.entity))
                {
                    System.out.println("DEBUG "+e.entity.toString());
                    e.ammount=e.ammount*5;
                    ((EntityLiving) e.entityLiving).setCustomNameTag("HEADSHOT!");
                    ((EntityLiving) e.entityLiving).setAlwaysRenderNameTag(true);
                }
                
            }
        }

Пытался сделать на игрока, крашит при попадание в голову. Думаю, что получиться должно примерно это: 
Код:
if(e.entity instanceof EntityPlayer) {
                if(e.entity.posY+e.entity.getEyeHeight()-0.4F<en.posY && en.posY<e.entity.posY+e.entity.getEyeHeight()+0.4F&&!isBadEntity(e.entity)) {
                    e.ammount=e.ammount*5;
                    ((EntityPlayer) e.entity).setCustomNameTag("HEADSHOT!"); //Тут типо "Ник игрока" + "Headshot!", ну это сделать можно...
                    ((EntityPlayer) e.entity).setAlwaysRenderNameTag(true);
                }
            }
Пните в нужную сторону, пожалуйста
 
Там вроде есть метод isBadEntity всунь туда игрока(чтобы тру возвращалось). А в событии убери ту строку с возващением пустоты.
 
Код:
@SubscribeEvent
    public void hurt(LivingHurtEvent e){
        Entity attacker = e.source.getSourceOfDamage();
        EntityLivingBase living = e.entityLiving;

        if(attacker instanceof IProjectile){
            if(living.posY + living.getEyeHeight() < attacker.posY){
                e.ammount *= 2;
                System.out.println("Head shot! " + living.getCommandSenderName());
            }
        }
    }
 
Мне кажется надо вычесть 0.2 и сравнить ещё раз(0.2 это типо от начала головы до глаз)
[merge_posts_bbcode]Добавлено: 08.01.2015 16:11:54[/merge_posts_bbcode]

На скелетах не работает

[merge_posts_bbcode]Добавлено: 08.01.2015 16:23:09[/merge_posts_bbcode]

На игроке работает
 
Довакин, у тебя работает? Я не могу понять, почему у меня нет, вроде Агравайн подсказал, написал, да вот ничего не отражает, ничего в консоль не пишет. Можешь показать как ты вписал, пожалуйста?
[merge_posts_bbcode]Добавлено: 08.01.2015 17:49:26[/merge_posts_bbcode]

а нет, пишет, УРА, спасибо Агравайн, спасибо

[merge_posts_bbcode]Добавлено: 08.01.2015 18:18:36[/merge_posts_bbcode]

А за что отвечает  e.ammount *= 2; ?
 
Назад
Сверху