Jump to content

Recommended Posts

Posted

Its not crashing as o sead  its  not working meaning its not changing anything after i changed

nbtDataCompund = itemStack.stackTagCompound();

to

nbtDataCompund = itemStack.getTagCompound();

Well, the one that I marked in bold shouldn't even compile as it is not a method.

 

Anyway, I bet your cooldown isn't working as you expect because in most cases, you never set it. Figuring out what is wrong in cases like this is a simple game of "print the value at different points in your code".

 

In your #itemInteractionForEntity method, put a println in each of your if statements telling you where you are at; put another at the end of the method when you set the cooldown.

 

Now start the game and right click on a couple entities, and see if you are ever seeing the last println - with all of those early return statements, I bet you won't see it.

Posted

true  i did not see it , so you said i have to set it ? i tried to set it with

nbtDataCompund.setInteger("coolDown", 0); is that right ?

Technically I suppose, but what do you expect to happen with that statement? What does that statement even say? It says: set the cooldown to ZERO.

 

Look, this really shouldn't be that difficult - all it takes is sitting down for a second and thinking about what you want your code to do, in plain English, like this:

When the player right-clicks on an entity with my item, the following should happen:
   1. If the entity is a mob and the item is full, a message displays for the player
   2. If the entity is a mob and the item is NOT full and NOT cooling down, the mob should immediately die, the item takes 1 point of damage, and the item goes on cooldown for X ticks

Something like that, anyway. When you're done writing the work-flow, compare it to your code and see if your code is

doing what you wrote.

 

Also, ItemStacks GAIN damage, so you should be adding positive 1, not -1.

Posted

the reason i'm not making it gain damage with 1 is because i want it to lose damage because the bar on the bottom of the item represents how much is left and thanks for the help i got it to work.

Posted

thats not what im talking about.... i asked is there a limit on how much metadata you can use ? for example can i have a item with 1000 metadatas?

its a yes or no quistion >.> but you responed with It's a full short, so 0-Short.MAX_VALUE.

Posted

Its not java or anything my computer os litarly crashing hard core so im having to do a system restore  if that dont work then a clean whip

 

You're on the wrong forum for that kind of help.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Its not java or anything my computer os litarly crashing hard core so im having to do a system restore  if that dont work then a clean whip

 

If your having those problems then you do not need to be worrying about NBT xp.

Development of Plugins [2012 - 2014] Development of Mods [2012 - Current]

Posted

after i got a new hard drive reinstalled , i start crashing .. this wasn't happening before this.

 

 

Caused by: java.lang.NullPointerException

at com.mightydanp.eot.item.ItemMagicalStone.addInformation(ItemMagicalStone.java:90) ~[itemMagicalStone.class:?]

at net.minecraft.item.ItemStack.getTooltip(ItemStack.java:641) ~[itemStack.class:?]

at net.minecraft.client.gui.GuiScreen.renderToolTip(GuiScreen.java:124) ~[GuiScreen.class:?]

at net.minecraft.client.gui.inventory.GuiContainerCreative.renderToolTip(GuiContainerCreative.java:769) ~[GuiContainerCreative.class:?]

at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:186) ~[GuiContainer.class:?]

at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:44) ~[inventoryEffectRenderer.class:?]

at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:673) ~[GuiContainerCreative.class:?]

at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1137) ~[EntityRenderer.class:?]

 

 

 

code

 

http://pastebin.com/H74hDjeC

Posted

so i am sepost to do something like this?

if (nbtDataCompund == null)

{

// do something?

}

im just confused right now

Almost, and maybe, depending on what you want to do.

 

Think of it this way: if the ItemStack doesn't have a tag compound, what should the addInformation method display about the cooldown time?

 

In other words, the stack doesn't have any information about a cooldown yet, so what are you going to display? And if it does have that information, what do you want to display?

 

So:

if (stack.getTagCompound() == null) {
  // tag means no cooldown information available
} else {
  // there is a tag, so maybe it has some information about the cooldown
}

Posted

Contemplate: (fixed all bad practices).

 

@Override
public void onUpdate(ItemStack itemStack, World world, Entity entity, int i, boolean flag)
{
	if (!world.isRemote)
	{
		NBTTagCompound nbtDataCompund = itemStack.stackTagCompound;
		if (nbtDataCompund == null)
		{
			itemStack.stackTagCompound = new NBTTagCompound();
			nbtDataCompund = itemStack.getTagCompound();
		}

		int coolDown = nbtDataCompund.getInteger("coolDown");

		if (coolDown > 0)
		{
			--coolDown;
			nbtDataCompund.setInteger("coolDown", coolDown);
		}
	}
}

@SideOnly(Side.CLIENT)
public void addInformation(ItemStack itemStack, EntityPlayer player, List dataList, boolean bool)
{
	if (itemStack.getItemDamage() < subItems.length)
	{
		dataList.add(subItemsDescriptionsFirstLine[itemStack.getItemDamage()]);
		dataList.add(subItemsDescriptionsSecondLine[itemStack.getItemDamage()]);
		dataList.add(subItemsDescriptionsThirdLine[itemStack.getItemDamage()]);
	}

	NBTTagCompound nbtDataCompund = itemStack.stackTagCompound;
	if (nbtDataCompund != null)
	{
		int coolDown = nbtDataCompund.getInteger("coolDown");

		if (coolDown > 0)
		{
			dataList.add(subItemsCoolDownDescriptionsFirstLine[itemStack.getItemDamage()]);
			dataList.add(subItemsCoolDownDescriptionsSecondLine[itemStack.getItemDamage()]);
			dataList.add(subItemsCoolDownDescriptionsThirdLine[itemStack.getItemDamage()]);
		}
	}
}

@Override
public boolean itemInteractionForEntity(ItemStack itemStack, EntityPlayer entityplayer, EntityLivingBase entity )
{
	if (!entity.worldObj.isRemote)
	{
		NBTTagCompound nbtDataCompund = itemStack.stackTagCompound;
		if (nbtDataCompund != null)
		{
			int coolDown = nbtDataCompund.getInteger("coolDown");

			if (coolDown > 0)
			{
				return false;
			}

			if (coolDown == 0)
			{
				if (entity instanceof EntityMob)
				{
					if (itemStack.getItemDamage() > 0)
					{
						entity.setHealth(0.0F);
						nbtDataCompund.setInteger("coolDown", 180);
						entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY +"Soul Absurbed!"));
						itemStack.damageItem(1, entityplayer);
						return true;
					}
					else
					{
						entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY + "The  Magical Stone seems to be full?"));
						entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY + "It seems to be useless now."));
						entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY + "I wonder whats inside?"));
						return true;
					}
				}
				else
				{
					entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY + "Why has this stoped working?"));
				}
			}
		}
		else
		{
			entityplayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GRAY + "NBT is null, wtf?"));
		}
	}
	return false;
}

 

Note:

onUpdate() is called ALWAYS when Item is inside player's inventory, thus - NBT can ONLY be null if item was never in player's inventory.

 

EDIT

I have one question - do you know what you are doing with this statement: if (itemStack.getItemDamage() > 0)

ItemStack's DAMAGE == METADATA.

Field is called "int itemDamage;" and can be used to do 2 things - either make sub-items OR make damagable item.

Damage == 0 means that ItemStack is NOT damaged. Every incrementation (itemDamage > 0) means that itemStack has been damaged.

Item#maxDamage defined maximum damage item can have if you decide to use IteamStack#itemDamage field to describe its damage (NOT metada-sub-item). Think of what you want to archieve there. Have subtypes or have chargeable wand?

1.7.10 is no longer supported by forge, you are on your own.

Posted

yes i do know what i am doing with the getItemDamage() and such, i do have a quistion, after a built my jar, put some of the class files like this

laTLmJU.png

 

basicly the class files are out of the com folder...

 

when i started it up with regurlar client forge and opened my inventory it crashed with

 

This doesn't make any sense!

 

 

 

Time: 10/10/15 7:30 PM

Description: Unexpected error

 

java.lang.IllegalAccessError: tried to access field net.minecraft.client.gui.GuiScreen.field_146292_n from class tconstruct.client.tabs.TabRegistry

at tconstruct.client.tabs.TabRegistry.guiPostInit(TabRegistry.java:44)

at cpw.mods.fml.common.eventhandler.ASMEventHandler_6_TabRegistry_guiPostInit_Post.invoke(.dynamic)

at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54)

at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:138)

at net.minecraft.client.gui.GuiScreen.func_146280_a(GuiScreen.java:257)

at net.minecraft.client.Minecraft.func_147108_a(Minecraft.java:808)

at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1895)

at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:973)

at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:898)

at net.minecraft.client.main.Main.main(SourceFile:148)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)

at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

 

 

 

this is the code that says its crashing

 

public void preInit(FMLPreInitializationEvent event) {

MinecraftForge.EVENT_BUS.register(new TabRegistry());

}

 

am i doing something wrong in my code to cause this or? glaticraft does the same thing in there class

 

https://github.com/micdoodle8/Galacticraft/blob/master/src/main/java/micdoodle8/mods/galacticraft/core/proxy/ClientProxyCore.java

 

Posted

This is merely an example - it is an efficient cooldown in which NBT is not being stressed every tick. The world total time does the counting for you. This WILL break if you use getWorldTime() instead of using getTotalWorldTime(). Reason for that - if you are using getWorldTime() and then set the world time to day / night / custom time, it WILL break and return a cooldown that is either extensively long, or no cooldown at all. Just something to remember.

 

if(itemstack.hasTagCompound()
{
    final Long time = itemstack.getTagCompound().getLong("Cooldown");
    if(time < THE TOTAL WORLD TIME)
    {
        DO WHAT YOU NEED HERE THEN SET THE COOLDOWN
        itemstack.setTagCompound("Cooldown", THE TOTAL WORLD TIME + YOUR COOLDOWN TIME IN TICKS);
    }
}
else
{
    itemstack.setTagCompound(new NBTTagCompound());
}

Development of Plugins [2012 - 2014] Development of Mods [2012 - Current]

Posted

This is merely an example - it is an efficient cooldown in which NBT is not being stressed every tick. The world total time does the counting for you. This WILL break if you use getWorldTime() instead of using getTotalWorldTime(). Reason for that - if you are using getWorldTime() and then set the world time to day / night / custom time, it WILL break and return a cooldown that is either extensively long, or no cooldown at all. Just something to remember.

 

if(itemstack.hasTagCompound()
{
    final Long time = itemstack.getTagCompound().getLong("Cooldown");
    if(time < THE TOTAL WORLD TIME)
    {
        DO WHAT YOU NEED HERE THEN SET THE COOLDOWN
        itemstack.setTagCompound("Cooldown", THE TOTAL WORLD TIME + YOUR COOLDOWN TIME IN TICKS);
    }
}
else
{
    itemstack.setTagCompound(new NBTTagCompound());
}

 

While world timestamps are cool for most stuff and using them is often advertised on this forum with great praise, I must say that I am quite amazed how many people miss the fact or forget to mention that there can be more worlds than just one.

"If something can fail, it will." - Me. - And above (world timestamps) is among those things.

 

Solution is quite obvious (ServerTickEvent and global timestamp).

1.7.10 is no longer supported by forge, you are on your own.

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

×   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 Terms of Use.