Hello, I want to make a trowable item, but when I use it, I dont see anything. How could I fix that? I also want my item to dissaper from my inventory, then when it hit something, It give me a new item. Here's my code
ItemBoomerangHammer
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ItemBoomerangHammer extends Item
{
public ItemBoomerangHammer(int i)
{
super(i);
maxStackSize = 1;
}
public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
if (!par3EntityPlayer.capabilities.isCreativeMode)
{
--par1ItemStack.stackSize;
}
par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
if (!par2World.isRemote)
{
par2World.spawnEntityInWorld(new EntityBoomerangHammer(par2World, par3EntityPlayer));
}
return par1ItemStack;
}
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
{
par3List.add("Acts like a boomerang");//the color code trick works here aswell
}
public String Version()
{
return "LegendsCraft V0.2 for Minecraft 1.4.6";
}
}
EntityBoomerangHammer
package net.minecraft.src;
public class EntityBoomerangHammer extends EntityThrowable
{
public EntityBoomerangHammer(World par1World)
{
super(par1World);
}
public EntityBoomerangHammer(World par1World, EntityLiving par2EntityLiving)
{
super(par1World, par2EntityLiving);
}
public EntityBoomerangHammer(World par1World, double par2, double par4, double par6)
{
super(par1World, par2, par4, par6);
}
/**
* Called when this EntityNamehereable hits a block or entity.
*/
protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
{
if (par1MovingObjectPosition.entityHit != null)
{
byte var2 = 6;
if (!par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.func_85052_h()), var2));
}
for (int var3 = 0; var3 < 8; ++var3)
{
this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
}
if (!this.worldObj.isRemote)
{
this.setDead();
}
}
}
For the invisibility problem, you need a RenderBoomerangHammer class, that if you are making a forge mod needs to be registered with the client proxy, then once it hits something just use:
ok, I added a Render class, but now, what I have to do? I'm using Modloader, not Forge. Here's my code (copied it from the RenderSnowball):
package net.minecraft.src;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class RenderSnowball extends Render
{
/**
* Have the icon index (in items.png) that will be used to render the image. Currently, eggs and snowballs uses this
* classes.
*/
private int itemIconIndex;
public RenderSnowball(int par1)
{
this.itemIconIndex = par1;
}
/**
* Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
* handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
* (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
* double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
*/
public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
{
GL11.glPushMatrix();
GL11.glTranslatef((float)par2, (float)par4, (float)par6);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glScalef(0.5F, 0.5F, 0.5F);
this.loadTexture("/gui/items.png");
Tessellator var10 = Tessellator.instance;
if (this.itemIconIndex == 154)
{
int var11 = PotionHelper.func_77915_a(((EntityPotion)par1Entity).getPotionDamage(), false);
float var12 = (float)(var11 >> 16 & 255) / 255.0F;
float var13 = (float)(var11 >> 8 & 255) / 255.0F;
float var14 = (float)(var11 & 255) / 255.0F;
GL11.glColor3f(var12, var13, var14);
GL11.glPushMatrix();
this.func_77026_a(var10, 141);
GL11.glPopMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
}
this.func_77026_a(var10, this.itemIconIndex);
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
GL11.glPopMatrix();
}
private void func_77026_a(Tessellator par1Tessellator, int par2)
{
float var3 = (float)(par2 % 16 * 16 + 0) / 256.0F;
float var4 = (float)(par2 % 16 * 16 + 16) / 256.0F;
float var5 = (float)(par2 / 16 * 16 + 0) / 256.0F;
float var6 = (float)(par2 / 16 * 16 + 16) / 256.0F;
float var7 = 1.0F;
float var8 = 0.5F;
float var9 = 0.25F;
GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
par1Tessellator.startDrawingQuads();
par1Tessellator.setNormal(0.0F, 1.0F, 0.0F);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(0.0F - var9), 0.0D, (double)var3, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(0.0F - var9), 0.0D, (double)var4, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(var7 - var9), 0.0D, (double)var4, (double)var5);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(var7 - var9), 0.0D, (double)var3, (double)var5);
par1Tessellator.draw();
}
}
their is also a problem with the code that you gave to me. Their is an eror at EntityPlayer.inventory and it says : Canot make a static reference to the non-static reference EntityPlayer.inventory
No offense, but ModLoader is outdated. I would highly recommend moving to Forge. It *makes* things easier. I'd also recommend looking up some basic Java tutorials to get a better understanding of what's what And also, always remember! Google is your friend.
1. change rendersnowball everywhere to render boomerang.
2. change this.texture to ur own texture.
3. use par3EntityPlayer instead of entityPlayer, you need the right variable.
4. in your mod_ file you have to add this line of code:
public void addRender(Map map)
{
map.put(YourEntity.class, new YourRender());
}
edit:
inside the brackets of YourRender() add the number of the image in the image file from step 2.
In your case it's 0.
it should look like this:
public void addRender(Map map)
{
map.put(EntityBoomerangHammer.class, new RenderBoomerangHammer(0));
}
I tried that, but it didn't worked. It's probably an error that I made and that I didn't saw. Here's my modified code:
RenderBoomerangHammer
package net.minecraft.src;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class RenderBoomerangHammer extends Render
{
/**
* Have the icon index (in items.png) that will be used to render the image. Currently, eggs and snowballs uses this
* classes.
*/
private int itemIconIndex;
public RenderBoomerangHammer(int par1)
{
this.itemIconIndex = par1;
}
/**
* Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
* handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
* (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
* double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
*/
public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
{
GL11.glPushMatrix();
GL11.glTranslatef((float)par2, (float)par4, (float)par6);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glScalef(0.5F, 0.5F, 0.5F);
this.loadTexture("/Legendscraft/items/BoomerangHammer.png");
Tessellator var10 = Tessellator.instance;
if (this.itemIconIndex == 0)
{
int var11 = PotionHelper.func_77915_a(((EntityPotion)par1Entity).getPotionDamage(), false);
float var12 = (float)(var11 >> 16 & 255) / 255.0F;
float var13 = (float)(var11 >> 8 & 255) / 255.0F;
float var14 = (float)(var11 & 255) / 255.0F;
GL11.glColor3f(var12, var13, var14);
GL11.glPushMatrix();
this.func_77026_a(var10, 141);
GL11.glPopMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
}
this.func_77026_a(var10, this.itemIconIndex);
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
GL11.glPopMatrix();
}
private void func_77026_a(Tessellator par1Tessellator, int par2)
{
float var3 = (float)(par2 % 16 * 16 + 0) / 256.0F;
float var4 = (float)(par2 % 16 * 16 + 16) / 256.0F;
float var5 = (float)(par2 / 16 * 16 + 0) / 256.0F;
float var6 = (float)(par2 / 16 * 16 + 16) / 256.0F;
float var7 = 1.0F;
float var8 = 0.5F;
float var9 = 0.25F;
GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
par1Tessellator.startDrawingQuads();
par1Tessellator.setNormal(0.0F, 1.0F, 0.0F);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(0.0F - var9), 0.0D, (double)var3, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(0.0F - var9), 0.0D, (double)var4, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(var7 - var9), 0.0D, (double)var4, (double)var5);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(var7 - var9), 0.0D, (double)var3, (double)var5);
par1Tessellator.draw();
}
}
mod_File
public void addRender(Map map)
{
map.put(EntityBoomerangHammer.class, new RenderBoomerangHammer(0));
}
EntityBoomerangHammer
package net.minecraft.src;
public class EntityBoomerangHammer extends EntityThrowable
{
public EntityBoomerangHammer(World par1World)
{
super(par1World);
}
public EntityBoomerangHammer(World par1World, EntityLiving par2EntityLiving)
{
super(par1World, par2EntityLiving);
}
public EntityBoomerangHammer(World par1World, double par2, double par4, double par6)
{
super(par1World, par2, par4, par6);
}
/**
* Called when this EntityNamehereable hits a block or entity.
*/
protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
{
if (par1MovingObjectPosition.entityHit != null)
{
byte var2 = 6;
if (!par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.func_85052_h()), var2));
}
for (int var3 = 0; var3 < 8; ++var3)
{
this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
}
par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(mod_Legendscraft.BoomerangHammer, 1));
if (!this.worldObj.isRemote)
{
this.setDead();
}
}
}
their's an error with the par3EntityPlayer, saying that it can't be resolved
that's weird, even with the addRenderer, It still doesn't work.
Also,thanks for the item give, but how could I make a delay between the moment when you lauch it and the moment when you receive a new one? I'll try to find an answer on google for if you don't know why it doesn't work
I dont have any error, it is just invisible. I also tried 1 instead of 0, but it still doesn't work. Here's my code :
mod_Legendscraft
package net.minecraft.src;
import java.util.Random;
import java.util.Map;
public class mod_Legendscraft extends BaseMod{
public static final Item MagiumGem = new ItemMagiumGem(500).setItemName("MagiumGem");
public static final Item MagiumStone = new ItemMagiumStone(501).setItemName("MagiumStone");
public static final Item RecallStone = new ItemRecallStone(502).setItemName("RecallStone");
public static final Item FireBallBook = new ItemFireBallBook(503).setItemName("FireBallBook");
public static final Item BoomerangHammer = new ItemBoomerangHammer(504).setItemName("BoomerangHammer");
public static final Item GorgoneHead = new ItemGorgoneHead(505).setItemName("GorgoneHead");
public static final Item NecromancyScepter = new ItemNecromancyScepter(506).setItemName("NecromancyScepter");
public static final Block MagiumOre = new BlockMagiumOre(151, 0).setHardness(7.0F).setResistance(5.0F).setLightValue(0.7F).setBlockName("MagiumOre");
//Ore generating
public void generateSurface(World world, Random random, int chunkX, int chunkZ)
{
//Generate Magium in the world
Random randomGenerator = random;
for (int i = 0; i < 10; i++)
{
int randPosX = chunkX + randomGenerator.nextInt(20);
int randPosY = random.nextInt(32);
int randPosZ = chunkZ + randomGenerator.nextInt(20);
(new WorldGenMinable(MagiumOre.blockID, 3)).generate(world, random, randPosX, randPosY, randPosZ);
}
}
public void addRenderer(Map map)
{
map.put(EntityBoomerangHammer.class, new RenderBoomerangHammer(1));
}
public void load()
{
//Textures
MagiumGem.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/MagiumGem.png");
MagiumStone.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/MagiumStone.png");
RecallStone.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/RecallStone.png");
FireBallBook.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/FireBallBook.png");
BoomerangHammer.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/BoomerangHammer.png");
GorgoneHead.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/GorgoneHead.png");
NecromancyScepter.iconIndex = ModLoader.addOverride("/gui/items.png" , "/Legendscraft/items/NecromancyScepter.png");
MagiumOre.blockIndexInTexture = ModLoader.addOverride("/terrain.png" , "/Legendscraft/terrain/MagiumOre.png");
//Creative Tabs
MagiumGem.setCreativeTab(CreativeTabs.tabMaterials);
MagiumStone.setCreativeTab(CreativeTabs.tabMaterials);
RecallStone.setCreativeTab(CreativeTabs.tabMisc);
MagiumOre.setCreativeTab(CreativeTabs.tabBlock);
FireBallBook.setCreativeTab(CreativeTabs.tabCombat);
BoomerangHammer.setCreativeTab(CreativeTabs.tabCombat);
NecromancyScepter.setCreativeTab(CreativeTabs.tabMisc);
GorgoneHead.setCreativeTab(CreativeTabs.tabMaterials);
//Block register
ModLoader.registerBlock(MagiumOre);
//Names
ModLoader.addName(MagiumGem, "Magium gem");
ModLoader.addName(MagiumStone, "Magium stone");
ModLoader.addName(RecallStone, "Recall stone");
ModLoader.addName(FireBallBook, "Fireball Spellbook");
ModLoader.addName(BoomerangHammer, "Boomerang Hammer");
ModLoader.addName(GorgoneHead, "Gorgone Head");
ModLoader.addName(NecromancyScepter, "Necromancy Scepter");
ModLoader.addName(MagiumOre, "Magium ore");
//Recipes
ModLoader.addRecipe(new ItemStack(MagiumStone, 1), new Object[]
{"XXX", "XXX", "XXX",
'X', mod_Legendscraft.MagiumGem,});
ModLoader.addRecipe(new ItemStack(RecallStone, 1), new Object[]
{"XXX", "X*X", "XXX",
'*', mod_Legendscraft.MagiumStone,'X', Item.ingotGold,});
ModLoader.addRecipe(new ItemStack(FireBallBook, 1), new Object[]
{"FBF", "***", "XXX",
'*', mod_Legendscraft.MagiumStone,'F', Item.fireballCharge,'B', Item.book,'X', Item.ghastTear,});
ModLoader.addRecipe(new ItemStack(NecromancyScepter, 1), new Object[]
{"FMF", "M*M", " * ",
'*', Item.bone,'F', Item.rottenFlesh,'M', mod_Legendscraft.MagiumStone,});
}
public String getVersion()
{
return "Legendscraft V0.2 for Minecraft 1.4.6";
}
}
ItemBoomerangHammer
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ItemBoomerangHammer extends Item
{
public ItemBoomerangHammer(int i)
{
super(i);
maxStackSize = 1;
}
public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
if (!par3EntityPlayer.capabilities.isCreativeMode)
{
--par1ItemStack.stackSize;
}
par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
if (!par2World.isRemote)
{
par2World.spawnEntityInWorld(new EntityBoomerangHammer(par2World, par3EntityPlayer));
par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(mod_Legendscraft.BoomerangHammer, 1));
}
return par1ItemStack;
}
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
{
par3List.add("Acts like a boomerang");//the color code trick works here aswell
}
public String Version()
{
return "LegendsCraft V0.1 for Minecraft 1.4.5";
}
}
EntityBoomerangHammer
package net.minecraft.src;
public class EntityBoomerangHammer extends EntityThrowable
{
public EntityBoomerangHammer(World par1World)
{
super(par1World);
}
public EntityBoomerangHammer(World par1World, EntityLiving par2EntityLiving)
{
super(par1World, par2EntityLiving);
}
public EntityBoomerangHammer(World par1World, double par2, double par4, double par6)
{
super(par1World, par2, par4, par6);
}
/**
* Called when this EntityNamehereable hits a block or entity.
*/
protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
{
if (par1MovingObjectPosition.entityHit != null)
{
byte var2 = 6;
if (!par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.func_85052_h()), var2));
}
for (int var3 = 0; var3 < 8; ++var3)
{
this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
}
if (!this.worldObj.isRemote)
{
this.setDead();
}
}
}
RenderBoomerangHammer
package net.minecraft.src;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class RenderBoomerangHammer extends Render
{
/**
* Have the icon index (in items.png) that will be used to render the image. Currently, eggs and snowballs uses this
* classes.
*/
private int itemIconIndex;
public RenderBoomerangHammer(int par1)
{
this.itemIconIndex = par1;
}
/**
* Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
* handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
* (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
* double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
*/
public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
{
GL11.glPushMatrix();
GL11.glTranslatef((float)par2, (float)par4, (float)par6);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glScalef(0.5F, 0.5F, 0.5F);
this.loadTexture("/Legendscraft/items/BoomerangHammer.png");
Tessellator var10 = Tessellator.instance;
if (this.itemIconIndex == 1)
{
int var11 = PotionHelper.func_77915_a(((EntityPotion)par1Entity).getPotionDamage(), false);
float var12 = (float)(var11 >> 16 & 255) / 255.0F;
float var13 = (float)(var11 >> 8 & 255) / 255.0F;
float var14 = (float)(var11 & 255) / 255.0F;
GL11.glColor3f(var12, var13, var14);
GL11.glPushMatrix();
this.func_77026_a(var10, 141);
GL11.glPopMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
}
this.func_77026_a(var10, this.itemIconIndex);
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
GL11.glPopMatrix();
}
private void func_77026_a(Tessellator par1Tessellator, int par2)
{
float var3 = (float)(par2 % 16 * 16 + 0) / 256.0F;
float var4 = (float)(par2 % 16 * 16 + 16) / 256.0F;
float var5 = (float)(par2 / 16 * 16 + 0) / 256.0F;
float var6 = (float)(par2 / 16 * 16 + 16) / 256.0F;
float var7 = 1.0F;
float var8 = 0.5F;
float var9 = 0.25F;
GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
par1Tessellator.startDrawingQuads();
par1Tessellator.setNormal(0.0F, 1.0F, 0.0F);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(0.0F - var9), 0.0D, (double)var3, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(0.0F - var9), 0.0D, (double)var4, (double)var6);
par1Tessellator.addVertexWithUV((double)(var7 - var8), (double)(var7 - var9), 0.0D, (double)var4, (double)var5);
par1Tessellator.addVertexWithUV((double)(0.0F - var8), (double)(var7 - var9), 0.0D, (double)var3, (double)var5);
par1Tessellator.draw();
}
}
I tried looking on youtube, but I dont see any recent tutorials. Every tutorials about throwable items are about 6 month old and they do the exact same thing as I do, but it doesn't work for me
ItemBoomerangHammer
EntityBoomerangHammer
their is also a problem with the code that you gave to me. Their is an eror at EntityPlayer.inventory and it says : Canot make a static reference to the non-static reference EntityPlayer.inventory
How could I fix that?
I tried that, but it didn't worked. It's probably an error that I made and that I didn't saw. Here's my modified code:
RenderBoomerangHammer
mod_File
EntityBoomerangHammer
their's an error with the par3EntityPlayer, saying that it can't be resolved
Also,thanks for the item give, but how could I make a delay between the moment when you lauch it and the moment when you receive a new one? I'll try to find an answer on google for if you don't know why it doesn't work
mod_Legendscraft
ItemBoomerangHammer
EntityBoomerangHammer
RenderBoomerangHammer
I tried looking on youtube, but I dont see any recent tutorials. Every tutorials about throwable items are about 6 month old and they do the exact same thing as I do, but it doesn't work for me