Posted November 30, 20168 yr I want to make a block that changes its model depending on the blocks around it. The most similar block I found in vanilla was the fence block and it uses getActualState() When does that method get called and how do I know when X method in the Block class gets called (besides Forge comments, which a lot of the methods dont have) Thanks
November 30, 20168 yr Author I tried that but I dont get it: I created a class for my block, overwritten getActualState to do nothing but print to console. I dont call it anywhere else and it still prints sometimes when I place blocks or break them. The only methods in the Block class (the parent of my class) that call getActualState are getBedDirection, isBedFoot, isSideSolid and setBedOccupied. I don't see why any of those methods would be called
November 30, 20168 yr Author Actually yes, but its called from some low level forge methods and I'm a begginer modder (not programmer) so I thought perhaps someone in the forums already knew about this and could share the information so I dont have to be a forge source code expert to make just a simple block. Apparently you don't know but thank you anyways
November 30, 20168 yr Author About that function? Because I wanted to understand how BlockFence works so I can do something similar
November 30, 20168 yr getActualState() is called whenever the block is rendered to get the correct state. For example, to load the right texture or the right model. Code from the Vanillacode class "BlockRendererDispatcher->renderBlock". if (enumblockrendertype == EnumBlockRenderType.INVISIBLE) { return false; } else { if (blockAccess.getWorldType() != WorldType.DEBUG_WORLD) { try { state = state.getActualState(blockAccess, pos); } catch (Exception var8) { ; } } switch (enumblockrendertype) { case MODEL: IBakedModel model = this.getModelForState(state); state = state.getBlock().getExtendedState(state, blockAccess, pos); return this.blockModelRenderer.renderModel(blockAccess, model, state, pos, worldRendererIn, true); case ENTITYBLOCK_ANIMATED: return false; case LIQUID: return this.fluidRenderer.renderFluid(blockAccess, state, pos, worldRendererIn); default: return false; } } Thats how I can see this in the code.
November 30, 20168 yr Example: I have a block implementation with connections. So, for each side there is a boolean property which indicates whether there is a same block at that side. If true, they are rendered with a 'pipe' between them. This check is performed in getActualState and the blockstate file applies the appropriate model for rendering.
November 30, 20168 yr Author getActualState() is called whenever the block is rendered to get the correct state. For example, to load the right texture or the right model. Thank you, thats the kind of answer I was hoping for. One question that I have about this though is: if the method is called whenever the block is rendered, why is it printing to console only when i place or destroy a block that is near my block. Is it because blocks are re-rendered only when neccessary?
December 1, 20168 yr Even more clear than using Eclipse to see method references is to set a breakpoint on BlockFence's getActualState and then run Minecraft in the debugger. Step out of the method and see what called it and what variables have what values. Maybe set another breakpoint somewhere upstream and continue. The debugger is very powerful because it cuts through the fog of runtime polymorphism etc. 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.
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.