Из трех стрел только одна наносит урон

Версия Minecraft
1.7.10
210
1
19
В общем, я добавил к стреле ещё две точно таких же, ничего им не менял. И теперь если стрелы попадают в одного моба - две после попадания отскакивают обратно, а мобу при этом урона наносится, как от одной. Если рядом стоят два моба и две стрелы попали по обоим - урон получают оба. Что я делаю не так?

Видео, как оно работает (30 секунд)

Java:
@Override
    public void onPlayerStoppedUsing(ItemStack bow, World w, EntityPlayer player, int par4)
    {
        int j = this.getMaxItemUseDuration(bow) - par4;

        ArrowLooseEvent event = new ArrowLooseEvent(player, bow, j);
        MinecraftForge.EVENT_BUS.post(event);
        if (event.isCanceled()) { return; } // эвент отменён
        j = event.charge;

        boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0;

        if (flag || player.inventory.hasItem(Items.arrow)) // if Creative or player has arrows --> do!
            // j - int charge
        {
            float f = (float)j / 20.0F;
            f = (f * f + f * 2.0F) / 3.0F;

            if ((double)f < 0.1D)
            {
                return;
            }

            if (f > 1.0F)
            {
                f = 1.0F;
            }
           
            EntityArrow arrow = new EntityArrow(w, player, f * 2.0F);
            EntityArrow arrow2 = null;
            EntityArrow arrow3 = null;
           
            int triplearrow = EnchantmentHelper.getEnchantmentLevel(RHEnchantments.tripleArrow.effectId, bow);
            if(triplearrow > 0){
                float correctyaw = 0.0f;
                float correctpitch = 0.0f;
                arrow2 = new EntityArrow(w, player, f * 2.0F);             
                arrow3 = new EntityArrow(w, player, f * 2.0F);
            }

            double arrowpower = arrow.getDamage();
            arrow.setDamage(arrowpower * power);

            if (f == 1.0F)
            {
                arrow.setIsCritical(true);
                if(arrow2 != null)arrow2.setIsCritical(true);
                if(arrow3 != null)arrow3.setIsCritical(true);
            }

            int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow);

            if (k > 0)
            {
                arrow.setDamage(arrow.getDamage() + (double)k * 0.5D + 0.5D);
                if(arrow2 != null)arrow2.setDamage(arrow.getDamage() + (double)k * 0.5D + 0.5D);
                if(arrow3 != null)arrow3.setDamage(arrow.getDamage() + (double)k * 0.5D + 0.5D);
            }

            int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow);

            if (l > 0)
            {
                arrow.setKnockbackStrength(l);
                if(arrow2 != null)arrow2.setKnockbackStrength(l);
                if(arrow3 != null)arrow3.setKnockbackStrength(l);
            }

            if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0){
                arrow.setFire(100);
                if(arrow2 != null)arrow2.setFire(100);
                if(arrow3 != null)arrow3.setFire(100);
            }

            bow.damageItem(1, player);
            if(arrow2 != null)bow.damageItem(1, player);
            if(arrow3 != null)bow.damageItem(1, player);
           
            if (flag)
            { // если лук на бесконечность или креатив, то стрелу делаем неподнимаемой
                arrow.canBePickedUp = 2;
                if(arrow2 != null)arrow2.canBePickedUp = 2;
                if(arrow3 != null)arrow3.canBePickedUp = 2;
            }
            else
            { // иначе просто забираем у игрока одну стрелу (наличие проверяли выше)
                player.inventory.consumeInventoryItem(Items.arrow);
                if(arrow2 != null)player.inventory.consumeInventoryItem(Items.arrow);
                if(arrow3 != null)player.inventory.consumeInventoryItem(Items.arrow);
            }
           
            if (!w.isRemote){
                arrowSound(player, f);
                w.spawnEntityInWorld(arrow);
                w.spawnEntityInWorld(arrow2);
                w.spawnEntityInWorld(arrow3);
            }
        }
    }
 
Решение
В майне есть защита от слишком частого урона. То есть наносить урон можно не чаще чем раз в 10 тиков (пол секунды).
Отвечает за это переменная EntityLivingBase#hurtResistantTime. Хочешь убрать это - после нанесения урона твоей стрелой приравнивай переменную к нулю.

tox1cozZ

aka Agravaine
8,455
598
2,892
В майне есть защита от слишком частого урона. То есть наносить урон можно не чаще чем раз в 10 тиков (пол секунды).
Отвечает за это переменная EntityLivingBase#hurtResistantTime. Хочешь убрать это - после нанесения урона твоей стрелой приравнивай переменную к нулю.
 
1,057
50
234
Делай дамаг х3, да и все.
 
210
1
19
Делай дамаг х3, да и все.
Это совершенно неприемлемо.
Во-первых, вся суть в том, что стрел будет три и они могут не попадать в одного и того же моба, когда рассеиваются на расстоянии.
Во-вторых, Визуально две стрелы отлетают назад и их можно забрать обратно в инвентарь. И получается, вроде как я нанес урон трех стрел, а две вернул себе.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Смотри: берешь у своих стрел getEntityData() и добавляешь туда какой-то флажок, что это не ванильная стрела, а твоя.
Идешь делаешь LivingHurtEvent, там чекаешь что атакует стрела и у нее есть твой флаг - обнуляешь hurtResistantTime.
Только твои стрелы будут сбивать, соответственно не должно это никак сказаться на механике игры.
 
210
1
19
Честно, я уже забил на это, передумал добавлять. Но тем не менее, поделюсь наработками.
Я сразу же так и собирался сделать. Вписал в стрелу пометку, потом пошел в эвент LivingHurtEvent и экспериментальным путем пришел к выводу, что стрела в нём не появляется. Там есть event.source - и он в случае со стрелой равен EntityDamageSourceIndirect, и есть event.source.getEntity(), который, понятное дело, в нашем случае равен EntityPlayer. Короче, добрался до правильного пути. Однако я пробовал добавлять атакуемому мобу и hurtResistantTime = 0 и hurtResistantTime = maxHurtResistantTime, но ни то, ни другое не изменило ровным счётом ничего. Короче, ну его в пень - оно того не стоит.
 
Сверху