2017-05-04 36 views
0

我做了一個自定義弓,真的很快就射擊了,而且我知道所有的小怪在被擊中後都很短的時間內無懈可擊。這使我的弓幾乎沒用。我想知道是否有什麼方法可以改變暴徒無法忍受的持續時間,甚至根本不需要移除它。MineCraft Forge如何阻止小怪在命中後無敵(爪哇)1.10.2

代碼弓射擊方法:

@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 
+0

你確定他們無懈可擊嗎?你有沒有檢查他們的健康實際上在做什麼?你做了什麼調試? – Carcigenicate

+0

那麼,箭頭就會飛向我。 – TheMCProgrammer

+1

這裏還有一個關於bukkit的論壇帖子:[link] https://bukkit.org/threads/how-to-change-mob-invulnerability-duration-after-get-hit.278296/ [link] – TheMCProgrammer

回答

1

entityHit.hurtResistantTime = 0;

注:確切的字段名稱可能會因版本的Minecraft和僞造的版本號變化。

調用它要麼只是之前你傷害了實體(繞過被損壞的一切其他來源所造成的傷害性定時器)或之後(你的傷害會被忽略,如果有一個計時器,但如果對其造成損壞,下一個源由於定時器而不被忽略)。這條線需要在類的箭頭類。如果您沒有自定義箭頭課程,現在是製作課程的好時機。

不幸的是,根據先前的損壞類型,沒有(好的)有條件地將計時器設置爲0的方法。如果你使用的是1.10或更高版本,你可以使用功能,雖然可能很笨重。

+0

非常感謝您,但我想知道是否有任何方法可以重寫EntityArrow類來更改該字段。 – TheMCProgrammer

+1

是的。創建一個新的實體類,改變你需要的東西,並從你自己的而不是原來的產生它。我在[Artifacts mod](https://github.com/Draco18s/Artifacts)中執行此操作。它是1.7代碼,但總體原則沒有改變。 – Draco18s

+1

@TheMCProgrammer是的。創建一個新的實體類,替換你需要的東西,並從你的物品而不是原來產生它。我在我的[Artifacts mod](https://github.com/Draco18s/Artifacts)中做了這個(查看實體/箭頭類和箭頭陷阱)。它是1.7代碼,但總的原則並沒有改變。 – Draco18s