Jump to content

[Solved] Trouble using RenderBlocks and a TileEntitySpecialRenderer


itsonlydan

Recommended Posts

I am attempting to make a block that will appear as another block in the game, depending on the id passed into it. To do this I am using a TileEntitySpecialRenderer, and calling RenderBlocks.renderBlockByRenderType, as shown below. This works perfectly for all 1mx1mx1m blocks, but it renders everything else at that size. For items that are not full blocks, but are using textures that are from full block (e.g. half slabs and fences), this just renders a full block using that texture (so a fence appears as oak planks). For other blocks (such as a cactus), there are just gaps between the textures. I don't have much experience with custom rendering in minecraft/forge, and was hoping that somebody could help.

 

From my TileEntitySpecialRenderer subclass:

 
@Override
public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) {
   TileEntityCamouflaged te = (TileEntityCamouflaged)tileEntity;
   Block block = te.getTextureBlock();
   RenderBlocks renderBlocks = new RenderBlocks(tileEntity.worldObj);
   renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);
}

 

Methods overwritten in my block class:

        @Override
public boolean renderAsNormalBlock() {
	return false;
}

@Override
public boolean isOpaqueCube() {
	return false;
}

@Override
public boolean shouldSideBeRendered(IBlockAccess blockAccess, int x, int y, int z, int side) {
	System.out.println("shouldSideBeRendered at " + x + ", " + y + ", " + z + " on side " + side);
	int newX = x;
	int newY = y;
	int newZ = z;

	//The x, y and z coordinates appear to change because of the side
	switch (side) {
	case 0:
		++newY;
		break;
	case 1:
		--newY;
		break;
	case 2:
		++newZ;
		break;
	case 3:
		--newZ;
		break;
	case 4:
		++newX;
		break;
	case 5:
		--newX;
		break;
	}

	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(newX, newY, newZ);
	if (tileEntity == null) return false;
	return tileEntity.getTextureBlock().shouldSideBeRendered(blockAccess, x, y, z, side);
}

@Override
public Icon getBlockTexture(IBlockAccess blockAccess, int x, int y, int z, int side) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().getBlockTexture(blockAccess, x, y, z, side);
}

@Override
public boolean isBlockSolid(IBlockAccess blockAccess, int x, int y, int z, int side) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().isBlockSolid(blockAccess, x, y, z, side);
}

@Override
public int colorMultiplier(IBlockAccess blockAccess, int x, int y, int z) {
	System.out.println("colorMultiplier at " + x + ", " + y + ", " + z);
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	return tileEntity.getTextureBlock().colorMultiplier(blockAccess, x, y, z);
}

@Override
public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	tileEntity.getTextureBlock().setBlockBoundsBasedOnState(blockAccess, x, y, z);
}

@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getCollisionBoundingBoxFromPool(world, x, y, z);
}

@Override
public int getLightOpacity(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getLightOpacity(world, x, y, z);
}

@Override
 public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getSelectedBoundingBoxFromPool(world, x, y, z);
}

@Override
public boolean isBlockNormalCube(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.isBlockNormalCube(world, x, y, z);
}

@Override
public boolean isBlockSolidOnSide(World world, int x, int y, int z, ForgeDirection side) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.isBlockSolidOnSide(world, x, y, z, side);
}

//I am not sure about this one, though it fixes the rendering of ice, and doesn't appear to cause problems with anything that already worked.
@Override
public int getRenderBlockPass() {
	return 1;
}

Link to comment
Share on other sites

How about these methods:

@Override
public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
	TileEntityCamouflaged tileEntity = (TileEntityCamouflaged)blockAccess.getBlockTileEntity(x, y, z);
	tileEntity.getTextureBlock().setBlockBoundsBasedOnState(blockAccess, x, y, z);
}

@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
	Block block = ((TileEntityCamouflaged)world.getBlockTileEntity(x, y, z)).getTextureBlock();
	return block.getCollisionBoundingBoxFromPool(world, x, y, z);
}

If you guys dont get it.. then well ya.. try harder...

Link to comment
Share on other sites

renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);

This is the problem. Check what this method does.

 

It gets the render type of the block passed in, and then goes on to add vertexes to the tessellator instance based on the block passed in as the first parameter. It does call the right method (e.g. if I pass in a cobweb, then it calls the renderCrossedSquares function), and the methods are being called to add coordinates to the tessellator. I'm still not sure what I'm doing wrong.

Link to comment
Share on other sites

Thank you! That was a stupid oversight on my part. I've got it working now.

 

That wasn't the only step to fixing this, so just in case anyone in the future is having trouble doing a similar thing, my rendering code now looks like this:

 

        @Override
public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) {
	TileEntityCamouflaged te = (TileEntityCamouflaged)tileEntity;
	Block block = te.getTextureBlock();

	Minecraft.getMinecraft().renderEngine.func_110577_a(TextureMap.field_110575_b);

	//Disable standard lighting. This is done the same as in TileEntityRendererPiston.
	RenderHelper.disableStandardItemLighting();
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                GL11.glEnable(GL11.GL_BLEND);
                //GL11.glDisable(GL11.GL_CULL_FACE); This was initially part of the code that was taken from the piston, but it was causing some of the rendering to look of, e.g. with a cobweb (it would look thicker as both sides were rendering due to this being disabled).

        if (Minecraft.isAmbientOcclusionEnabled())
        {
            GL11.glShadeModel(GL11.GL_SMOOTH);
        }
        else
        {
            GL11.glShadeModel(GL11.GL_FLAT);
        }
	GL11.glPushMatrix();
	GL11.glTranslated(d0, d1, d2);
	Tessellator tessellator = Tessellator.instance;
	tessellator.startDrawingQuads();
	RenderBlocks renderBlocks = new RenderBlocks(tileEntity.worldObj);

                //To get the block to render in the right place, I had to pass in 0, 0, 0 as the coordinates for renderBlockByRenderType. This however means that it will use the properties of the block at 0, 0, 0 for some things. This translation allows for the actual block coordinates to be passed in.
	tessellator.setTranslation(-te.xCoord, -te.yCoord, -te.zCoord);
	renderBlocks.renderBlockByRenderType(block, te.xCoord, te.yCoord, te.zCoord);
	tessellator.draw();
	tessellator.setTranslation(0, 0, 0);
	GL11.glPopMatrix();

	//Reset to standard lighting
	RenderHelper.enableStandardItemLighting();
}

Link to comment
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.
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

    • Compare this list (client-side-only mods) with your mods: https://www.dropbox.com/scl/fi/yeldxfv8ed60e4uflc2fi/Client-Side-Only-Modlist.xlsx?rlkey=8376c5bk7b33je2tad4p3ybrg&st=qf6osvit&dl=0  
    • Crashlog: https://paste.ee/p/WrGYD I'm thinking the problem might be a client side mod but ive already checked the mod list like 5 times and still cant find the problem
    • I'm unable to join my local forge servers. When running my forge servers of seemingly any version (tested 1.18 to 1.21.1) I get an error message [Forge Version Check/WARN] [ne.mi.fm.VersionChecker/]: Failed to process update information The server continues to start up and run, however I'm unable to join. Looking for solutions? Full error message: (note last "thead warning" error seems to be unrelated and only happened once for 1.20.1) Forge version check warning has happened for every version. [09:52:31] [Forge Version Check/WARN] [ne.mi.fm.VersionChecker/]: Failed to process update information java.net.http.HttpConnectTimeoutException: HTTP connect timed out         at jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:950) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133) ~[java.net.http:?] {}         at net.minecraftforge.fml.VersionChecker$1.openUrlString(VersionChecker.java:142) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {}         at net.minecraftforge.fml.VersionChecker$1.process(VersionChecker.java:180) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {}         at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] {}         at net.minecraftforge.fml.VersionChecker$1.run(VersionChecker.java:117) ~[fmlcore-1.20.1-47.3.10.jar%23102!/:?] {} Caused by: java.net.http.HttpConnectTimeoutException: HTTP connect timed out         at jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:68) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl.purgeTimeoutsAndReturnNextDeadline(HttpClientImpl.java:1788) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1385) ~[java.net.http:?] {} Caused by: java.net.ConnectException: HTTP connect timed out         at jdk.internal.net.http.ResponseTimerEvent.handle(ResponseTimerEvent.java:69) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl.purgeTimeoutsAndReturnNextDeadline(HttpClientImpl.java:1788) ~[java.net.http:?] {}         at jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1385) ~[java.net.http:?] {} [09:52:31] [Yggdrasil Key Fetcher/ERROR] [mojang/YggdrasilServicesKeyInfo]: Failed to request yggdrasil public key com.mojang.authlib.exceptions.AuthenticationUnavailableException: Cannot contact authentication server         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:119) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:91) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo.fetch(YggdrasilServicesKeyInfo.java:94) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo.lambda$get$1(YggdrasilServicesKeyInfo.java:81) ~[authlib-4.0.43.jar%2375!/:?] {}         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[?:?] {}         at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[?:?] {}         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?] {}         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?] {}         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?] {}         at java.lang.Thread.run(Thread.java:1575) ~[?:?] {} Caused by: java.net.SocketTimeoutException: Connect timed out         at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546) ~[?:?] {}         at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:592) ~[?:?] {}         at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?] {}         at java.net.Socket.connect(Socket.java:760) ~[?:?] {}         at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) ~[?:?] {}         at sun.net.NetworkClient.doConnect(NetworkClient.java:178) ~[?:?] {}         at sun.net.www.http.HttpClient.openServer(HttpClient.java:531) ~[?:?] {}         at sun.net.www.http.HttpClient.openServer(HttpClient.java:636) ~[?:?] {}         at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) ~[?:?] {}         at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:377) ~[?:?] {}         at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1273) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1114) ~[?:?] {}         at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1676) ~[?:?] {}         at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1600) ~[?:?] {}         at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:223) ~[?:?] {}         at com.mojang.authlib.HttpAuthenticationService.performGetRequest(HttpAuthenticationService.java:140) ~[authlib-4.0.43.jar%2375!/:?] {}         at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:96) ~[authlib-4.0.43.jar%2375!/:?] {}         ... 9 more [09:52:31] [Server thread/WARN] [minecraft/MinecraftServer]: Can't keep up! Is the server overloaded? Running 5985ms or 119 ticks behind
    • Remove the mod tempad from the mods-folder
    • Hi, deleting the config folder did not appear to work, what mod are you referring to I could try to delete to fix the problem?
  • Topics

×
×
  • Create New...

Important Information

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