From 0cbc685d3c29bc9d3e1898dd678da71f925eb538 Mon Sep 17 00:00:00 2001 From: Chicken-Bones Date: Fri, 26 Dec 2014 15:39:12 +1000 Subject: [PATCH] Allow blocks to render in multiple layers --- .../net/minecraft/block/Block.java.patch | 11 ++++++++++- .../renderer/chunk/RenderChunk.java.patch | 19 +++++++++++++++++++ .../client/ForgeHooksClient.java | 7 +++++++ .../client/MinecraftForgeClient.java | 6 ++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/patches/minecraft/net/minecraft/block/Block.java.patch b/patches/minecraft/net/minecraft/block/Block.java.patch index a946cbdbb..7a24cd02e 100644 --- a/patches/minecraft/net/minecraft/block/Block.java.patch +++ b/patches/minecraft/net/minecraft/block/Block.java.patch @@ -161,7 +161,7 @@ } protected ItemStack func_180643_i(IBlockState p_180643_1_) -@@ -971,6 +989,1019 @@ +@@ -971,6 +989,1028 @@ return Block.EnumOffsetType.NONE; } @@ -1153,6 +1153,15 @@ + return func_176221_a(state, world, pos); + } + ++ /** ++ * Queries if this block should render in a given layer. ++ * ISmartBlockModel can use MinecraftForgeClient.getRenderLayer to alter their model based on layer ++ */ ++ public boolean canRenderInLayer(EnumWorldBlockLayer layer) ++ { ++ return func_180664_k() == layer; ++ } ++ + // For Internal use only to capture droped items inside getDrops + protected static ThreadLocal captureDrops = new ThreadLocal() + { diff --git a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch index d223b064c..6b332673f 100644 --- a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch @@ -9,3 +9,22 @@ { TileEntity tileentity = regionrendercache.func_175625_s(new BlockPos(mutableblockpos)); +@@ -160,7 +160,9 @@ + } + } + +- EnumWorldBlockLayer enumworldblocklayer1 = block.func_180664_k(); ++ for(EnumWorldBlockLayer enumworldblocklayer1 : EnumWorldBlockLayer.values()) { ++ if(!block.canRenderInLayer(enumworldblocklayer1)) continue; ++ net.minecraftforge.client.ForgeHooksClient.setRenderLayer(enumworldblocklayer1); + int i = enumworldblocklayer1.ordinal(); + + if (block.func_149645_b() != -1) +@@ -178,6 +180,7 @@ + compiledchunk.func_178486_a(enumworldblocklayer1); + } + } ++ } + } + + EnumWorldBlockLayer[] aenumworldblocklayer = EnumWorldBlockLayer.values(); diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index d0126b678..521ef8a4c 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -26,6 +26,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.EnumWorldBlockLayer; import net.minecraft.util.IRegistry; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; @@ -272,6 +273,12 @@ public class ForgeHooksClient renderPass = pass; } + static EnumWorldBlockLayer renderLayer = EnumWorldBlockLayer.SOLID; + public static void setRenderLayer(EnumWorldBlockLayer layer) + { + renderLayer = layer; + } + public static ModelBase getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int slotID, ModelBase _default) { ModelBase modelbase = itemStack.getItem().getArmorModel(entityLiving, itemStack, slotID); diff --git a/src/main/java/net/minecraftforge/client/MinecraftForgeClient.java b/src/main/java/net/minecraftforge/client/MinecraftForgeClient.java index 2c31fefc0..39afb269d 100644 --- a/src/main/java/net/minecraftforge/client/MinecraftForgeClient.java +++ b/src/main/java/net/minecraftforge/client/MinecraftForgeClient.java @@ -12,6 +12,7 @@ import com.google.common.collect.Maps; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumWorldBlockLayer; import net.minecraftforge.client.IItemRenderer.ItemRenderType; public class MinecraftForgeClient @@ -46,6 +47,11 @@ public class MinecraftForgeClient return ForgeHooksClient.renderPass; } + public static EnumWorldBlockLayer getRenderLayer() + { + return ForgeHooksClient.renderLayer; + } + private static BitSet stencilBits = new BitSet(8); static {