Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • NBT What am I doing wrong?
Currently Supported: 1.16.X (Latest) and 1.15.X (LTS)
Sign in to follow this  
Followers 0
American2050

NBT What am I doing wrong?

By American2050, January 9, 2018 in Modder Support

  • Reply to this topic
  • Start new topic

Recommended Posts

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018

So I have this on my readFromNBT in a TileEntity

 

Problem is... Why this if is false?

 

    @Override
    public void readFromNBT(NBTTagCompound compound) {
        
        super.readFromNBT(compound);

        LogHelper.info("CALLED HERE!!! " + compound);

        if (compound.hasKey(PANELS)) {

            LogHelper.info("CALLED INSIDE HAS KEY PANELS");

            NBTTagCompound panels = compound.getCompoundTag(PANELS);
            this.stackPanelUp = new ItemStack(panels.getCompoundTag("up"));

        } else {
            LogHelper.info("NOT TRUE PANELS");
        }

    }

 

Console shows:

 

[21:46:03] [main/INFO] [LogHelper]: CALLED HERE!!! {ForgeData:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}},x:50,y:83,z:272,id:"factoryblock:te_factory"}
[21:46:03] [main/INFO] [LogHelper]: NOT TRUE PANELS

 

 

PANEL is:

 

public static final String PANELS = "factory.panels";

 

  • Quote

Share this post


Link to post
Share on other sites

TheAwesomeGem    2

TheAwesomeGem

TheAwesomeGem    2

  • Stone Miner
  • TheAwesomeGem
  • Members
  • 2
  • 82 posts
Posted January 9, 2018

Show  your  writeToNBT method.

  • Quote

New Channel: https://www.youtube.com/theawesomegemily'>https://www.youtube.com/theawesomegemily

My Group: https://www.youtube.com/officialpixelgem

Old Channel: https://www.youtube.com/theawesomegem

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018 (edited)
19 minutes ago, TheAwesomeGem said:

Show  your  writeToNBT method.

Here:
 

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        // this is called by minecraft to give you the posibility to update your NBT before being saved to the world
        super.writeToNBT(compound);

        compound.setTag("up", this.stackPanelUp.writeToNBT(new NBTTagCompound()));
        compound.setTag("down", this.stackPanelDown.writeToNBT(new NBTTagCompound()));
        compound.setTag("east", this.stackPanelEast.writeToNBT(new NBTTagCompound()));
        compound.setTag("west", this.stackPanelWest.writeToNBT(new NBTTagCompound()));
        compound.setTag("north", this.stackPanelNorth.writeToNBT(new NBTTagCompound()));
        compound.setTag("south", this.stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return compound;
    }

 

The whole class, just in case:

 

Spoiler

package org.bitbucket.factoryblock.tileentity;

import org.bitbucket.factoryblock.LogHelper;
import org.bitbucket.factoryblock.enums.EnumPanels;
import org.bitbucket.factoryblock.interfaces.IPanel;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;

public class TileEntityFactory extends TileEntity implements ITickable, net.minecraft.client.renderer.texture.ITickable {

    public static final String PANELS = "factory.panels";

    private NonNullList<EnumPanels> factoryPanels = NonNullList.withSize(6, EnumPanels.EMPTY);

    private ItemStack stackPanelUp = ItemStack.EMPTY;
    private ItemStack stackPanelDown = ItemStack.EMPTY;
    private ItemStack stackPanelEast = ItemStack.EMPTY;
    private ItemStack stackPanelWest = ItemStack.EMPTY;
    private ItemStack stackPanelNorth = ItemStack.EMPTY;
    private ItemStack stackPanelSouth = ItemStack.EMPTY;

    public TileEntityFactory() {
        this.getTileData().setTag(PANELS, createNBTData());
    }

    @Override
    public void update() {
        // TODO Auto-generated method stub

    }

    // TODO Do we need this?
    @Override
    public void tick() {
        // TODO Auto-generated method stub

    }

    public void setPanelAt(EnumFacing facing, ItemStack stack) {
        switch (facing) {
            case UP:
                this.stackPanelUp = stack;
                break;
            case DOWN:
                this.stackPanelUp = stack;
                break;
            case EAST:
                this.stackPanelUp = stack;
                break;
            case WEST:
                this.stackPanelUp = stack;
                break;
            case NORTH:
                this.stackPanelUp = stack;
                break;
            case SOUTH:
                this.stackPanelUp = stack;
                break;
        }

        // This Force NBT Update?
        this.markDirty();
    }

    public EnumPanels getPanelTypeAt(EnumFacing facing) {

        switch (facing) {
            case UP:
                if (this.stackPanelUp.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelUp.getItem();
                    return thePanel.getPanelType();
                }
            case DOWN:
                if (this.stackPanelDown.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelDown.getItem();
                    return thePanel.getPanelType();
                }
            case EAST:
                if (this.stackPanelEast.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelEast.getItem();
                    return thePanel.getPanelType();
                }
            case WEST:
                if (this.stackPanelWest.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelWest.getItem();
                    return thePanel.getPanelType();
                }
            case NORTH:
                if (this.stackPanelNorth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelNorth.getItem();
                    return thePanel.getPanelType();
                }
            case SOUTH:
                if (this.stackPanelSouth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelSouth.getItem();
                    return thePanel.getPanelType();
                }
        }

        return EnumPanels.EMPTY;
    }

    public NBTTagCompound createNBTData() {
        NBTTagCompound panels = new NBTTagCompound();

        // NBTTagCompound panelUp = new NBTTagCompound();
        // NBTTagCompound panelDown = new NBTTagCompound();
        // NBTTagCompound panelEast = new NBTTagCompound();
        // NBTTagCompound panelWest = new NBTTagCompound();
        // NBTTagCompound panelNorth = new NBTTagCompound();
        // NBTTagCompound panelSouth = new NBTTagCompound();

        // panelUp.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelUp.writeToNBT(panelUp);
        panels.setTag("up", stackPanelUp.writeToNBT(new NBTTagCompound()));

        // panelDown.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelDown.writeToNBT(panelDown);
        panels.setTag("down", stackPanelDown.writeToNBT(new NBTTagCompound()));

        // panelEast.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelEast.writeToNBT(panelEast);
        panels.setTag("east", stackPanelEast.writeToNBT(new NBTTagCompound()));

        // panelWest.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelWest.writeToNBT(panelWest);
        panels.setTag("west", stackPanelWest.writeToNBT(new NBTTagCompound()));

        // panelNorth.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelNorth.writeToNBT(panelNorth);
        panels.setTag("north", stackPanelNorth.writeToNBT(new NBTTagCompound()));

        // panelSouth.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelSouth.writeToNBT(panelSouth);
        panels.setTag("south", stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return panels;
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        // this is called by minecraft to give you the posibility to update your NBT before being saved to the world
        super.writeToNBT(compound);

        compound.setTag("up", this.stackPanelUp.writeToNBT(new NBTTagCompound()));
        compound.setTag("down", this.stackPanelDown.writeToNBT(new NBTTagCompound()));
        compound.setTag("east", this.stackPanelEast.writeToNBT(new NBTTagCompound()));
        compound.setTag("west", this.stackPanelWest.writeToNBT(new NBTTagCompound()));
        compound.setTag("north", this.stackPanelNorth.writeToNBT(new NBTTagCompound()));
        compound.setTag("south", this.stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return compound;
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {

        super.readFromNBT(compound);

        LogHelper.info("CALLED HERE!!! " + compound);

        if (compound.hasKey(PANELS)) {

            LogHelper.info("CALLED INSIDE HAS KEY PANELS");

            NBTTagCompound panels = compound.getCompoundTag(PANELS);

            this.stackPanelUp = new ItemStack(panels.getCompoundTag("up"));
            this.stackPanelDown = new ItemStack(panels.getCompoundTag("down"));
            this.stackPanelEast = new ItemStack(panels.getCompoundTag("east"));
            this.stackPanelWest = new ItemStack(panels.getCompoundTag("west"));
            this.stackPanelNorth = new ItemStack(panels.getCompoundTag("north"));
            this.stackPanelSouth = new ItemStack(panels.getCompoundTag("south"));

        } else {
            LogHelper.info("NOT TRUE PANELS");
        }

    }

    @Override
    public NBTTagCompound getUpdateTag() {
        // TODO Auto-generated method stub
        return super.getUpdateTag();
    }

}

 

PS: I believe I now see the problem :P But lets see...

Edited January 9, 2018 by American2050
  • Quote

Share this post


Link to post
Share on other sites

TheAwesomeGem    2

TheAwesomeGem

TheAwesomeGem    2

  • Stone Miner
  • TheAwesomeGem
  • Members
  • 2
  • 82 posts
Posted January 9, 2018
22 minutes ago, American2050 said:

Here:
 


    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        // this is called by minecraft to give you the posibility to update your NBT before being saved to the world
        super.writeToNBT(compound);

        compound.setTag("up", this.stackPanelUp.writeToNBT(new NBTTagCompound()));
        compound.setTag("down", this.stackPanelDown.writeToNBT(new NBTTagCompound()));
        compound.setTag("east", this.stackPanelEast.writeToNBT(new NBTTagCompound()));
        compound.setTag("west", this.stackPanelWest.writeToNBT(new NBTTagCompound()));
        compound.setTag("north", this.stackPanelNorth.writeToNBT(new NBTTagCompound()));
        compound.setTag("south", this.stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return compound;
    }

 

The whole class, just in case:

 

  Hide contents


package org.bitbucket.factoryblock.tileentity;

import org.bitbucket.factoryblock.LogHelper;
import org.bitbucket.factoryblock.enums.EnumPanels;
import org.bitbucket.factoryblock.interfaces.IPanel;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;

public class TileEntityFactory extends TileEntity implements ITickable, net.minecraft.client.renderer.texture.ITickable {

    public static final String PANELS = "factory.panels";

    private NonNullList<EnumPanels> factoryPanels = NonNullList.withSize(6, EnumPanels.EMPTY);

    private ItemStack stackPanelUp = ItemStack.EMPTY;
    private ItemStack stackPanelDown = ItemStack.EMPTY;
    private ItemStack stackPanelEast = ItemStack.EMPTY;
    private ItemStack stackPanelWest = ItemStack.EMPTY;
    private ItemStack stackPanelNorth = ItemStack.EMPTY;
    private ItemStack stackPanelSouth = ItemStack.EMPTY;

    public TileEntityFactory() {
        this.getTileData().setTag(PANELS, createNBTData());
    }

    @Override
    public void update() {
        // TODO Auto-generated method stub

    }

    // TODO Do we need this?
    @Override
    public void tick() {
        // TODO Auto-generated method stub

    }

    public void setPanelAt(EnumFacing facing, ItemStack stack) {
        switch (facing) {
            case UP:
                this.stackPanelUp = stack;
                break;
            case DOWN:
                this.stackPanelUp = stack;
                break;
            case EAST:
                this.stackPanelUp = stack;
                break;
            case WEST:
                this.stackPanelUp = stack;
                break;
            case NORTH:
                this.stackPanelUp = stack;
                break;
            case SOUTH:
                this.stackPanelUp = stack;
                break;
        }

        // This Force NBT Update?
        this.markDirty();
    }

    public EnumPanels getPanelTypeAt(EnumFacing facing) {

        switch (facing) {
            case UP:
                if (this.stackPanelUp.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelUp.getItem();
                    return thePanel.getPanelType();
                }
            case DOWN:
                if (this.stackPanelDown.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelDown.getItem();
                    return thePanel.getPanelType();
                }
            case EAST:
                if (this.stackPanelEast.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelEast.getItem();
                    return thePanel.getPanelType();
                }
            case WEST:
                if (this.stackPanelWest.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelWest.getItem();
                    return thePanel.getPanelType();
                }
            case NORTH:
                if (this.stackPanelNorth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelNorth.getItem();
                    return thePanel.getPanelType();
                }
            case SOUTH:
                if (this.stackPanelSouth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelSouth.getItem();
                    return thePanel.getPanelType();
                }
        }

        return EnumPanels.EMPTY;
    }

    public NBTTagCompound createNBTData() {
        NBTTagCompound panels = new NBTTagCompound();

        // NBTTagCompound panelUp = new NBTTagCompound();
        // NBTTagCompound panelDown = new NBTTagCompound();
        // NBTTagCompound panelEast = new NBTTagCompound();
        // NBTTagCompound panelWest = new NBTTagCompound();
        // NBTTagCompound panelNorth = new NBTTagCompound();
        // NBTTagCompound panelSouth = new NBTTagCompound();

        // panelUp.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelUp.writeToNBT(panelUp);
        panels.setTag("up", stackPanelUp.writeToNBT(new NBTTagCompound()));

        // panelDown.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelDown.writeToNBT(panelDown);
        panels.setTag("down", stackPanelDown.writeToNBT(new NBTTagCompound()));

        // panelEast.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelEast.writeToNBT(panelEast);
        panels.setTag("east", stackPanelEast.writeToNBT(new NBTTagCompound()));

        // panelWest.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelWest.writeToNBT(panelWest);
        panels.setTag("west", stackPanelWest.writeToNBT(new NBTTagCompound()));

        // panelNorth.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelNorth.writeToNBT(panelNorth);
        panels.setTag("north", stackPanelNorth.writeToNBT(new NBTTagCompound()));

        // panelSouth.setString("panel", EnumPanels.EMPTY.getName());
        // stackPanelSouth.writeToNBT(panelSouth);
        panels.setTag("south", stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return panels;
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        // this is called by minecraft to give you the posibility to update your NBT before being saved to the world
        super.writeToNBT(compound);

        compound.setTag("up", this.stackPanelUp.writeToNBT(new NBTTagCompound()));
        compound.setTag("down", this.stackPanelDown.writeToNBT(new NBTTagCompound()));
        compound.setTag("east", this.stackPanelEast.writeToNBT(new NBTTagCompound()));
        compound.setTag("west", this.stackPanelWest.writeToNBT(new NBTTagCompound()));
        compound.setTag("north", this.stackPanelNorth.writeToNBT(new NBTTagCompound()));
        compound.setTag("south", this.stackPanelSouth.writeToNBT(new NBTTagCompound()));

        return compound;
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {

        super.readFromNBT(compound);

        LogHelper.info("CALLED HERE!!! " + compound);

        if (compound.hasKey(PANELS)) {

            LogHelper.info("CALLED INSIDE HAS KEY PANELS");

            NBTTagCompound panels = compound.getCompoundTag(PANELS);

            this.stackPanelUp = new ItemStack(panels.getCompoundTag("up"));
            this.stackPanelDown = new ItemStack(panels.getCompoundTag("down"));
            this.stackPanelEast = new ItemStack(panels.getCompoundTag("east"));
            this.stackPanelWest = new ItemStack(panels.getCompoundTag("west"));
            this.stackPanelNorth = new ItemStack(panels.getCompoundTag("north"));
            this.stackPanelSouth = new ItemStack(panels.getCompoundTag("south"));

        } else {
            LogHelper.info("NOT TRUE PANELS");
        }

    }

    @Override
    public NBTTagCompound getUpdateTag() {
        // TODO Auto-generated method stub
        return super.getUpdateTag();
    }

}

 

PS: I believe I now see the problem :P But lets see...

You are not saving the PANELS tag.

  • Quote

New Channel: https://www.youtube.com/theawesomegemily'>https://www.youtube.com/theawesomegemily

My Group: https://www.youtube.com/officialpixelgem

Old Channel: https://www.youtube.com/theawesomegem

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018
9 hours ago, TheAwesomeGem said:

You are not saving the PANELS tag.

Yes now that I see the writeToNBT I noticed that, but how come that when I print the compound to the console it does show the tag PANELS there and the default values for each side?

PS: the createNBT is implemented correctly? Is it ok to call it from the constructor?

Thanks a lot.

  • Quote

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018

Also... Independent of the fact that I was missing to write the tag PANELS... How come it's there on the NBT I receive, but the hasKey still is false?

 

@Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        // this is called by minecraft to give you the posibility to update your NBT before being saved to the world
        super.writeToNBT(compound);

        LogHelper.info("CALLED WRITE " + compound + " content");

        if (compound.hasKey(PANELS)) {
            LogHelper.info("HAS PANELS");
        }

 

Console shows:

 

[08:35:04] [Server thread/INFO] [LogHelper]: CALLED WRITE {ForgeData:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}},x:50,y:83,z:272,id:"factoryblock:te_factory"} content

 

but HAS PANELS never shows... isn't {ForgeData:{factory.panels:{east:{id indicating the precense of the tag PANELS there, or I'm missing something?

  • Quote

Share this post


Link to post
Share on other sites

Choonster    1651

Choonster

Choonster    1651

  • Reality Controller
  • Choonster
  • Forge Modder
  • 1651
  • 5100 posts
Posted January 9, 2018

Judging by the "ForgeData" tag, it looks like you're using TileEntity#getTileData somewhere; don't do this. The tag returned by TileEntity#getTileData is for mods to store custom data on external TileEntities; but the capability system is a much better way to do this.

 

When you call TileEntity#writeToNBT, pass an empty compound tag as the argument.

  • Quote

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018
9 minutes ago, Choonster said:

Judging by the "ForgeData" tag, it looks like you're using TileEntity#getTileData somewhere; don't do this. The tag returned by TileEntity#getTileData is for mods to store custom data on external TileEntities; but the capability system is a much better way to do this.

 

When you call TileEntity#writeToNBT, pass an empty compound tag as the argument.

Ohh ok. Well a friend told me that apparently I should never call the writeToNBT myself, not sure where he saw that. Is it ok to call it from the createNBT method that I have in my constructor, so each time the tileentity is set on the world, it creates the default values?

 

PD: I had the getTileData at the constructor as // this.getTileData().setTag(PANELS, createNBTData());

  • Quote

Share this post


Link to post
Share on other sites

Choonster    1651

Choonster

Choonster    1651

  • Reality Controller
  • Choonster
  • Forge Modder
  • 1651
  • 5100 posts
Posted January 9, 2018
6 minutes ago, American2050 said:

Ohh ok. Well a friend told me that apparently I should never call the writeToNBT myself, not sure where he saw that. Is it ok to call it from the createNBT method that I have in my constructor, so each time the tileentity is set on the world, it creates the default values?

 

PD: I had the getTileData at the constructor as // this.getTileData().setTag(PANELS, createNBTData());

 

Don't call TileEntity#writeToNBT unless you actually need to serialise the TileEntity to NBT (e.g. to store the data in an ItemStack). Minecraft automatically calls it when the chunk is written to disk.

 

Your TileEntity's data should be stored in regular fields and only written to NBT when necessary.

  • Like 1
  • Quote

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018
Just now, Choonster said:

 

Don't call TileEntity#writeToNBT unless you actually need to serialise the TileEntity to NBT (e.g. to store the data in an ItemStack). Minecraft automatically calls it when the chunk is written to disk.

 

Your TileEntity's data should be stored in regular fields and only written to NBT when necessary.

Ohhh ok, so I don't need to worry about storing the values for the first time when the TileEntity is placed in the world?

 

I was doing this so, when I call methods from the Block, for example onBlockActivated I already "know" and can be "sure" that the TileEntity already has default values. But I guess I check against variables and not the data on the NBT right? Like if I want to change the value of for example ItemStack on side "UP" I just change the value of that variable and whenever Minecraft calls the writeToNBT it will update that value?

 

Thanks, and sorry for so many questions NBT was/is (and hopefully not will always be) a shady part on codding that I never clearly understand.

  • Quote

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018

Apparently the problem is that the server isn't receiving the updated information.

 

This is a log when loading a world with one of my TileEntities placed on it...

 

[09:35:44] [Server thread/INFO] [LogHelper]: CALLED HERE ON READ!!!
[09:35:44] [Server thread/INFO] [LogHelper]: COMPOUND ON READ IS: {ForgeData:{factory.data:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}}},x:52,y:83,z:269,id:"factoryblock:te_factory",factory.data:{factory.panels:{east:{id:"minecraft:air",Count:0b,Damage:0s},south:{id:"minecraft:air",Count:0b,Damage:0s},north:{id:"minecraft:air",Count:0b,Damage:0s},west:{id:"minecraft:air",Count:0b,Damage:0s},up:{id:"minecraft:air",Count:0b,Damage:0s},down:{id:"minecraft:air",Count:0b,Damage:0s}}}}
[09:35:44] [Server thread/INFO] [LogHelper]: HAS TAG ON READ
[09:35:44] [Server thread/INFO] [LogHelper]: HAS PANELS ON READ

[09:35:49] [Server thread/INFO] [LogHelper]: COMPOUND ON WRITE IS: {ForgeData:{factory.data:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}}},x:52,y:83,z:269,id:"factoryblock:te_factory",factory.data:{factory.panels:{east:{id:"minecraft:air",Count:0b,Damage:0s},south:{id:"minecraft:air",Count:0b,Damage:0s},north:{id:"minecraft:air",Count:0b,Damage:0s},west:{id:"minecraft:air",Count:0b,Damage:0s},up:{id:"minecraft:air",Count:0b,Damage:0s},down:{id:"minecraft:air",Count:0b,Damage:0s}}}}
[09:35:49] [Server thread/INFO] [LogHelper]: HAS TAG ON WRITE
[09:35:49] [Server thread/INFO] [LogHelper]: HAS PANELS ON WRITE
[09:35:49] [Server thread/INFO] [LogHelper]: HAS up ON WRITE

[09:35:49] [main/INFO] [LogHelper]: CALLED HERE ON READ!!!
[09:35:49] [main/INFO] [LogHelper]: COMPOUND ON READ IS: {ForgeData:{factory.data:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}}},x:52,y:83,z:269,id:"factoryblock:te_factory"}

[09:35:53] [Server thread/INFO] [LogHelper]: COMPOUND ON WRITE IS: {ForgeData:{factory.data:{factory.panels:{east:{id:"minecraft:air",Count:1b,Damage:0s},south:{id:"minecraft:air",Count:1b,Damage:0s},north:{id:"minecraft:air",Count:1b,Damage:0s},west:{id:"minecraft:air",Count:1b,Damage:0s},up:{id:"minecraft:air",Count:1b,Damage:0s},down:{id:"minecraft:air",Count:1b,Damage:0s}}}},x:52,y:83,z:269,id:"factoryblock:te_factory",factory.data:{factory.panels:{east:{id:"minecraft:air",Count:0b,Damage:0s},south:{id:"minecraft:air",Count:0b,Damage:0s},north:{id:"minecraft:air",Count:0b,Damage:0s},west:{id:"minecraft:air",Count:0b,Damage:0s},up:{id:"minecraft:air",Count:0b,Damage:0s},down:{id:"minecraft:air",Count:0b,Damage:0s}}}}
[09:35:53] [Server thread/INFO] [LogHelper]: HAS TAG ON WRITE
[09:35:53] [Server thread/INFO] [LogHelper]: HAS PANELS ON WRITE
[09:35:53] [Server thread/INFO] [LogHelper]: HAS up ON WRITE
[09:35:53] [Server thread/INFO]: Saving chunks for level 'New World'/the_nether
[09:35:53] [Server thread/INFO]: Saving chunks for level 'New World'/the_end

 

This are the differences I notice: The Write was only called on server.

 

And when the read is called both, Server and Client side, the information on the NBT is different

 

SERVER on READ
{ForgeData:{factory.data:
{factory.panels:{
east:{id:"minecraft:air",Count:1b,Damage:0s},
south:{id:"minecraft:air",Count:1b,Damage:0s},
north:{id:"minecraft:air",Count:1b,Damage:0s},
west:{id:"minecraft:air",Count:1b,Damage:0s},
up:{id:"minecraft:air",Count:1b,Damage:0s},
down:{id:"minecraft:air",Count:1b,Damage:0s}}}},
x:52,y:83,z:269,id:"factoryblock:te_factory",

factory.data:
{factory.panels:{
east:{id:"minecraft:air",Count:0b,Damage:0s},
south:{id:"minecraft:air",Count:0b,Damage:0s},
north:{id:"minecraft:air",Count:0b,Damage:0s},
west:{id:"minecraft:air",Count:0b,Damage:0s},
up:{id:"minecraft:air",Count:0b,Damage:0s},
down:{id:"minecraft:air",Count:0b,Damage:0s}}}}


CLIENT on READ
{ForgeData:{factory.data:
{factory.panels:{
east:{id:"minecraft:air",Count:1b,Damage:0s},
south:{id:"minecraft:air",Count:1b,Damage:0s},
north:{id:"minecraft:air",Count:1b,Damage:0s},
west:{id:"minecraft:air",Count:1b,Damage:0s},
up:{id:"minecraft:air",Count:1b,Damage:0s},
down:{id:"minecraft:air",Count:1b,Damage:0s}}}},
x:52,y:83,z:269,id:"factoryblock:te_factory"}

 

What I don't understand why is the ForgeData there? And how the client go it?

PS: I guess the fix for this is to work with packets now? I remember I saw something about overwriting 4 packet methods for TileEntities but will have to read about this as I have not idea.
 

This is my TE code now after cleanup:

 

package org.bitbucket.factoryblock.tileentity;

import org.bitbucket.factoryblock.LogHelper;
import org.bitbucket.factoryblock.enums.EnumPanels;
import org.bitbucket.factoryblock.interfaces.IPanel;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;

public class TileEntityFactory extends TileEntity implements ITickable, net.minecraft.client.renderer.texture.ITickable {

    public static final String TAG = "factory.data";
    public static final String PANELS = "factory.panels";

    private ItemStack stackPanelUp = ItemStack.EMPTY;
    private ItemStack stackPanelDown = ItemStack.EMPTY;
    private ItemStack stackPanelEast = ItemStack.EMPTY;
    private ItemStack stackPanelWest = ItemStack.EMPTY;
    private ItemStack stackPanelNorth = ItemStack.EMPTY;
    private ItemStack stackPanelSouth = ItemStack.EMPTY;

    public TileEntityFactory() {
    }

    @Override
    public void update() {
        // TODO Auto-generated method stub

    }

    // TODO Do we need this?
    @Override
    public void tick() {
        // TODO Auto-generated method stub

    }

    public void setPanelAt(EnumFacing facing, ItemStack stack) {
        switch (facing) {
            case UP:
                this.stackPanelUp = stack;
                break;
            case DOWN:
                this.stackPanelUp = stack;
                break;
            case EAST:
                this.stackPanelUp = stack;
                break;
            case WEST:
                this.stackPanelUp = stack;
                break;
            case NORTH:
                this.stackPanelUp = stack;
                break;
            case SOUTH:
                this.stackPanelUp = stack;
                break;
        }

        // This Force NBT Update?
        this.markDirty();
    }

    public EnumPanels getPanelTypeAt(EnumFacing facing) {

        switch (facing) {
            case UP:
                if (this.stackPanelUp.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelUp.getItem();
                    return thePanel.getPanelType();
                }
            case DOWN:
                if (this.stackPanelDown.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelDown.getItem();
                    return thePanel.getPanelType();
                }
            case EAST:
                if (this.stackPanelEast.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelEast.getItem();
                    return thePanel.getPanelType();
                }
            case WEST:
                if (this.stackPanelWest.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelWest.getItem();
                    return thePanel.getPanelType();
                }
            case NORTH:
                if (this.stackPanelNorth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelNorth.getItem();
                    return thePanel.getPanelType();
                }
            case SOUTH:
                if (this.stackPanelSouth.getItem() instanceof IPanel) {
                    IPanel thePanel = (IPanel) this.stackPanelSouth.getItem();
                    return thePanel.getPanelType();
                }
        }

        return EnumPanels.EMPTY;
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {

        super.writeToNBT(compound);

        // DATA
        NBTTagCompound data = new NBTTagCompound();

        // PANELS
        NBTTagCompound panels = new NBTTagCompound();

        panels.setTag("up", this.stackPanelUp.writeToNBT(new NBTTagCompound()));
        panels.setTag("down", this.stackPanelDown.writeToNBT(new NBTTagCompound()));
        panels.setTag("east", this.stackPanelEast.writeToNBT(new NBTTagCompound()));
        panels.setTag("west", this.stackPanelWest.writeToNBT(new NBTTagCompound()));
        panels.setTag("north", this.stackPanelNorth.writeToNBT(new NBTTagCompound()));
        panels.setTag("south", this.stackPanelSouth.writeToNBT(new NBTTagCompound()));

        // STORE PANELS ON DATA
        data.setTag(PANELS, panels);

        // STORE DATA ON A MAIN TAG
        compound.setTag(TAG, data);

        LogHelper.info("COMPOUND ON WRITE IS: " + compound);

        if (compound.hasKey(TAG)) {
            LogHelper.info("HAS TAG ON WRITE");
            NBTTagCompound temp = compound.getCompoundTag(TAG);
            if (temp.hasKey(PANELS)) {
                LogHelper.info("HAS PANELS ON WRITE");
                NBTTagCompound temp_panels = temp.getCompoundTag(PANELS);

                if (temp_panels.hasKey("up")) {
                    LogHelper.info("HAS up ON WRITE");
                }
            }
        }
        return compound;
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {

        super.readFromNBT(compound);

        LogHelper.info("CALLED HERE ON READ!!!");
        LogHelper.info("COMPOUND ON READ IS: " + compound);

        if (compound.hasKey(TAG)) {

            LogHelper.info("HAS TAG ON READ");

            NBTTagCompound data = compound.getCompoundTag(TAG);

            if (data.hasKey(PANELS)) {

                LogHelper.info("HAS PANELS ON READ");

                NBTTagCompound panels = data.getCompoundTag(PANELS);

                this.stackPanelUp = new ItemStack(panels.getCompoundTag("up"));
                this.stackPanelDown = new ItemStack(panels.getCompoundTag("down"));
                this.stackPanelEast = new ItemStack(panels.getCompoundTag("east"));
                this.stackPanelWest = new ItemStack(panels.getCompoundTag("west"));
                this.stackPanelNorth = new ItemStack(panels.getCompoundTag("north"));
                this.stackPanelSouth = new ItemStack(panels.getCompoundTag("south"));
            }

        }

    }

    /*
     * @Override
     * public NBTTagCompound getUpdateTag() {
     * return super.getUpdateTag();
     * }
     */

}

 

  • Quote

Share this post


Link to post
Share on other sites

diesieben07    7696

diesieben07

diesieben07    7696

  • Reality Controller
  • diesieben07
  • Forum Team
  • 7696
  • 56376 posts
Posted January 9, 2018

Some things to clear up:

  • Saving to disk for tile entities (and normal entities) happens automatically, you get no control over when it happens. The only thing you must do is call TileEntity::markDirty when data that needs saving has changed. This tells Minecraft "Hey, I need saving before you unload me". When that happens does not matter and you should not care about it. markDirty also tells nearby blocks "hey, my tile entity data has changed" (by calling Block::onNeighborChange if Block::getWeakChanges returns true for the neighboring block). This is used to update comparators when a nearby inventory changes. Making these two things one method is ugly, but that's how it is.
  • Loading from disk for tile entities happens automatically. You can (usually) assume that your tile entity will not be in a state of "I am freshly created but do not have the data yet". Only exception is a constructor in your TileEntity class (seriously, you almost never should write one) and obviously the Block::createTileEntity method, where you just created the fresh instance.
  • Stop thinking in terms of "store stuff in NBT". NBT is a serialization format (like JSON). You store things in your tile entity, which happens to use NBT to persist data into the world. But nobody but the methods writeToNbt and readFromNbt need to care about this and nobody else but them should touch NBT.
  • getUpdateTag (which you have pointlessly overridden) is vanilla's crude tile entity synchronization mechanism. For vanilla this mechanism is "take the complete tile entity state, serialize it like we would if saving to disk and then shove it down the network". Adopting this mechanism in modded code is terrible, since modded tile entities often have incredibly complex functionality and produce lots of data when saving to disk. There is no need to shove all this crap down the network. Only send over what you need to and if you are feeling especially nice, stop using the terrible NBT-based syncing that vanilla uses.

Now, on to the issues with your code:

  • Do not implement that client-only ITickable interface on your tile entity. You will crash a dedicated server.
  • Never, ever use getTileData. Seriously. For your own tile entities, store data in normal fields (see above). Do not use NBT here, NBT is for saving to disk, only (ignore ItemStacks, they are terrible).
  • Like 4
  • Quote

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018 (edited)
26 minutes ago, diesieben07 said:

Some things to clear up:

  • Saving to disk for tile entities (and normal entities) happens automatically, you get no control over when it happens. The only thing you must do is call TileEntity::markDirty when data that needs saving has changed. This tells Minecraft "Hey, I need saving before you unload me". When that happens does not matter and you should not care about it. markDirty also tells nearby blocks "hey, my tile entity data has changed" (by calling Block::onNeighborChange if Block::getWeakChanges returns true for the neighboring block). This is used to update comparators when a nearby inventory changes. Making these two things one method is ugly, but that's how it is.
  • Loading from disk for tile entities happens automatically. You can (usually) assume that your tile entity will not be in a state of "I am freshly created but do not have the data yet". Only exception is a constructor in your TileEntity class (seriously, you almost never should write one) and obviously the Block::createTileEntity method, where you just created the fresh instance.
  • Stop thinking in terms of "store stuff in NBT". NBT is a serialization format (like JSON). You store things in your tile entity, which happens to use NBT to persist data into the world. But nobody but the methods writeToNbt and readFromNbt need to care about this and nobody else but them should touch NBT.
  • getUpdateTag (which you have pointlessly overridden) is vanilla's crude tile entity synchronization mechanism. For vanilla this mechanism is "take the complete tile entity state, serialize it like we would if saving to disk and then shove it down the network". Adopting this mechanism in modded code is terrible, since modded tile entities often have incredibly complex functionality and produce lots of data when saving to disk. There is no need to shove all this crap down the network. Only send over what you need to and if you are feeling especially nice, stop using the terrible NBT-based syncing that vanilla uses.

Now, on to the issues with your code:

  • Do not implement that client-only ITickable interface on your tile entity. You will crash a dedicated server.
  • Never, ever use getTileData. Seriously. For your own tile entities, store data in normal fields (see above). Do not use NBT here, NBT is for saving to disk, only (ignore ItemStacks, they are terrible).

Thanks a lot for all this, great information. Some points here. I used the getUpdateTag  because I was following a tutorial and example code from MinecraftByExamples on the TileEntities examples

https://github.com/TheGreyGhost/MinecraftByExample/tree/master/src/main/java/minecraftbyexample/mbe20_tileentity_data

(so now I have the 4 methods suggested there getUpdatePacket(), getUpdateTag(), onDataPacket(), and handleUpdateTag() been overriden.

 

Now going with the thinking of "I store things in my TileEntity" problem comes when I change a variable on my TileEntity but those changes are made server only, then the client doesn't know about them until writeToNBT and readFromNBT are called.

 

I have a point on my TileEntity after I set x ItemStack to any given side, at the end of that method I call this.markDirty (But you mention I shouldn't care of "When" that happens) I would like for it to happen inmediatly, so my block knows about the changes.

 

Now on my block, on the method onBlockActivated (And server side) I set the ItemStacks on my tile entity and, after that is done I am calling .notifyBlockUpdate on the client side. It's not until the 2nd time I right click that you can see the render update (At this point I'm not sure if it's because the first time it's called, it still doesn't have the information of what ItemStack is on X side or what) I will have to see what's going on there.

 

PS: What do you mean with "ignore ItemStacks they are terrible"? You mean why I'm storing itemstacks on my TileEntity this way?

Edited January 9, 2018 by American2050
  • Quote

Share this post


Link to post
Share on other sites

diesieben07    7696

diesieben07

diesieben07    7696

  • Reality Controller
  • diesieben07
  • Forum Team
  • 7696
  • 56376 posts
Posted January 9, 2018
Just now, American2050 said:

Now going with the thinking of "I store things in my TileEntity" problem comes when I change a variable on my TileEntity but those changes are made server only, then the client doesn't know about them until writeToNBT and readFromNBT are called.

No. Stop. writeToNbt and readFromNbt are for saving to disk. Server-side. If you want to sync stuff to the client (assuming you want to use the vanilla mechanic, which uses NBT), you need to override a couple of methods (warning, this is a giant mess):

  • getUpdateTag - Returns the data that should be sent to the client on initial chunk load (i.e. when it gets into render distance, etc.). Call super here and put whatever data you need to have available on the client in the NBTTagCompound returned from super. Then return it.
  • handleUpdateTag - Called on the client with whatever tag was returned from getUpdateTag. By default this calls readFromNbt, which is a terrible default, but oh well.
  • getUpdatePacket - Called to produce a subsequent update packet. You should return a SPacketUpdateTileEntity here if you need the data on the client to be updated from time to time. In theory you can return a partial update here, but usually it is best to just call getUpdateTag and pass that NBTTagCompound to the packet. The int parameter of the packet constructor can be set to whatever unsigned byte you like best.
  • onDataPacket - Called on the client when the packet produced by getUpdatePacket is received. Usually you just need to call handleUpdateTag with the NBT data from the packet (SPacketUpdateTileEntity::getNbtCompound).

getUpdateTag will always be called and it's data sent when the chunk is initially transferred to the client. You cannot stop this.

If you need to update the client-side data later (i.e. you need the packet produced by getUpdatePacket to be sent), call World::notifyBlockUpdate on the server.

 

16 minutes ago, American2050 said:

I have a point on my TileEntity after I set x ItemStack to any given side, at the end of that method I call this.markDirty (But you mention I shouldn't care of "When" that happens) I would like for it to happen inmediatly, so my block knows about the changes.

You should care about when you call markDirty. You should not care when writeToNbt and readFromNbt are called. Remember, these are for saving the world to disk. Minecraft will do that when it sees fit.

 

18 minutes ago, American2050 said:

Now on my block, on the method onBlockActivated (And server side) I set the ItemStacks on my tile entity and, after that is done I am calling .notifyBlockUpdate on the client side. It's not until the 2nd time I right click that you can see the render update (At this point I'm not sure if it's because the first time it's called, it still doesn't have the information of what ItemStack is on X side or what) I will have to see what's going on there.

You need to call markDirty after doing the changes (so Minecraft knows to save to disk) and then call notifyBlockUpdate to notify the client of these changes (assuming you are using the syncing mechanism described above). Both happens server-side.

 

19 minutes ago, American2050 said:

PS: What do you mean with "ignore ItemStacks they are terrible"? You mean why I'm storing itemstacks on my TileEntity this way?

That was in the context of "NBT is only used for saving to disk". ItemStacks have the terrible habit of using NBT for runtime storage, which is ugly, cumbersome and inefficient.

  • Like 4
  • Thanks 3
  • Quote

Share this post


Link to post
Share on other sites

American2050    11

American2050

American2050    11

  • Dragon Slayer
  • American2050
  • Members
  • 11
  • 541 posts
Posted January 9, 2018

diesieben07 Thanks a lot for the time you take answering this questions and clarifying all the points. I believe that I finally have a better understanding on what's happening and when it's happening and more important, on how to handle this things.

I'm gonna start implementing all this and let you know how it went.

 

I was super super lost because I'm using a lot of things I never experiment with before. Special Rendering for my block, extended unlisted properties, and all this data sync across server and client. Tons of stuff going on at the same time, and I unsure on how to implement all of those, so it literally fell like 1 step forward and 10 back for each thing I got working. Always hitting some bump :P

 

Thanks once again. :x

  • Quote

Share this post


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.   Paste as plain text instead

  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.

    • Insert image from URL
×
  • Desktop
  • Tablet
  • Phone
Sign in to follow this  
Followers 0
Go To Topic Listing



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • NovaMachina
      [1.16] Block texture resonds to sky light not block light

      By NovaMachina · Posted 3 minutes ago

      Great point. Should have seen that. Would I just pass that into the IVertexBuilder#lightmap function?
    • Draco18s
      [1.16] Block texture resonds to sky light not block light

      By Draco18s · Posted 7 minutes ago

      I wonder what combinedLight is. https://github.com/NovaMachina-Mods/ExNihiloSequentia/blob/1.16/src/main/java/novamachina/exnihilosequentia/client/render/SieveRender.java#L34
    • NovaMachina
      [1.16] Block texture resonds to sky light not block light

      By NovaMachina · Posted 27 minutes ago

      I received a bug report where the texture of a block is only responding to the sky light, but not any block lights (such as torches). Here is the link to the renderer that I believe to be the culprit. Any suggestions? https://github.com/NovaMachina-Mods/ExNihiloSequentia/blob/1.16/src/main/java/novamachina/exnihilosequentia/client/render/SieveRender.java Here is an image that shows the issue: https://repo.jacob-williams.me/repository/raw/exnihilosequentia/issues/images/Lighting%20Bug.png
    • brok4d
      OBJ MODELS

      By brok4d · Posted 2 hours ago

      Hello, this mod is the source, you have to get boredhttps://gitlab.com/Lycanite/LycanitesMobs
    • JayNeedsHelp
      Logger not working

      By JayNeedsHelp · Posted 2 hours ago

      So I'm currently creating a forge mod and I'm having an issue where the console stops logging after some errors. It seems to be connected to the access transformers that I'm using as before I added at's my console was working fine.   Here is my at file:  public-f net.minecraft.client.Minecraft session public net.minecraft.client.Minecraft timer public net.minecraft.client.gui.GuiScreen buttonList public net.minecraft.util.Timer tickLength public net.minecraft.network.play.client.CPacketPlayer onGround public net.minecraft.network.play.server.SPacketEntityVelocity motionX public net.minecraft.network.play.server.SPacketEntityVelocity motionY public net.minecraft.network.play.server.SPacketEntityVelocity motionZ public net.minecraft.network.play.server.SPacketExplosion motionX public net.minecraft.network.play.server.SPacketExplosion motionY public net.minecraft.network.play.server.SPacketExplosion motionZ public net.minecraft.client.renderer.entity.RenderManager renderPosX public net.minecraft.client.renderer.entity.RenderManager renderPosY public net.minecraft.client.renderer.entity.RenderManager renderPosZ   Any help is greatly appreciated thank you!
  • Topics

    • NovaMachina
      2
      [1.16] Block texture resonds to sky light not block light

      By NovaMachina
      Started 27 minutes ago

    • Milk_Shak3s
      1
      OBJ MODELS

      By Milk_Shak3s
      Started 17 hours ago

    • JayNeedsHelp
      0
      Logger not working

      By JayNeedsHelp
      Started 2 hours ago

    • cadbane86140
      0
      Minecraft: Hunger Games Game #36- Shear FIGHT!

      By cadbane86140
      Started 4 hours ago

    • Sad Whale
      6
      Game crashes whenever I try to increase the RAM

      By Sad Whale
      Started 5 hours ago

  • Who's Online (See full list)

    • elite_mlgbro1
    • FREyebeans2506
    • NovaMachina
    • mp1115
    • Draco18s
    • Jeldrik
    • Shiroroku
    • hammy3502
    • MizonSky
    • HappyAndJust
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • NBT What am I doing wrong?
  • Theme

Copyright © 2019 ForgeDevelopment LLC · Ads by Longitude Ads LLC Powered by Invision Community