Jump to content

[Solved] Can I keep Capability data when breaking and replacing a vanilla Block?


Recommended Posts

Posted (edited)

I've written a mod that adds a Capability with persistent state to chest type TileEntities (TileEntityChest, TileEntityShulkerBox). I would like to pick up a chest and put it back down without losing my Capability state, but from what I've read in both code and forums, that doesn't seem possible without editing breakBlock() for the affected classes, or replacing the classes with my own (either way, that sounds like a core mod).

 

If I want to do this, does it have to be a core mod, or have I missed something?

Edited by longbowrocks
solved
Posted

I did something like this with a container that keeps its contents when broken, but my memory is of it is a little fuzzy. I think you can write NBT data to the dropped ItemStack, but you have to override Block#removedByPlayer to return true if willHarvest is true, in order to prevent the tile entity from being deleted too early in the process. Then override harvestBlock, I think, to write the NBT data into an ItemStack and spawn it as an EntityItem.

Posted

That sounds about right, but in this case that would be a core mod (I think so anyway. There appear to be multiple definitions for core mod spread across the net, so I can only assume "core mod" means "anything that modifies the vanilla Minecraft code instead of extending/adding to it")

Posted
  On 3/3/2018 at 6:02 AM, longbowrocks said:

That sounds about right, but in this case that would be a core mod (I think so anyway. There appear to be multiple definitions for core mod spread across the net, so I can only assume "core mod" means "anything that modifies the vanilla Minecraft code instead of extending/adding to it")

Expand  

A core mod is one that uses ASM to make changes to code that you do not control through the class loading process.

You will find very little help writing such code, as it is very easy to do things Badly and cause more problems than you solve.

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 (edited)

I somehow missed that you were adding this capability to vanilla blocks. You might consider creating a custom item that drops instead of the vanilla item when a vanilla block with your Capability is broken. You could write the NBT data to the custom item during the HarvestDropsEvent and remove the vanilla drop. If you wanted, you could even give the custom item the same texture and unlocalized name to make it appear like the vanilla version. Then have the custom item place the vanilla block when right clicked.

Edited by Daeruin
Posted
  On 3/3/2018 at 10:03 AM, diesieben07 said:

This might be possible using the following hack:

  • In BlockEvent.BreakEvent you need to grab the data from the tile entity (if a relevant tile entity is being broken) and store it in a ThreadLocal<YOUR_DATA>. This makes sure to isolate server and client thread in single player.
  • Then in BlockEvent.HarvestDropsEvent you can access the thread local and have access to the data (which you would otherwise not have since the tile entity is gone at this point). You can now store the data in the created drop stack.
Expand  

Damn. Between brainstorming and reading vanilla code , I forgot that I hadn't finished looking through the events provided by forge!

 

Thank you diesieben07, I'll have to try that when I get home today. I managed to confirm that I can write the NBT to an ItemStack before I left, and I should be able to read the NBT with BlockEvent.PlaceEvent.

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

    • Hi - I am writing a mod to add a shotgun item to Minecraft Java Edition. I am using forge 54.1.2 and Minecraft 1.21.4. I am using gradlew and my mod compiles fine but when I launch Minecraft with the mod loaded, it crashes. I do have experience with Java but this is my very first time writing a mod. The Exception thrown is below: [11Mar2025 12:15:16.642] [Render thread/ERROR] [net.minecraftforge.fml.javafmlmod.FMLModContainer/]: Exception caught during firing event: Item id not set     Index: 1     Listeners:         0: NORMAL         1: ASM: net.minecraftforge.registries.DeferredRegister$EventDispatcher@4f9c6f1d handleEvent(Lnet/minecraftforge/registries/RegisterEvent;)V java.lang.NullPointerException: Item id not set     at java.base/java.util.Objects.requireNonNull(Objects.java:259)     at TRANSFORMER/minecraft@1.21.4/net.minecraft.world.item.Item$Properties.effectiveDescriptionId(Item.java:465)     at TRANSFORMER/minecraft@1.21.4/net.minecraft.world.item.Item.<init>(Item.java:111)     at TRANSFORMER/shotgunmod@1.0.0/com.example.shotgunmod.ShotgunItem.<init>(ShotgunItem.java:19)     at TRANSFORMER/shotgunmod@1.0.0/com.example.shotgunmod.ModItems.lambda$static$0(ModItems.java:13)     at TRANSFORMER/net.minecraftforge.forge@54.1.2/net.minecraftforge.registries.DeferredRegister$EventDispatcher.lambda$handleEvent$0(DeferredRegister.java:381)     ...     My class, ModItems.java has the following function defined on line 13: 13: public static final RegistryObject<Item> SHOTGUN = ITEMS.register("shotgun", () -> new ShotgunItem(new Item.Properties().durability(100))); Then, my ShotgunItem class has the following constructor which calls the super class: public class ShotgunItem extends Item {     public ShotgunItem(Properties properties) {         super(properties); // line 19     } So the crash is coming from super(). Can anyone guide me on the proper way to set the Item ID? Is that the issue here? Thank you for your help. Blake  
    • I will give it a try and report if anything changes, thanks. 
    • Did you test it with the mentioned mods in the log?   So without the xaero mods or vivecraft, smoothboot, chatplus, embeddium/oculus, shouldersurfing and immediatelyfast    
    • I am guessing that is the case - but which one
  • Topics

×
×
  • Create New...

Important Information

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