2017-05-04 4 views
0

Ich habe einen benutzerdefinierten Bogen gemacht, der sehr schnell feuert, und ich habe gelernt, dass alle Mobs für kurze Zeit unverwundbar sind, nachdem sie getroffen wurden . Das macht meinen Bogen ziemlich nutzlos. Ich habe mich gefragt, ob es irgendeinen Weg gibt, die Dauer zu ändern, für die die Mobs unverwundbar sind, oder sie überhaupt zu entfernen.MineCraft Forge Wie man Mobs davon abhält, nach einem Treffer unverwundbar zu sein (Java) 1.10.2

-Code für die Bogenbrennverfahren:

@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); 

} 

EDIT: Lösung gefunden: Dank @ Draco18s ich die Lösung herausgefunden haben. Alles, was ich tun musste, war die Linie

entityArrow.hurtResistantTime = 0 
+0

Sind Sie sicher, dass sie unverwundbar sind? Hast du überprüft, was ihre Gesundheit eigentlich macht? Welches Debugging hast du gemacht? – Carcigenicate

+0

Nun, die Pfeile fliegen buchstäblich zurück zu mir. – TheMCProgrammer

+1

Es gibt auch einen Forum-Thread auf Bukkit zu diesem Thema: [link] https://bukkit.org/threads/how-to-change-mob-invulnerability-duration-after-get-hit.278296/ [link] – TheMCProgrammer

Antwort

1

du müssen hinzufügen:

entityHit.hurtResistantTime = 0;

Hinweis: genaue Feldnamen auf Version und Mine der Build-Nummer von Forge je ändern können.

Nennen Sie es entweder kurz bevor Du verletzt der Einheit (den verletzten Widerstand Timer unter Umgehung von allen anderen Quellen zugefügten Schaden) oder nach (Ihr Schaden wird ignoriert, wenn ein Timer gibt es, aber wenn es einen Schaden, die nächste Quelle wird nicht wegen des Timers ignoriert). Diese Linie muss in der Pfeil Klasse sein. Wenn Sie keine benutzerdefinierte Pfeilklasse haben, ist jetzt ein guter Zeitpunkt, um eine zu erstellen.

Es gibt keine (gute) Möglichkeit, den Timer bedingt auf den vorherigen Schadenstyp bedingt einzustellen, leider. Wenn Sie auf 1.10 oder neuer sind, könnten Sie Funktionen verwenden, obwohl möglicherweise unhandlich.

+0

Vielen Dank, aber ich frage mich, ob es eine Möglichkeit gibt, die EntityArrow-Klasse zu überschreiben, um dieses Feld zu ändern. – TheMCProgrammer

+1

Ja. Erstelle eine neue Entity-Klasse, verändere, was du brauchst, und spawne sie von deinem eigenen statt vom Original. Ich mache das in meinem [Artifacts mod] (https://github.com/Draco18s/Artifacts). Es ist 1.7 Code, aber das allgemeine Prinzip hat sich nicht geändert. – Draco18s

+1

@TheMCProgrammer Ja. Erstelle eine neue Entity-Klasse, ersetze was du brauchst und spawne sie von deinem Gegenstand anstatt vom Original. Ich habe das in meinem [Artifacts mod] (https://github.com/Draco18s/Artifacts) gemacht (siehe entities/für die Pfeilklasse und die Pfeilfalle). Es ist 1.7 Code, aber das allgemeine Prinzip hat sich nicht geändert. – Draco18s

Verwandte Themen