Дроп мобу при убийстве моим оружием

Версия Minecraft
1.12.2
API
Forge
128
4
6
Код вроде правильный но предмет не спавнится, хотя без stack все работает. Как это можно исправить и сделать чтобы работало?
Java:
@SubscribeEvent
    public void entityDeath(LivingDeathEvent e) {
        Entity entity = e.getEntity();
        World world = entity.world;
        ItemStack stack = new ItemStack(ItemsInit.SCYTHE);
        if (entity instanceof EntityLivingBase) {
            Collection<PotionEffect> effects = ((EntityLivingBase) entity).getActivePotionEffects();
            for (PotionEffect effect : effects) {
                if (Scythe.isVoid(stack) == true && effect.getPotion() == MobEffects.WEAKNESS && entity instanceof EntityVillager) {
                    if(!world.isRemote) {
                        EntityItem entityToSpawn = new EntityItem(world, (entity.posX + 0.5), (entity.posY + 0.5), (entity.posZ + 0.5), new ItemStack(ItemsInit.SOUL_SHARD, 1));
                        entityToSpawn.setPickupDelay(10);
                        world.spawnEntity(entityToSpawn);
                    }
                }
            }
        }
    }
 
Решение
Все решено
Java:
@SubscribeEvent
    public void entityDeath(LivingDeathEvent e) {
        Entity entity = e.getEntity();
        World world = entity.world;
        if (entity instanceof EntityLivingBase) {
            Collection<PotionEffect> effects = ((EntityLivingBase) entity).getActivePotionEffects();
            for (PotionEffect effect : effects) {
                if (Scythe.isItemInHand(entity) == true && effect.getPotion() == MobEffects.WEAKNESS && entity instanceof EntityVillager) {
                    if(!world.isRemote) {
                        EntityItem entityToSpawn = new EntityItem(world, (entity.posX), (entity.posY + 0.5), (entity.posZ), new ItemStack(ItemsInit.SOUL_SHARD, 1))...
Java:
public static boolean isVoid(ItemStack stack) {
        return ItemNBTHelper.getBoolean(stack, VOID_MOD, false);
    }
Java:
@Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) {
        super.onUpdate(stack, world, entity, par4, par5);
        NBTTagCompound nbt = stack.getTagCompound();
        if(!world.isRemote) {
            if(nbt.hasKey(FIRE_MOD) && nbt.getInteger(TYPE_MOD) == 1) {ItemNBTHelper.setBoolean(stack, FIRE_MOD, true);} else {ItemNBTHelper.setBoolean(stack, FIRE_MOD, false);}
            if(nbt.hasKey(VOID_MOD) && nbt.getInteger(TYPE_MOD) == 2) {ItemNBTHelper.setBoolean(stack, VOID_MOD, true);} else {ItemNBTHelper.setBoolean(stack, VOID_MOD, false);}
            if(nbt.hasKey(SOUL_MOD) && nbt.getInteger(TYPE_MOD) == 3) {ItemNBTHelper.setBoolean(stack, SOUL_MOD, true);} else {ItemNBTHelper.setBoolean(stack, SOUL_MOD, false);}
        }
        stack.setTagCompound(nbt);
    }

Java:
public final class ItemNBTHelper {
    public static NBTTagCompound getNBT(ItemStack stack) {
        if(!stack.hasTagCompound())
            stack.setTagCompound(new NBTTagCompound());
        return stack.getTagCompound();
    }
    
    //SET
    public static void setBoolean(ItemStack stack, String tag, boolean b) {
        getNBT(stack).setBoolean(tag, b);
    }
    
    //GET
    public static boolean verifyExistance(ItemStack stack, String tag) {
        return !stack.isEmpty() && getNBT(stack).hasKey(tag);
    }

    public static boolean getBoolean(ItemStack stack, String tag, boolean defaultExpected) {
        return verifyExistance(stack, tag) ? getNBT(stack).getBoolean(tag) : defaultExpected;
    }
}
 
Дебаж, в коде вроде норм всё.
вот и я не понимаю все норм, но чудо не происходит. Возможно это из за эвента.

а если на прямую через предмет отслеживать
Java:
@Override
    public boolean hitEntity(ItemStack stack, EntityLivingBase killedEntity, EntityLivingBase attackingEntity) {
        if (attackingEntity instanceof EntityPlayer) {
            stack.damageItem(2, attackingEntity);
            NBTTagCompound nbt = stack.getTagCompound();
            if(nbt.getInteger(TYPE_MOD) == 3) {
                killedEntity.attackEntityFrom(DamageSource.MAGIC, 5F);
                if(killedEntity instanceof EntityVillager) {
                    if(!killedEntity.world.isRemote) {
                        EntityItem entityToSpawn = new EntityItem(killedEntity.world, (killedEntity.posX + 0.5), (killedEntity.posY + 0.5), (killedEntity.posZ + 0.5), new ItemStack(ItemsInit.SOUL_SHARD, 1));
                        entityToSpawn.setPickupDelay(10);
                        killedEntity.world.spawnEntity(entityToSpawn);
                    }
                }
            }
        }
        return true;
    }
только, как проверить, что моб умер. А то так моб просто получает урон и дропается предмет, а нужно чтобы предмет спавнился только когда моб умирает
 
Хватит флудить, пиши ответ в одном сообщении.
к сожалению мне нужна проверка на предмет с тегом

Дебаж свой isVoid, скорее всего в нём трабла.
нет, я даже чисто через предмет пробовал, эвент как бы срабатывает, но действие не выполняется

я понял в чем причина предмет не успевает спавнится ведь сущность умирает, а действие призыва относительно ее корд

так теперь надо понять, как это исправить
 
Все решено
Java:
@SubscribeEvent
    public void entityDeath(LivingDeathEvent e) {
        Entity entity = e.getEntity();
        World world = entity.world;
        if (entity instanceof EntityLivingBase) {
            Collection<PotionEffect> effects = ((EntityLivingBase) entity).getActivePotionEffects();
            for (PotionEffect effect : effects) {
                if (Scythe.isItemInHand(entity) == true && effect.getPotion() == MobEffects.WEAKNESS && entity instanceof EntityVillager) {
                    if(!world.isRemote) {
                        EntityItem entityToSpawn = new EntityItem(world, (entity.posX), (entity.posY + 0.5), (entity.posZ), new ItemStack(ItemsInit.SOUL_SHARD, 1));
                        entityToSpawn.setPickupDelay(10);
                        world.spawnEntity(entityToSpawn);
                    }
                }
            }
        }
    }
Java:
public static boolean isItemInHand(Entity entity) {
        World world = entity.world;
        if(entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer) entity;
            EnumHand hand = player.getActiveHand();
            ItemStack stack = player.getHeldItem(hand);
            NBTTagCompound nbt = stack.getTagCompound();
            if(nbt.getInteger(TYPE_MOD) == 3) {
                return true;
            }
            return false;
        }
        return entity != null;
    }
 
Назад
Сверху