Jump to content

Container item doesn't display 'lore' after being crafted with


Recommended Posts

Posted

Hello, I am making a transmutation stone. It has a limited number of uses (stored in nbt). I have subscribed to the ItemCrafted event, and I can assign NBT to the item and have it display the 'lore' - being the number of uses. When the item is crafted, it shows the uses ('Uses: 128', etc). However, after crafting with the item (for example, the stone + 1 gold ingot = 4 iron ingot), it does not display any of the information.

The addInformation method: 

    @Override
    public void addInformation(ItemStack stack, EntityPlayer player,
                               List list, boolean par4)
    {
        if (stack.stackTagCompound != null)
        {
            String owner = stack.stackTagCompound.getString("owner");
            Integer uses = stack.stackTagCompound.getInteger("uses");
            list.add("Owner: " + owner);
            if (uses > 95)
            {
                list.add("Uses: " + EnumChatFormatting.GREEN + uses);
            }
            if ((uses > 63) && (uses < 96))
            {
                list.add("Uses: " + EnumChatFormatting.YELLOW + uses);
            }
            if ((uses < 64) && (uses > 2))
            {
                list.add("Uses: " + EnumChatFormatting.RED + uses);
            }
            if (uses.equals(1))
            {
                list.add("Uses: " + EnumChatFormatting.DARK_RED + uses);
            }
        }
    }

 

The code for the itemcrafted event:

        for (int i = 0; i < e.craftMatrix.getSizeInventory(); i++)
        {
            if (e.craftMatrix.getStackInSlot(i) != null)
            {
                if (e.craftMatrix.getStackInSlot(i).getItem() == Transmutation.bStone)
                {
                    if (e.craftMatrix.getStackInSlot(i).stackTagCompound != null)
                    {
                        e.craftMatrix.getStackInSlot(i).stackTagCompound.setInteger("uses", (e.craftMatrix.getStackInSlot(i).stackTagCompound.getInteger("uses") - 1));
                        if (e.craftMatrix.getStackInSlot(i).stackTagCompound.getInteger("uses") < 1)
                        {
                            e.craftMatrix.setInventorySlotContents(i, null);
                            return;
                        }
                    }
                    return;
                }
            }
        }

 

How can I reassign the extra info after the item is crafted with?

 

Posted

I see, so you're telling it function like a bucket. But doesn't a bucket full of milk in a crafting recipe return an empty bucket? I think that is what is happening to your stone, you change the lore in the crafting table but since it's a container the crafting thing returns a new instance of the stone instead of one with lore. Maybe instead of having the stone be a container item, check to see if the stone was used in the recipe and if it was insert a new stone into the player's inventory with with one less use. I tried that myself with your code and it seemed to work fine.

 

edit: I wanted to avoid posting code but I may as well before I remove it. It's better if you try to follow the description and try to implement it yourself but if you're stumped on that:

@SubscribeEvent
public void onItemCraftEvent(ItemCraftedEvent e) {
	for (int i = 0; i < e.craftMatrix.getSizeInventory(); i++)
	{
		if (e.craftMatrix.getStackInSlot(i) != null)
		{
			if (e.craftMatrix.getStackInSlot(i).getItem() == SuperCool.superItem) //my item
			{
				if (e.craftMatrix.getStackInSlot(i).stackTagCompound != null)
				{
					e.craftMatrix.getStackInSlot(i).stackTagCompound.setInteger("uses", (e.craftMatrix.getStackInSlot(i).stackTagCompound.getInteger("uses") - 1));
					ItemStack superItem = e.craftMatrix.getStackInSlot(i); //stores the item with lore for future use
					if (e.craftMatrix.getStackInSlot(i).stackTagCompound.getInteger("uses") < 1)
					{
						e.craftMatrix.setInventorySlotContents(i, null);
					}else{
						InventoryPlayer inv = e.player.inventory; //no need for this, just wanted code to be more readable
						boolean placedItem = false;
                                                        //finds first empty slot, inserts the item with lore. 
						for (int j = 0; j < inv.getSizeInventory() && !placedItem; j++){
							if(inv.getStackInSlot(j) == null){
								inv.addItemStackToInventory(superItem);
								placedItem = true;
								e.player.inventory = inv;
							}
						}
						if(!placedItem) e.player.dropItem(superItem.getItem(), 1); //if all slots were full, drops item with lore on the ground
					}
				}
			}
		}
	}
}

Posted

I think I found it, I have to override the onCraft method and set the slot contents manually. I'll test soon, I'm not home either :P

 

Edit: never mind, that was a method for an old version of Forge (it used ICraftingHandler). I tried removing the isContainer method and placing the transmutation stone in the crafting grid during the ItemCrafted event but it just disappears.

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Update ColdSweat to the latest build: https://www.curseforge.com/minecraft/mc-mods/cold-sweat/files/6450271
    • Veuillez lire la FAQ (le lien est en haut de la page) et les journaux de publication tels que décrits ici. Cela aidera à déterminer ce qui se passe. Ce sont des forums anglais, j'ai utilisé un traducteur pour essayer de vous aider, j'espère que ça se retrouve bien.
    • I tried adding the Create (6.0.4) mod to my modpack which causes it to crash before it finishes loading. I tried removing the mod Cold Sweat because the error said it failed to load due to something in Create but when I removed it, it kept crashing; and I also tried downgrading Create, but nothing helped. I assume there's an incompatible mod that's causing Create to not load correctly, but I can't find it. launcher_log.txt: https://mclo.gs/kn5Qkk2 debug.log: https://mclo.gs/zIKoAaB crash report: https://mclo.gs/j86C10Y The part of debug.log that I think is the crash (after Create mod already loaded incorrectly): [02May2025 14:52:36.813] [Worker-ResourceReload-2/ERROR] [net.minecraftforge.fml.javafmlmod.FMLModContainer/]: Exception caught during firing event: com/simibubi/create/content/redstone/displayLink/DisplayBehaviour Index: 3 Listeners: 0: NORMAL 1: net.minecraftforge.eventbus.EventBus$$Lambda$1770/0x00000008009bc8a0@70223c71 2: ASM: class com.momosoftworks.coldsweat.core.event.PotionRecipes register(Lnet/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent;)V 3: ASM: class com.momosoftworks.coldsweat.compat.CompatManager$ModEvents setupModEvents(Lnet/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent;)V java.lang.NoClassDefFoundError: com/simibubi/create/content/redstone/displayLink/DisplayBehaviour at TRANSFORMER/cold_sweat@2.3.12/com.momosoftworks.coldsweat.compat.CompatManager$ModEvents.setupModEvents(CompatManager.java:501) at TRANSFORMER/cold_sweat@2.3.12/com.momosoftworks.coldsweat.compat.__ModEvents_setupModEvents_FMLCommonSetupEvent.invoke(.dynamic) at MC-BOOTSTRAP/net.minecraftforge.eventbus/net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) at MC-BOOTSTRAP/net.minecraftforge.eventbus/net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) at MC-BOOTSTRAP/net.minecraftforge.eventbus/net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) at LAYER PLUGIN/javafmllanguage@1.20.1-47.4.0/net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:121) at LAYER PLUGIN/fmlcore@1.20.1-47.4.0/net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$5(ModContainer.java:127) at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) Caused by: java.lang.ClassNotFoundException: com.simibubi.create.content.redstone.displayLink.DisplayBehaviour at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:141) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 14 more [02May2025 14:52:36.972] [Worker-ResourceReload-2/ERROR] [net.minecraftforge.fml.javafmlmod.FMLModContainer/LOADING]: Caught exception during event FMLCommonSetupEvent dispatch for modid cold_sweat java.lang.NoClassDefFoundError: com/simibubi/create/content/redstone/displayLink/DisplayBehaviour at com.momosoftworks.coldsweat.compat.CompatManager$ModEvents.setupModEvents(CompatManager.java:501) ~[ColdSweat-2.3.12.jar%23537!/:2.3.12] at com.momosoftworks.coldsweat.compat.__ModEvents_setupModEvents_FMLCommonSetupEvent.invoke(.dynamic) ~[ColdSweat-2.3.12.jar%23537!/:2.3.12] at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) ~[eventbus-6.0.5.jar%2387!/:?] at net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) ~[eventbus-6.0.5.jar%2387!/:?] at net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) ~[eventbus-6.0.5.jar%2387!/:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.acceptEvent(FMLModContainer.java:121) ~[javafmllanguage-1.20.1-47.4.0.jar%23784!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$5(ModContainer.java:127) ~[fmlcore-1.20.1-47.4.0.jar%23783!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] Caused by: java.lang.ClassNotFoundException: com.simibubi.create.content.redstone.displayLink.DisplayBehaviour at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:141) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[?:?] ... 14 more
    • You would probably be better served looking for support where NeoForge support is given, I believe their discord server.
    • If you copy and paste the java commandline into the terminal, what happens? as in trying to launch it without using the .bat file.
  • Topics

×
×
  • Create New...

Important Information

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