java - MineCraft Forge 如何阻止小怪被击中后无敌 (Java) 1.10.2

标签 java minecraft minecraft-forge

我制作了一把射速非常快的定制弓,并且我了解到所有生物在被击中后的短时间内都是无敌的。这使得我的弓几乎毫无用处。我想知道是否有任何方法可以改变小怪无敌的持续时间,甚至完全删除它。

弓箭射击方法代码:

@Override
    public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World worldIn, EntityPlayer playerIn, EnumHand hand) {
    //  int charge = 1;
    //  charge = ForgeEventFactory.onArrowLoose(stack, worldIn, playerIn, charge, true);
        player123 = playerIn;
        if (!worldIn.isRemote) {
        final ItemArrow itemArrow = (ItemArrow) (Items.ARROW instanceof ItemArrow ? Items.ARROW : Items.ARROW);



        final ItemStack ammo = new ItemStack(Items.ARROW, 1);
        final float arrowVelocity = 1;
        final EntityArrow entityArrow = itemArrow.createArrow(worldIn, ammo, playerIn);
        entityArrow.setAim(playerIn, playerIn.rotationPitch, playerIn.rotationYawHead, 0.0F, arrowVelocity * 3.5F, 0F);
        entityArrow.setDamage(2);
        entityArrow.pickupStatus = EntityArrow.PickupStatus.DISALLOWED;
//      entityArrow.setVelocity(0.2F, 0.1F, 0.2F);
        final ItemStack magicarrow = new ItemStack(TheGalaxyMod.magicarrow, 1);
        EntityLivingBase living = (playerIn);

        if (FastMode.fastmode == 1){
            int index = GetItemSlot(playerIn, magicarrow);
            if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.creativequiver)))
            {
                entityArrow.setDamage(5000);
                worldIn.spawnEntityInWorld(entityArrow);
            }
            else if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.magicquiver)))
            {
                worldIn.spawnEntityInWorld(entityArrow);
            }
            else if (!(playerIn.inventory.getStackInSlot(index).getItem() == null) && playerIn.inventory.getStackInSlot(index).getItem() == TheGalaxyMod.magicarrow)
            {
                damageItem(playerIn, magicarrow, 1);
                worldIn.spawnEntityInWorld(entityArrow);
                ItemStack stack2 = playerIn.inventory.getStackInSlot(index);
                if(stack2.getItemDamage() > 500)
                {
                    playerIn.inventory.setInventorySlotContents(index, null);
                }
            }
            else if(playerIn.inventory.hasItemStack(ammo) ){
                worldIn.spawnEntityInWorld(entityArrow);
                removeItem(playerIn, ammo);
            }

        }
        else if
        (FastMode.fastmode == 2)
        {
            final ItemArrow itemArrow2 = (ItemArrow) (Items.ARROW instanceof ItemArrow ? Items.ARROW : Items.ARROW);
            final ItemStack ammo2 = new ItemStack(Items.ARROW);
            final float arrowVelocity2 = 1;
            final EntityArrow entityArrow2 = itemArrow2.createArrow(worldIn, ammo2, playerIn);
            entityArrow2.setAim(playerIn, playerIn.rotationPitch, playerIn.rotationYawHead, 0.0F, arrowVelocity2 * 3.5F, 0F);
            entityArrow2.setDamage(2);
            entityArrow2.pickupStatus = EntityArrow.PickupStatus.DISALLOWED;
            int index = GetItemSlot(playerIn, magicarrow);
            if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.creativequiver)))
            {
                entityArrow.setDamage(5000);
                worldIn.spawnEntityInWorld(entityArrow);
                entityArrow2.setDamage(5000);
                worldIn.spawnEntityInWorld(entityArrow2);
            }
            else if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.magicquiver)))
            {
                worldIn.spawnEntityInWorld(entityArrow);
                worldIn.spawnEntityInWorld(entityArrow2);
            }
            else if (!(playerIn.inventory.getStackInSlot(index).getItem() == null) && playerIn.inventory.getStackInSlot(index).getItem() == TheGalaxyMod.magicarrow)
            {

                damageItem(playerIn, magicarrow, 2);
                worldIn.spawnEntityInWorld(entityArrow);
                worldIn.spawnEntityInWorld(entityArrow2);
                ItemStack stack2 = playerIn.inventory.getStackInSlot(index);
                if(stack2.getItemDamage() > 500)
                {
                    playerIn.inventory.setInventorySlotContents(index, null);
                }
            }
            else if(playerIn.inventory.hasItemStack(ammo) ){
                worldIn.spawnEntityInWorld(entityArrow);
                worldIn.spawnEntityInWorld(entityArrow2);
                removeItem(playerIn, ammo);

            }
        }
        else if
        (FastMode.fastmode == 3)
        {
            entityArrow.setFire(50);
            int index = GetItemSlot(playerIn, magicarrow);
            if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.creativequiver)))
            {
                entityArrow.setDamage(5000);
                worldIn.spawnEntityInWorld(entityArrow);
            }
            else if (playerIn.inventory.hasItemStack(new ItemStack(TheGalaxyMod.magicquiver)))
            {
                worldIn.spawnEntityInWorld(entityArrow);

            }
            else if (!(playerIn.inventory.getStackInSlot(index).getItem() == null) && playerIn.inventory.getStackInSlot(index).getItem() == TheGalaxyMod.magicarrow)
            {
                damageItem(playerIn, magicarrow, 2);
                worldIn.spawnEntityInWorld(entityArrow);
                ItemStack stack2 = playerIn.inventory.getStackInSlot(index);
                if(stack2.getItemDamage() > 500)
                {
                    playerIn.inventory.setInventorySlotContents(index, null);
                }
            }
            else if(playerIn.inventory.hasItemStack(ammo) ){
                worldIn.spawnEntityInWorld(entityArrow);
                removeItem(playerIn, ammo);
            }

        }

        }
        return super.onItemRightClick(stack, worldIn, playerIn, hand);

}

编辑: 找到解决方案: 感谢@Draco18s,我已经找到了解决方案。 我所要做的就是添加这一行

entityArrow.hurtResistantTime = 0

最佳答案

你需要这个:

entityHit.hurtResistantTime = 0;

注意:确切的字段名称可能会根据 Minecraft 版本和 Forge 的版本号而变化。

在你伤害实体之前(绕过所有其他伤害来源造成的伤害抵抗计时器)或之后调用它(如果有计时器,你的伤害将被忽略,但如果它造成伤害,下一个 由于计时器的原因,源不会被忽略)。此行需要位于 arrow 类中。如果您没有自定义箭头类,现在是制作一个的好时机。

不幸的是,没有(好的)方法可以根据先前的伤害类型有条件地将计时器设置为 0。如果您使用的是 1.10 或更高版本,您可以使用功能,尽管可能不太实用。

关于java - MineCraft Forge 如何阻止小怪被击中后无敌 (Java) 1.10.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43788978/

相关文章:

java - 从文件中获取 stdin 来控制后台 java 进程

java - 我可以使用 java 策略文件通过 sudo 安全地运行不受信任的应用程序吗

java - Bukkit setItemStackName 不起作用

gradle - 《我的世界》伪造gradle “runClient”异常

java - 启动时删除变量

java - forge的源文件在哪里?

javascript - 在 javascript 中访问/生成 java 枚举

java - 使用spring和java在浏览器中打开pdf

java - 不使用 public 访问不同包中的 protected 类变量

java - Netbeans 项目从资源管理器中消失