Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[1.12.2] I'm out of ideas and I desperately need help. Saving/loading tile entity NBT on a dedicated server not working

Featured Replies

Posted

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;
    }
}

 

 

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 

 

 

  • 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!

 

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

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

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.