Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.5] TileEntity don't save data (inventory)


Recommended Posts

I have created a tileentity which should add items to an ItemStackHandler when you right-click.
if after adding the item I check whether the item is present in the ItemStackHandler, It returns false.
this is my TE

I suspect it is due to the synchronization between client and server,
but I'm not sure, because it could be something else

does anyone have any idea what I have to change?

Link to post
Share on other sites
Posted (edited)
2 hours ago, diesieben07 said:

You have to only change the inventory server side.

okay i'm now checking whether the world is a ServerWorld
but this has not fixed the error, if I print the inventory on the console after interacting, every slot is empty
this is the updated class

Edited by Luis_ST
Link to post
Share on other sites
Posted (edited)
19 minutes ago, diesieben07 said:

You are setting simulate to true. So, the item handler complies and simulates the insertion. What did you expect?

I changed it, but the inventory remains empty

Edited by Luis_ST
Link to post
Share on other sites
Posted (edited)

Update: I'm trying to adapt my TileEntity, I used the CampfireTileEntity as an example
because it actually works the same way

Edited by Luis_ST
Link to post
Share on other sites
  • Your getNextSlot function is pointless. Simply keep calling insertItem until it manages to insert something and keep increasing the slot number.
  • You must not modify the ItemStack after you have given it to the IItemHandler, otherwise you will modify it inside the item handler. The IItemHandler takes care of any stack math and stack merging, it will simply give you the result back (whatever could not be inserted). Simply give that back to the player.
Link to post
Share on other sites
43 minutes ago, diesieben07 said:
  • Your getNextSlot function is pointless. Simply keep calling insertItem until it manages to insert something and keep increasing the slot number.
  • You must not modify the ItemStack after you have given it to the IItemHandler, otherwise you will modify it inside the item handler. The IItemHandler takes care of any stack math and stack merging, it will simply give you the result back (whatever could not be inserted). Simply give that back to the player.

i try that thanks

Link to post
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.

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



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • For attached capabilities to be saved your ICapabilityProvider needs to implement INBTSerializable (or you can use the combination interface ICapabilitySerializable) and it needs to save any capabilities it provides to NBT.
    • It works fine in-game, but when I re-enter the world, all the fields are set to their default values. Its strange because Ive implemented writeNBT and readNBT methods. Also client and server are synchronized, so its not the problem. Capability code:   public class SoulCap { public int parryTimer = 0; public int CATimer = 0; public boolean justParried = false; public boolean rightClicked = false; public boolean leftClicked = false; public double mana = 0; public double maxMana = 10; public HashMap<String, Integer> usedKeyItems = new HashMap<>(); public boolean trySpendMana(double a) { if (mana >= a){ mana -= a; return true; } return false; } public void addMana(double a){ mana += a; if (mana > maxMana) mana = maxMana; } public CompoundNBT getNbt(){ CompoundNBT tag = new CompoundNBT(); tag.putInt("parryTimer", parryTimer); tag.putInt("CATimer", CATimer); tag.putBoolean("justParried", justParried); tag.putBoolean("rightClicked", rightClicked); tag.putBoolean("leftClicked", leftClicked); tag.putDouble("mana", mana); tag.putDouble("maxMana", maxMana); CompoundNBT keyItems = new CompoundNBT(); for (String s : usedKeyItems.keySet()){ keyItems.putInt(s, usedKeyItems.get(s)); } tag.put("usedKeyItems", keyItems); return tag; } public SoulCap setNbt(CompoundNBT nbt){ parryTimer = nbt.getInt("parryTimer"); CATimer= nbt.getInt("CATimer"); justParried = nbt.getBoolean("justParried"); rightClicked = nbt.getBoolean("rightClicked"); leftClicked = nbt.getBoolean("leftClicked"); mana = nbt.getDouble("mana"); maxMana = nbt.getDouble("maxMana"); CompoundNBT keyItems = nbt.getCompound("usedKeyItems"); for (String s : keyItems.keySet()){ usedKeyItems.put(s, keyItems.getInt(s)); } return this; } public static class SoulProvider implements ICapabilityProvider { @CapabilityInject(SoulCap.class) public static Capability<SoulCap> SOUL_CAP; private final LazyOptional<SoulCap> instance = LazyOptional.of(() -> new SoulCap()); @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap) { return cap == SOUL_CAP ? instance.cast() : LazyOptional.empty(); } } public static class SoulStorage implements Capability.IStorage<SoulCap> { @Override public INBT writeNBT(Capability<SoulCap> capability, SoulCap soulCap, Direction side) { return soulCap.getNbt(); } @Override public void readNBT(Capability<SoulCap> capability, SoulCap soulCap, Direction side, INBT nbt) { soulCap.setNbt((CompoundNBT)nbt); } } } Registering:   @Mod("soul") @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public class Soul { // //various stuff // @SubscribeEvent public static void setup(final FMLCommonSetupEvent event) { CapabilityManager.INSTANCE.register(SoulCap.class, new SoulCap.SoulStorage(), () -> new SoulCap()); } } Attaching: @Mod.EventBusSubscriber public class CapabilityEvents { @SubscribeEvent static void playerCapability(AttachCapabilitiesEvent<Entity> event){ if (event.getObject() instanceof PlayerEntity) { event.addCapability(new ResourceLocation(Soul.id, "soul"), new SoulCap.SoulProvider()); } } }  
    • https://minecraft.fandom.com/wiki/Tutorials/Creating_a_resource_pack#Animation_Properties
    • you will need: a custom block (your crafting table block) a custom WorkbenchContainer, you need to overwrite the stillValid method and if you want you can change some vanilla logic  
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.