Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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?

  • 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.

  • 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?

 

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-

  • 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?

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-

  • 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?

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-

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;
}

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-

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

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 :P

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

It's in the comment:

if(delay == 0)
{
     //throw entity
     par1ItemStack.stackSize--;
     delay = cooldown;
}

  • 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.

if (!par2World.isRemote)
        {
            par2World.spawnEntityInWorld(yourEntity);
        }

  • 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;
}
}

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.