Jump to content

TileEntity readFromNBT called more often than writeToNBT.


Raycoms
 Share

Recommended Posts

We got a pretty strange problem.

The readFromNBT method is called twice on start for every of our special tileEntities and is also called on blockUpdate.

on the other side the writeToNBT isn't called again, which causes consistency problems since some of our variables haven't been set again.

 

package com.minecolonies.tileentities;

import com.minecolonies.colony.Colony;
import com.minecolonies.colony.ColonyManager;
import com.minecolonies.colony.ColonyView;
import com.minecolonies.colony.buildings.AbstractBuilding;
import com.minecolonies.colony.materials.MaterialSystem;
import com.minecolonies.colony.permissions.Permissions;
import com.sun.istack.internal.NotNull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.math.BlockPos;

/**
* Class which handles the tileEntity of our colonyBuildings.
*/
public class TileEntityColonyBuilding extends TileEntityChest
{
    private final static String TAG_COLONY = "colony";
    private              int    colonyId   = 0;
    private Colony           colony;
    private AbstractBuilding building;

    /**
     * Empty standard constructor.
     */
    public TileEntityColonyBuilding()
    {
        /**
         * Intentionally left empty.
         */
    }

    @Override
    public SPacketUpdateTileEntity getUpdatePacket()
    {
        NBTTagCompound compound = new NBTTagCompound();
        compound.setInteger(TAG_COLONY, colonyId);
        return new SPacketUpdateTileEntity(this.getPosition(), 0, compound);
    }

    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet)
    {
        NBTTagCompound compound = packet.getNbtCompound();
        colonyId = compound.getInteger(TAG_COLONY);
    }

    @Override
    public void update()
    {
        super.update();

        if (!worldObj.isRemote)
        {
            if (colonyId == 0)
            {
                throw new IllegalStateException(String.format("TileEntityColonyBuilding at %s:[%d,%d,%d] has no colonyId",
                  worldObj.getWorldInfo().getWorldName(),
                  pos.getX(),
                  pos.getY(),
                  pos.getZ()));
            }
        }
    }

    @Override
    public void onChunkUnload()
    {
        if (building != null)
        {
            building.setTileEntity(null);
        }
    }

    /**
     * Returns the position of the tile entity
     *
     * @return Block Coordinates of the tile entity
     */
    public BlockPos getPosition()
    {
        return pos;
    }

    /**
     * Synchronises colony references from the tile entity
     */
    private void updateColonyReferences()
    {
        if (colony == null)
        {
            if (colonyId != 0)
            {
                colony = ColonyManager.getColony(colonyId);
            }
            else
            {
                throw new IllegalStateException(String.format("TileEntityColonyBuilding at %s:[%d,%d,%d] has no colonyId",
                  worldObj.getWorldInfo().getWorldName(), pos.getX(), pos.getY(), pos.getZ()));
            }

//            else if (worldObj != null)
//            {
//                throw new IllegalStateException(String.format("TileEntityColonyBuilding at %s:[%d,%d,%d] has no colonyId",
//                        worldObj.getWorldInfo().getWorldName(), xCoord, yCoord, zCoord));
//
//                colony = ColonyManager.getColony(worldObj, xCoord, yCoord, zCoord);
//
//                if (colony != null)
//                {
//                    colonyId = colony.getID();
//                }
//            }
        }

        if (building == null && colony != null)
        {
            building = colony.getBuilding(getPosition());
            if (building != null)
            {
                building.setTileEntity(this);
            }
        }
    }

    /**
     * Returns the colony ID
     *
     * @return ID of the colony
     */
    public int getColonyId()
    {
        return colonyId;
    }

    /**
     * Returns the colony of the tile entity
     *
     * @return Colony of the tile entity
     */
    public Colony getColony()
    {
        if (colony == null)
        {
            updateColonyReferences();
        }
        return colony;
    }

    /**
     * Sets the colony of the tile entity
     *
     * @param c Colony to set in references
     */
    public void setColony(Colony c)
    {
        colony = c;
        colonyId = c.getID();
        markDirty();
    }

    //todo something goes wrong on colony loading
    @Override
    public void readFromNBT(NBTTagCompound compound)
    {
        super.readFromNBT(compound);
        if (!compound.hasKey(TAG_COLONY))
        {
            throw new IllegalStateException(String.format("TileEntityColonyBuilding at %s:[%d,%d,%d] missing COLONY tag.",
              worldObj.getWorldInfo().getWorldName(), pos.getX(), pos.getY(), pos.getZ()));
        }
        colonyId = compound.getInteger(TAG_COLONY);
        updateColonyReferences();
    }

    /**
     * Returns the building associated with the tile entity
     *
     * @return {@link AbstractBuilding} associated with the tile entity
     */
    public AbstractBuilding getBuilding()
    {
        if (building == null)
        {
            updateColonyReferences();
        }
        return building;
    }

    /**
     * Sets the building associated with the tile entity
     *
     * @param b {@link AbstractBuilding} to associate with the tile entity
     */
    public void setBuilding(AbstractBuilding b)
    {
        building = b;
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound)
    {
        super.writeToNBT(compound);
        if (colonyId == 0)
        {
            throw new IllegalStateException(String.format("TileEntityColonyBuilding at %s:[%d,%d,%d] has no colonyId; %s colony reference.",
              worldObj.getWorldInfo().getWorldName(), pos.getX(), pos.getY(), pos.getZ(),
              colony == null ? "NO" : "valid"));
        }
        compound.setInteger(TAG_COLONY, colonyId);
        return compound;
    }

    /**
     * Returns the view of the building associated with the tile entity
     *
     * @return {@link AbstractBuilding.View} the tile entity is associated with
     */
    public AbstractBuilding.View getBuildingView()
    {
        ColonyView c = ColonyManager.getColonyView(colonyId);
        return c != null ? c.getBuilding(getPosition()) : null;
    }

    @Override
    public boolean isUseableByPlayer(@NotNull EntityPlayer player)
    {
        return super.isUseableByPlayer(player) && this.hasAccessPermission(player);
    }

    /**
     * Checks if the player has permission to access the hut
     *
     * @param player Player to check permission of
     * @return True when player has access, or building doesn't exist, otherwise false.
     */
    public boolean hasAccessPermission(EntityPlayer player)//TODO This is called every tick the GUI is open. Is that bad?
    {
        return building == null || building.getColony().getPermissions().hasPermission(player, Permissions.Action.ACCESS_HUTS);
    }

    //-----------------------------Material Handling--------------------------------

    /**
     * Makes sure ItemStacks inside of the inventory aren't affected by changes to the returned stack.
     */
    @Override
    public ItemStack getStackInSlot(int index)
    {
        ItemStack stack = super.getStackInSlot(index);
        if (stack == null)
        {
            return null;
        }
        return stack.copy();
    }

    @Override
    public ItemStack decrStackSize(int index, int quantity)
    {
        ItemStack removed = super.decrStackSize(index, quantity);

        removeStackFromMaterialStore(removed);

        return removed;
    }

    @Override
    public ItemStack removeStackFromSlot(int index)
    {
        ItemStack removed = super.removeStackFromSlot(index);

        removeStackFromMaterialStore(removed);

        return removed;
    }

    @Override
    public void setInventorySlotContents(int index, ItemStack stack)
    {
        ItemStack previous = getStackInSlot(index);
        removeStackFromMaterialStore(previous);

        super.setInventorySlotContents(index, stack);

        addStackToMaterialStore(stack);
    }

    private void addStackToMaterialStore(ItemStack stack)
    {
        if (stack == null)
        {
            return;
        }

        if (MaterialSystem.isEnabled)
        {
            building.getMaterialStore().addMaterial(stack.getItem(), stack.stackSize);
        }
    }

    private void removeStackFromMaterialStore(ItemStack stack)
    {
        if (stack == null)
        {
            return;
        }

        if (MaterialSystem.isEnabled)
        {
            building.getMaterialStore().removeMaterial(stack.getItem(), stack.stackSize);
        }
    }
}

Link to comment
Share on other sites

I don't see an override of shouldRefresh in your TE class. Will the default behavior (replacing your whole TE whenever the state changes) do what you want?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

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

 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Can you send a crash report? (<game_directory>/crash-reports) ¿Puedes enviar un informe de fallas? (<directorio_del_juego>/crash-reports)
    • Never mind, I think finally found the list of Forge tags in the extended libraries of my workspace. I should be all set with that now.
    • This mod does it, so you could try looking at their code to get an idea of how they do it. Or, just use their mod. https://www.curseforge.com/minecraft/mc-mods/shutup-experimental-settings
    • And here is the cmd panel of the server         2023-01-29 20:12:16,231 main WARN Advanced terminal features are not available in this environment [20:12:16] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, forgeserver, --fml.forgeVersion, 44.1.8, --fml.mcVersion, 1.19.3, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20221207.122022, nogui] [20:12:16] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 10.0.8+10.0.8+main.0ef7e830 starting: java version 19.0.2 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [20:12:16] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Muharrem/Desktop/FTB%20Servers/%7Bcurrent%20directory%202%5D/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2364!/ Service=ModLauncher Env=SERVER [20:12:16] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Muharrem\Desktop\FTB Servers\{current directory 2]\libraries\net\minecraftforge\fmlcore\1.19.3-44.1.8\fmlcore-1.19.3-44.1.8.jar is missing mods.toml file [20:12:16] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Muharrem\Desktop\FTB Servers\{current directory 2]\libraries\net\minecraftforge\javafmllanguage\1.19.3-44.1.8\javafmllanguage-1.19.3-44.1.8.jar is missing mods.toml file [20:12:16] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Muharrem\Desktop\FTB Servers\{current directory 2]\libraries\net\minecraftforge\lowcodelanguage\1.19.3-44.1.8\lowcodelanguage-1.19.3-44.1.8.jar is missing mods.toml file [20:12:16] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Muharrem\Desktop\FTB Servers\{current directory 2]\libraries\net\minecraftforge\mclanguage\1.19.3-44.1.8\mclanguage-1.19.3-44.1.8.jar is missing mods.toml file [20:12:17] [main/INFO] [ne.mi.fm.lo.mo.JarInJarDependencyLocator/]: No dependencies to load found. Skipping! [20:12:18] [main/INFO] [cp.mo.mo.LaunchServiceHandler/MODLAUNCHER]: Launching target 'forgeserver' with arguments [nogui] [20:12:23] [main/INFO] [minecraft/DataFixers]: Building unoptimized datafixer [20:12:25] [modloading-worker-0/INFO] [ne.mi.co.ForgeMod/FORGEMOD]: Forge mod loading, version 44.1.8, for MC 1.19.3 with MCP 20221207.122022 [20:12:25] [modloading-worker-0/INFO] [ne.mi.co.MinecraftForge/FORGE]: MinecraftForge v44.1.8 Initialized [20:12:25] [Forge Version Check/INFO] [ne.mi.fm.VersionChecker/]: [forge] Starting version check at https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json [20:12:26] [Forge Version Check/INFO] [ne.mi.fm.VersionChecker/]: [forge] Found status: AHEAD Current: 44.1.8 Target: null [20:12:26] [main/INFO] [mojang/YggdrasilAuthenticationService]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD' [20:12:27] [main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/C:/Users/Muharrem/Desktop/FTB%20Servers/%7Bcurrent%20directory%202%5D/libraries/net/minecraft/server/1.19.3-20221207.122022/server-1.19.3-20221207.122022-srg.jar%23101!/assets/.mcassetsroot' uses unexpected schema [20:12:27] [main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/C:/Users/Muharrem/Desktop/FTB%20Servers/%7Bcurrent%20directory%202%5D/libraries/net/minecraft/server/1.19.3-20221207.122022/server-1.19.3-20221207.122022-srg.jar%23101!/data/.mcassetsroot' uses unexpected schema [20:12:29] [main/INFO] [minecraft/RecipeManager]: Loaded 7 recipes [20:12:29] [main/INFO] [minecraft/AdvancementList]: Loaded 1179 advancements [20:12:30] [Server thread/INFO] [minecraft/DedicatedServer]: Starting minecraft server version 1.19.3 [20:12:30] [Server thread/INFO] [minecraft/DedicatedServer]: Loading properties [20:12:30] [Server thread/INFO] [minecraft/DedicatedServer]: Default game type: SURVIVAL [20:12:30] [Server thread/INFO] [minecraft/MinecraftServer]: Generating keypair [20:12:30] [Server thread/INFO] [minecraft/DedicatedServer]: Starting Minecraft server on 78.174.226.175:25565 [20:12:30] [Server thread/INFO] [minecraft/ServerConnectionListener]: Using default channel type [20:12:30] [Server thread/WARN] [minecraft/DedicatedServer]: **** FAILED TO BIND TO PORT! [20:12:30] [Server thread/WARN] [minecraft/DedicatedServer]: The exception was: java.net.BindException: Cannot assign requested address: bind [20:12:30] [Server thread/WARN] [minecraft/DedicatedServer]: Perhaps a server is already running on that port? [20:12:30] [Server thread/ERROR] [minecraft/MinecraftServer]: Encountered an unexpected exception java.lang.IllegalStateException: Failed to initialize server         at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:637) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at java.lang.Thread.run(Thread.java:1589) ~[?:?] {} [20:12:30] [Server thread/FATAL] [ne.mi.co.ForgeMod/]: Preparing crash report with UUID 9ad7a420-98e0-4be3-be96-3783b966a471 [20:12:30] [Server thread/ERROR] [minecraft/MinecraftServer]: This crash report has been saved to: C:\Users\Muharrem\Desktop\FTB Servers\{current directory 2]\.\crash-reports\crash-2023-01-29_20.12.30-server.txt [20:12:30] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping server [20:12:30] [Server thread/INFO] [minecraft/MinecraftServer]: Saving worlds [20:12:30] [Server thread/ERROR] [minecraft/MinecraftServer]: Exception stopping the server java.lang.NullPointerException: Cannot invoke "net.minecraft.server.level.ServerLevel.m_6857_()" because "serverlevel2" is null         at net.minecraft.server.MinecraftServer.m_129885_(MinecraftServer.java:513) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at net.minecraft.server.MinecraftServer.m_7041_(MinecraftServer.java:586) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at net.minecraft.server.dedicated.DedicatedServer.m_7041_(DedicatedServer.java:498) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:692) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}         at java.lang.Thread.run(Thread.java:1589) ~[?:?] {} Press any key to continue . . .
    • Hello my server crashes. Here is the crash log   ---- Minecraft Crash Report ---- // Hi. I'm Minecraft, and I'm a crashaholic. Time: 2023-01-29 20:06:27 Description: Exception in server tick loop java.lang.IllegalStateException: Failed to initialize server     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:637) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}     at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.19.3-20221207.122022-srg.jar%23101!/:?] {re:classloading,pl:accesstransformer:B}     at java.lang.Thread.run(Thread.java:1589) ~[?:?] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.19.3     Minecraft Version ID: 1.19.3     Operating System: Windows 10 (amd64) version 10.0     Java Version: 19.0.2, Oracle Corporation     Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation     Memory: 787282120 bytes (750 MiB) / 1059061760 bytes (1010 MiB) up to 4294967296 bytes (4096 MiB)     CPUs: 8     Processor Vendor: GenuineIntel     Processor Name: Intel(R) Core(TM) i5-10300H CPU @ 2.50GHz     Identifier: Intel64 Family 6 Model 165 Stepping 2     Microarchitecture: unknown     Frequency (GHz): 2.50     Number of physical packages: 1     Number of physical CPUs: 4     Number of logical CPUs: 8     Graphics card #0 name: NVIDIA GeForce GTX 1650 Ti     Graphics card #0 vendor: NVIDIA (0x10de)     Graphics card #0 VRAM (MB): 4095.00     Graphics card #0 deviceId: 0x1f95     Graphics card #0 versionInfo: DriverVersion=31.0.15.1659     Graphics card #1 name: Intel(R) UHD Graphics     Graphics card #1 vendor: Intel Corporation (0x8086)     Graphics card #1 VRAM (MB): 1024.00     Graphics card #1 deviceId: 0x9bc4     Graphics card #1 versionInfo: DriverVersion=26.20.100.7642     Memory slot #0 capacity (MB): 16384.00     Memory slot #0 clockSpeed (GHz): 3.20     Memory slot #0 type: DDR4     Virtual memory max (MB): 25467.80     Virtual memory used (MB): 16976.89     Swap memory total (MB): 9216.00     Swap memory used (MB): 282.24     JVM Flags: 1 total; -Xmx4G     Server Running: true     Data Packs: vanilla, mod:forge     Enabled Feature Flags: minecraft:vanilla     World Generation: Experimental     Is Modded: Definitely; Server brand changed to 'forge'     Type: Dedicated Server (map_server.txt)     ModLauncher: 10.0.8+10.0.8+main.0ef7e830     ModLauncher launch target: forgeserver     ModLauncher naming: srg     ModLauncher services:          mixin-0.8.5.jar mixin PLUGINSERVICE          eventbus-6.0.3.jar eventbus PLUGINSERVICE          fmlloader-1.19.3-44.1.8.jar slf4jfixer PLUGINSERVICE          fmlloader-1.19.3-44.1.8.jar object_holder_definalize PLUGINSERVICE          fmlloader-1.19.3-44.1.8.jar runtime_enum_extender PLUGINSERVICE          fmlloader-1.19.3-44.1.8.jar capability_token_subclass PLUGINSERVICE          accesstransformers-8.0.4.jar accesstransformer PLUGINSERVICE          fmlloader-1.19.3-44.1.8.jar runtimedistcleaner PLUGINSERVICE          modlauncher-10.0.8.jar mixin TRANSFORMATIONSERVICE          modlauncher-10.0.8.jar fml TRANSFORMATIONSERVICE      FML Language Providers:          minecraft@1.0         lowcodefml@null         javafml@null     Mod List:          server-1.19.3-20221207.122022-srg.jar             |Minecraft                     |minecraft                     |1.19.3              |DONE      |Manifest: NOSIGNATURE         forge-1.19.3-44.1.8-universal.jar                 |Forge                         |forge                         |44.1.8              |DONE      |Manifest: 84:ce:76:e8:45:35:e4:0e:63:86:df:47:59:80:0f:67:6c:c1:5f:6e:5f:4d:b3:54:47:1a:9f:7f:ed:5e:f2:90     Crash Report UUID: 0d2db5a7-3a08-4956-9f06-c2c0e49cb878     FML: 44.1     Forge: net.minecraftforge:44.1.8
  • Topics

×
×
  • Create New...

Important Information

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