Jump to content

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


longbowrocks

Recommended Posts

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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")

Link to comment
Share on other sites

1 hour ago, 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")

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.

Link to comment
Share on other sites

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
Link to comment
Share on other sites

3 hours ago, 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.

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.

Link to comment
Share on other sites

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



×
×
  • Create New...

Important Information

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