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.

Featured Replies

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,

  • Author

Never mind, Apparently there is another version of getIcon with more info. I'll use that :-)

  • Author

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,

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.

  • Author

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?

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.

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

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.