Posted July 19, 201312 yr I was wondering how to make an entity look like the item used to throw it. (Just like a snowball) I copied the rendersnowball class but it didn't really work. What code would I use to do this?
July 19, 201312 yr http://www.minecraftforge.net/wiki/Senitiel%27s_the_Making_of_Space_Marine_Mod I would check out this tutorial, I don't know if it is updated to the most recent forge, but it looks like it talks about rendering projectiles.
July 19, 201312 yr Author I've used that tutorial to make an item which shoots a custom entity. I'm not sure how to make the item shoot an entity which looks exactly like the item. That tutorial explains how to make an item, like a bow, which shoots a different projectile. I'm looking to make a snowball type item.
July 19, 201312 yr Author Well i figured it out. I used render fireball. But now the problem is that when i throw it, the entity is like 50x the normal size. How do I make it smaller?
July 19, 201312 yr GL11.glScalef(1/50f, 1/50f, 1/50f); how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 19, 201312 yr Author also do you know how to add a delay so you cant spam right click the item and make the entity come out of my hand and not my face?
July 19, 201312 yr place a delay in the nbt of the itemstack then onItemUse check if it has been enough time since last shot ps: people will still be able to switch between 2 itemstack and still sortof spam, but itll limit the spamming becuase it would be kinda annoying to 1, right-click, 2, right-click, 1, right-click, 2, right-click, 1, right-click, 2, right-click, 1, right-click, 2, right-click how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 19, 201312 yr Author what does this delay method look like lol sorry. oh and I modified my comment above if you know how to fix the second part too?
July 19, 201312 yr look on the wiki for nbt and possibly this post as it containt a valuable guide for everything in forge (specially first answer) http://www.minecraftforum.net/topic/1892328-need-a-highly-detailed-152-guide/ as for shooting out of the hand instead of the head, you would have to make a class like EntityThrowable and change the spawn position to that its place at steve's hand position how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 19, 201312 yr private long delay = 0L; private long cooldown = 2000L; //2 seconds public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if(delay > System.getCurrentTimeMillis()) { //throw entity par1ItemStack.stackSize--; delay = System.getCurrentTimeMillis() + cooldown; } return par1ItemStack; }
July 19, 201312 yr guff in which class is this code located ? on X entends Item? then you realise that the timer will "on cooldown" for everyone in the server right ? as there is only 1 isntance per item but multiple itemstack how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 19, 201312 yr Yes, I know this. I'm pretty adept with NBT. However, unless everyone on the server were to be using it at the same time, this wouldn't affect anything much. If it really is a problem: private final int cooldown = 40; //2 second cooldown in ticks, this is the same for all items since it will never change. @Override public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { NBTTagCompound nbt = par1ItemStack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); par1ItemStack.setTagCompound(nbt); } int delay = nbt.getInteger("delay"); if(delay == 0) { //throw entity par1ItemStack.stackSize--; delay = cooldown; } return par1ItemStack; } @Override public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) { NBTTagCompound nbt = par1ItemStack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); par1ItemStack.setTagCompound(); } int delay = nbt.getInteger("delay"); if(delay > 0) { delay--; nbt.setInteger("delay", delay); } }
July 19, 201312 yr ok, I don't personally mind if its done that way because its actually a super easy solution, but it contains a mega annoying bug. @Guff, as long as you know what are the implication of coding it this way @op, guff 2nd code is the best way to go unless it looks too complicated and you don't mind the bug caused by his first implementation. how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 19, 201312 yr It's in the comment: if(delay == 0) { //throw entity par1ItemStack.stackSize--; delay = cooldown; }
July 19, 201312 yr Author i've pasted the line there but now it throws two entities? I right click once and it throws two at a half second interval between.
July 19, 201312 yr Author I don't know what I'm doing wrong (Sorry if I'm being terribly ignorant or annoying) but it's not adding a delay and if I go into survival it uses 2 of the item when I click once. public class ItemMagicPotato extends Item { private final int cooldown = 200; public ItemMagicPotato(int par1) { super(par1); this.maxStackSize = 8; } @Override public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if(par3EntityPlayer.capabilities.isCreativeMode||par3EntityPlayer.inventory.consumeInventoryItem(MagicElementsMod.magicpotato.itemID)) { NBTTagCompound nbt = par1ItemStack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); par1ItemStack.setTagCompound(nbt); } int delay = nbt.getInteger("delay"); if(delay == 0) { if (!par2World.isRemote) { par2World.spawnEntityInWorld(new EntityMagicPotato(par2World, par3EntityPlayer)); } par1ItemStack.stackSize--; delay = cooldown; } } return par1ItemStack; } @Override public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) { NBTTagCompound nbt = par1ItemStack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); par1ItemStack.setTagCompound(nbt); } int delay = nbt.getInteger("delay"); if(delay > 0) { delay--; nbt.setInteger("delay", delay); } } public boolean hasEffect(ItemStack par1ItemStack) { return true; } }
July 19, 201312 yr Haha woops. I forgot this. Under delay = cooldown, put this: nbt.setInteger("delay", delay);
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.