2017-05-04 1 views
0

J'ai fait un arc spécial qui se déclenche très rapidement, et j'ai appris que tous les monstres sont invulnérables pendant une courte période après avoir été touchés . Cela rend mon arc pratiquement inutile. Je me demandais s'il y avait moyen de changer la durée d'invulnérabilité des monstres, ou même de les supprimer du tout.MineCraft Forge Comment empêcher les monstres d'être invulnérables après un coup (Java) 1.10.2

code pour la méthode de tir à l'arc:

@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: solution trouvée: Merci à @ Draco18s J'ai trouvé la solution. Tout ce que je devais faire était d'ajouter la ligne

entityArrow.hurtResistantTime = 0 
+0

Êtes-vous sûr qu'ils sont invulnérables? Avez-vous vérifié ce que leur santé fait réellement? Quel débogage avez-vous fait? – Carcigenicate

+0

Eh bien, les flèches me reviennent littéralement. – TheMCProgrammer

+1

Il y a aussi un fil de discussion sur bukkit à ce sujet: [link] https://bukkit.org/threads/how-to-change-mob-invulnerability-duration-after-get-hit.278296/ [link] – TheMCProgrammer

Répondre

1

Vous devez ceci:

entityHit.hurtResistantTime = 0;

Note: le nom du champ exact peut varier en fonction de la version Minecraft et le numéro de build de Forge.

Appelez cela soit juste avant que vous blesser l'entité (sans passer par les minuteries de résistance mal infligés par toutes les autres sources de dommages) ou après (vos dégâts est ignoré s'il y a une minuterie, mais si elle inflige des dégâts, la source suivante n'est pas ignoré en raison de la minuterie). Cette ligne doit être dans la classe flèche. Si vous n'avez pas de classe de flèche personnalisée, c'est le bon moment pour en faire un.

Il n'y a pas (bon) moyen de régler le temporisateur à 0 selon le type de dommage précédent, malheureusement. Si vous êtes sur 1.10 ou plus récent, vous pourriez utiliser des capacités, bien que potentiellement lourdes.

+0

Merci beaucoup, mais je me demandais s'il y avait un moyen de surcharger la classe EntityArrow pour changer ce champ. – TheMCProgrammer

+1

Oui. Créez une nouvelle classe d'entité, modifiez ce dont vous avez besoin et créez-la à partir de la vôtre plutôt que de l'original. Je fais cela dans mon [Artifacts mod] (https://github.com/Draco18s/Artifacts). C'est le code 1.7, mais le principe général n'a pas changé. – Draco18s

+1

@TheMCProgrammer Oui. Créez une nouvelle classe d'entité, remplacez ce dont vous avez besoin et générez-la à partir de votre article au lieu de l'original. Je l'ai fait dans mon [Artifacts mod] (https://github.com/Draco18s/Artifacts) (regardez entités/pour la classe de flèche et le piège de la flèche). C'est le code 1.7, mais le principe général n'a pas changé. – Draco18s