Posted May 6, 20241 yr I'm trying to create a very simple tile entity that has a INT NBT data for testing. Saving and loading this TE works fine on single player and NBT is properly showing up. However, whenever I try to do the same in a dedicated server, the NBT data always resets whenever the chunks are unloaded(moving far away or leaving the game while server is running) I have getUpdatePacket, onDataPacket, handleUpdateTag, getUpdateTag overridden, and markDirty, notifyBlockUpdate is called. I've searched everywhere but couldn't find a solution please help me. Tile Entity Spoiler package com.boonk.ocpp.blocks; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TileEntityOneClickPostProcessing extends TileEntity { public int number = 1; @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("Number", this.number); return compound; } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.number = compound.getInteger("Number"); } public int getNumber() { return number; } public void incrementNumber() { this.number++; } @Override public NBTTagCompound getUpdateTag() { return writeToNBT(super.getUpdateTag()); } @Override public void handleUpdateTag(NBTTagCompound nbt) { super.handleUpdateTag(nbt); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { super.onDataPacket(net, pkt); this.handleUpdateTag(pkt.getNbtCompound()); } @Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbt = new NBTTagCompound(); this.writeToNBT(nbt); return new SPacketUpdateTileEntity(getPos(), 1, nbt); } } Block Spoiler package com.boonk.ocpp.blocks; import com.boonk.ocpp.Main; import com.boonk.ocpp.init.ModItems; import com.boonk.ocpp.util.Reference; import com.boonk.ocpp.blocks.TileEntityOneClickPostProcessing; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class OneClickPostProcessing extends BlockBase implements ITileEntityProvider { public OneClickPostProcessing(String name, Material material) { super(name, material); setUnlocalizedName(name); setCreativeTab(CreativeTabs.BUILDING_BLOCKS); setSoundType(SoundType.METAL); setHardness(5.0F); setResistance(15.0F); setHarvestLevel("pickaxe", 2); setLightLevel(1.0F); } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { TileEntity tileentity = worldIn.getTileEntity(pos); if(tileentity instanceof TileEntityOneClickPostProcessing) { TileEntityOneClickPostProcessing ocpp = (TileEntityOneClickPostProcessing) tileentity; Minecraft.getMinecraft().player.sendChatMessage(Integer.toString(ocpp.getNumber())); ocpp.incrementNumber(); ocpp.getWorld().notifyBlockUpdate(pos, ocpp.getWorld().getBlockState(pos), ocpp.getWorld().getBlockState(pos),2); ocpp.markDirty(); } return true; } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityOneClickPostProcessing(); } @Override public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.MODEL; } @Override public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { TileEntityOneClickPostProcessing tileentity = (TileEntityOneClickPostProcessing)worldIn.getTileEntity(pos); super.breakBlock(worldIn, pos, state); } @Override public boolean hasTileEntity(IBlockState state) { return true; } }
May 6, 20241 yr Brooo you are in 1.12 why do you made mods on 1.12 in 2024 anyway i have similar issue in 1.20.4 in mi case to fix i have to make the BlockEntity to manually call on blockEntityChanged() to inform the world the block entity has change and need to be saved // ########## ########## ########## ########## @Override protected void saveAdditional( CompoundTag nbt ){ //System.out.println("\n##saveAdditional(), " + this.getBlockPos() ); nbt.put("inventory", itemhandler.serializeNBT() ); nbt.putInt("progress", this.progress ); super.saveAdditional( nbt ); //System.out.println(NbtUtils.prettyPrint(nbt)); this.getLevel().blockEntityChanged(this.getBlockPos()); //<---------- } but this is in 1.20.4 may theres something equivalent in 1.12
May 6, 20241 yr Author Haha unfortunately im stuck with 1.12 modding for personal reasons. It feels painful I think the markDirty and notifyBlockUpdate are equivalent to blockEntityChanged(), which I've already overridden. Right now, my guess is that I have to set up a network system with packets and handlers which I have little knowledge of. Anyways, thanks for the answer!
May 6, 20241 yr Author Yep, Packet was the answer. Now my tile entity saves and loads properly in a dedicated server
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.