Jump to content

Recommended Posts

Posted

Hi, I have a block in which I would like to have used 6 bits of metadata. 3 bits for the orientation of the block and 3 bits to store information needed for rendering the front side of the object (shows the amount of RF level in a block). Unfortunately metadata is limited to 4 bits so I can't do that. So I would like to add the information of the RF level to the tile entity (which I already have in any case) and keep the metadata for the orientation. However how do I use this in my getIcon() method:

 

    @Override
    public IIcon getIcon(int side, int meta) {
        int k = getOrientation(meta);
        if (side == k) {
            RFMonitorBlockTileEntity tileEntity = ...  how to get my tile entity here? ...
            int rflevel = tileEntity.getRFLevel();
            switch (rflevel) {
                case 1: return iconFront0;
                case 2: return iconFront1;
                case 3: return iconFront2;
                case 4: return iconFront3;
                case 5: return iconFront4;
                default: return iconFront;

            }
        } else {
            return iconSide;
        }
    }

 

How can I access my tile entity from getIcon()? I don't have my world and I don't have a coordinate in that method.

 

Thanks,

Posted

Ah no, it isn't completely solved. I have the tile entity which will check the RF value every 20 ticks and then it does this:

 

                worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);

 

In my block implementation I have this:

 

    @Override
    public IIcon getIcon(IBlockAccess blockAccess, int x, int y, int z, int side) {
        TileEntity tileEntity = blockAccess.getTileEntity(x, y, z);
        int meta = blockAccess.getBlockMetadata(x, y, z);
        int k = getOrientation(meta);
        ...
    }

 

But this function is not called as a result of the server side doing markBlockForUpdate. I also have this code in the tile entity which is related to this:

 

    @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound nbtTag = new NBTTagCompound();
        this.writeToNBT(nbtTag);
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, nbtTag);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    }

 

And I can see that these functions are called (with correct values) after markBlockForUpdate. But getIcon isn't called and the block doesn't render. I have to manually place another block adjacent to it to force a rerender.

 

Anything I'm missing?

 

Thanks,

Posted

In TileEntity's read and write nbt parts use variable to save value. Then if you do World#markBlockForUpdate on both sides (client and server) you should get same value to client side as well when updating block.

Posted

Yes, the readNBT/writeNBT actually contain the right values that should be synchronized. But how do I call markBlockForUpdate() on the client side? The tile entity on the server side is now doing markBlockForUpdate() but I guess that's only server side. I don't know how to trigger it on the client side as well?

Posted

I think that if you set variables on the server side and then trigger markBlockForUpdate in TileEntity#updateEntity it saves variables to nbt on the server side and then sends changed variables to the client side. I think that you don't need to call markBlockForUpdate in client side... Like TheGreyGhost said below, you should call markBlockForUpdate in client side as well.

Posted

Hi

 

I think you need to do markBlockForUpdate() on the client side as well as the server side in order to re-render the blocks.  Blocks only update their render appearance when you trigger it (eg the block is changed) (unlike TileEntity Special Renderer).

 

i.e.

markBlockForUpdate() on the server sends the new information to the client

markBlockForUpdate() on the client then updates the render information.

 

I would suggest that your TileEntity tick on the client side should check for a change (eg caused by onDataPacket) and call the markBlockForUpdate when it changes

 

-TGG

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.

Announcements



×
×
  • Create New...

Important Information

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