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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello , when I try to launch the forge installer it just crash with a message for 0,5 secondes. I'm using java 17 to launch it. Here's the link of the error :https://cdn.corenexis.com/view/?img=d/ma24/qs7u4U.jpg  
    • You will find the crash-report or log in your minecraft directory (crash-report or logs folder)
    • Use a modpack which is using these 2 mods as working base:   https://www.curseforge.com/minecraft/modpacks/life-in-the-village-3
    • inicie un mundo donde instale Croptopia y Farmer's Delight, entonces instale el addon Croptopia Delight pero no funciona. es la version 1.18.2
    • Hello all. I'm currently grappling with the updateShape method in a custom class extending Block.  My code currently looks like this: The conditionals in CheckState are there to switch blockstate properties, which is working fine, as it functions correctly every time in getStateForPlacement.  The problem I'm running into is that when I update a state, the blocks seem to call CheckState with the position of the block which was changed updated last.  If I build a wall I can see the same change propagate across. My question thus is this: is updateShape sending its return to the neighbouring block?  Is each block not independently executing the updateShape method, thus inserting its own current position?  The first statement appears to be true, and the second false (each block is not independently executing the method). I have tried to fix this by saving the block's own position to a variable myPos at inception, and then feeding this in as CheckState(myPos) but this causes a worse outcome, where all blocks take the update of the first modified block, rather than just their neighbour.  This raises more questions than it answers, obviously: how is a different instance's variable propagating here?  I also tried changing it so that CheckState did not take a BlockPos, but had myPos built into the body - same problem. I have previously looked at neighbourUpdate and onNeighbourUpdate, but could not find a way to get this to work at all.  One post on here about updatePostPlacement and other methods has proven itself long superceded.  All other sources on the net seem to be out of date. Many thanks in advance for any help you might offer me, it's been several days now of trying to get this work and several weeks of generally trying to get round this roadblock.  - Sandermall
  • Topics

×
×
  • Create New...

Important Information

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