Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Shootable Item Delays


Recommended Posts

I currently have a custom shootable item which fires a projectile entity, what would be the best way to make it so that when right clicked it fires multiple in quick succession with a tick delay in between

Link to post
Share on other sites

So I thought that I had gotten pretty far on my own but now apparently my code crashes the game. I am new to using the forge API and modding in general and some help on why this crashes the game and how to fix it would be greatly appreciated:

 

public class SpecialItem extends ShootableItem {

     public SpecialItem(Properties properties){ super(properties); }

     @Override

     public Predicate<ItemStack> getInventoryAmmoPredicate() { return null; }

     @Override

     public int func_230305_d_() { return 15; }

     public int tcount=0;

     @SubscribeEvent public void ontick(TickEvent.ClientTickEvent event){

           tcount++;

     }

     @Override

     public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {

     if (!playerIn.getCooldownTracker().hasCooldown(this)) {

          playerIn.getCooldownTracker().setCooldown(this, 40);

          Vector3d v3 = playerIn.getLook(1);

          for (tcount = 0; tcount <= 40;) {

               if (tcount%10 == 0 && tcount!= 40) {

                    final SmallFireballEntity entitysmallfireball = new SmallFireballEntity(playerIn.getEntityWorld(), playerIn.getPosX(), playerIn.getPosY() + playerIn.getEyeHeight() - 0.4, playerIn.getPosZ(), v3.x + playerIn.getRNG().nextGaussian() * 0.05, v3.y, v3.z);

                    entitysmallfireball./* shoot */func_234612_a_(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0f, 1.5f, 1.0f); worldIn.addEntity(entitysmallfireball); } } tcount = 0;

                    return ActionResult.resultSuccess(playerIn.getHeldItem(handIn));

           } return ActionResult.resultFail(playerIn.getHeldItem(handIn));

     }

}

Link to post
Share on other sites
  • ClientTickEvent is the wrong event, you have to use ServerTickEvent. Also note that tick events fire twice every tick, check TickEvent#phase.
  • You cannot store variables like "tcount" in your item class, as there is only ever one instance of your item class so this variable will be shared between all instances of your item (e.g. if two players use it at the same time). You need to use either the ItemStack, a player capability or something like a global task system: A list of Runnables that your tick event runsy and which keep track of the timer themselves.
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.