Jump to content

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


Recommended Posts

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

 

 

Link to comment
Share on other sites

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 

 

 

  • Like 1
Link to comment
Share on other sites

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!

 

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.



×
×
  • Create New...

Important Information

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