diff options
Diffstat (limited to 'src/main/java/gregtech/common')
4 files changed, 262 insertions, 39 deletions
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java index e4f3051b02..e56697fae0 100644 --- a/src/main/java/gregtech/common/GT_Proxy.java +++ b/src/main/java/gregtech/common/GT_Proxy.java @@ -1,6 +1,10 @@ package gregtech.common; -import cpw.mods.fml.common.*; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.ProgressManager; import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -11,8 +15,16 @@ import cpw.mods.fml.common.registry.GameRegistry; import forestry.api.genetics.AlleleManager; import gregtech.GT_Mod; import gregtech.api.GregTech_API; -import gregtech.api.enums.*; +import gregtech.api.enums.ConfigCategories; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OreDictNames; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.SubTag; import gregtech.api.enums.TC_Aspects.TC_AspectStack; +import gregtech.api.enums.ToolDictNames; import gregtech.api.interfaces.IBlockOnWalkOver; import gregtech.api.interfaces.IProjectileItem; import gregtech.api.interfaces.internal.IGT_Mod; @@ -21,8 +33,27 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.items.GT_MetaGenerated_Item; import gregtech.api.items.GT_MetaGenerated_Tool; -import gregtech.api.objects.*; -import gregtech.api.util.*; +import gregtech.api.objects.GT_ChunkManager; +import gregtech.api.objects.GT_Fluid; +import gregtech.api.objects.GT_FluidStack; +import gregtech.api.objects.GT_ItemStack; +import gregtech.api.objects.GT_UO_DimensionList; +import gregtech.api.objects.ItemData; +import gregtech.api.util.GT_BlockMap; +import gregtech.api.util.GT_CLS_Compat; +import gregtech.api.util.GT_ChunkAssociatedData; +import gregtech.api.util.GT_ClientPreference; +import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GT_Log; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_RecipeRegistrator; +import gregtech.api.util.GT_Shaped_Recipe; +import gregtech.api.util.GT_Shapeless_Recipe; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.WorldSpawnedEventBuilder; import gregtech.common.entities.GT_Entity_Arrow; import gregtech.common.gui.GT_ContainerVolumetricFlask; import gregtech.common.gui.GT_GUIContainerVolumetricFlask; @@ -54,16 +85,22 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraft.world.WorldSettings.GameType; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.player.*; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import net.minecraftforge.event.entity.player.ArrowNockEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.terraingen.OreGenEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; @@ -77,13 +114,33 @@ import org.apache.commons.lang3.text.WordUtils; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.ConcurrentModificationException; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; -import static gregtech.api.enums.GT_Values.*; +import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.MOD_ID_RC; +import static gregtech.api.enums.GT_Values.MOD_ID_TC; +import static gregtech.api.enums.GT_Values.MOD_ID_TE; +import static gregtech.api.enums.GT_Values.MOD_ID_TF; +import static gregtech.api.enums.GT_Values.W; +import static gregtech.api.enums.GT_Values.debugEntityCramming; +import static gregtech.api.util.GT_Util.LAST_BROKEN_TILEENTITY; public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { @@ -1435,6 +1492,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { } } + @SuppressWarnings("deprecated") public static void stepMaterialsVanilla(Collection<GT_Proxy.OreDictEventContainer> mEvents, ProgressManager.ProgressBar progressBar){ int size = 5; int sizeStep = mEvents.size() / 20 - 1; @@ -1443,7 +1501,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { tEvent = i$.next(); sizeStep--; if(sizeStep == 0) { - GT_Mod.GT_FML_LOGGER.info("Baking : " + size + "%", new Object[0]); + GT_FML_LOGGER.info("Baking : " + size + "%", new Object[0]); sizeStep = mEvents.size()/20-1; size += 5; } @@ -1476,9 +1534,14 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { if (aEvent.side.isServer()) { if (aEvent.phase == TickEvent.Phase.START) { TICK_LOCK.lock(); + } else { TICK_LOCK.unlock(); } + + // Making sure it is being freed up in order to prevent exploits or Garbage Collection mishaps. + LAST_BROKEN_TILEENTITY.set(null); + } } @@ -1491,7 +1554,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { for (Runnable runnable : GregTech_API.sFirstWorldTick) runnable.run(); isFirstWorldTick = false; - worldTickHappened = true; + GT_Values.worldTickHappened = true; } if (aEvent.side.isServer()) { if (this.mUniverse == null) { @@ -2084,7 +2147,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler { try { GT_CLS_Compat.stepMaterialsCLS(mEvents, progressBar); } catch (IllegalAccessException | InvocationTargetException e) { - GT_Mod.GT_FML_LOGGER.catching(e); + GT_FML_LOGGER.catching(e); } } else diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java index e09130acb4..ef8748064f 100644 --- a/src/main/java/gregtech/common/render/GT_Renderer_Block.java +++ b/src/main/java/gregtech/common/render/GT_Renderer_Block.java @@ -21,12 +21,20 @@ import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityDiggingFX; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; +import java.util.Arrays; +import java.util.Collections; + +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; +import static gregtech.api.enums.GT_Values.OFFX; +import static gregtech.api.enums.GT_Values.OFFY; +import static gregtech.api.enums.GT_Values.OFFZ; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH; @@ -60,7 +68,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { } public static boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); if ((tTileEntity instanceof IPipeRenderedTileEntity)) { return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, new ITexture[][]{ ((IPipeRenderedTileEntity) tTileEntity).getTextureCovered((byte) DOWN.ordinal()), @@ -77,7 +85,8 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) NORTH.ordinal()), ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) SOUTH.ordinal()), ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) WEST.ordinal()), - ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) EAST.ordinal())}); + ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) EAST.ordinal())} + ); } return false; } @@ -454,7 +463,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { return true; } - + @SideOnly(Side.CLIENT) public static void addHitEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z, int side) { double rX = x + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; @@ -481,9 +490,9 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { for (int iX = 0; iX < 4; ++iX) { for (int iY = 0; iY < 4; ++iY) { for (int iZ = 0; iZ < 4; ++iZ) { - double bX = x + (iX + 0.5) / 4.0; - double bY = y + (iY + 0.5) / 4.0; - double bZ = z + (iZ + 0.5) / 4.0; + final double bX = x + (iX + 0.5) / 4.0; + final double bY = y + (iY + 0.5) / 4.0; + final double bZ = z + (iZ + 0.5) / 4.0; effectRenderer.addEffect((new EntityDiggingFX(world, bX, bY, bZ, bX - x - 0.5, bY - y - 0.5, bZ - z - 0.5, block, block.getDamageValue(world, x, y, z))).applyColourMultiplier(x, y, z)); } } @@ -497,28 +506,58 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + if(aBlock instanceof IRenderedBlock) { + boolean tNeedsToSetBounds = true; + final ItemStack aStack = new ItemStack(aBlock, 1, aMeta); + IRenderedBlock tRenderer = ((IRenderedBlock)aBlock).passRenderingToObject(aStack); + if (tRenderer != null) tRenderer = tRenderer.passRenderingToObject(aStack); + if (tRenderer == null) + tRenderer = IRenderedBlock.ErrorRenderer.INSTANCE; + for (int i = 0, j = tRenderer.getRenderPasses(aBlock); i < j; i++) { + if (tRenderer.usesRenderPass(i)) { + if (tRenderer.setBlockBounds(aBlock, i)) { + tNeedsToSetBounds = true; + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + if (tNeedsToSetBounds) aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + tNeedsToSetBounds = false; + } + + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) DOWN.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) UP.ordinal(), true, i), !tNeedsToSetBounds); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) NORTH.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) SOUTH.ordinal(), true, i), !tNeedsToSetBounds); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) WEST.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) EAST.ordinal(), true, i), !tNeedsToSetBounds); + } + } + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); - if (aBlock instanceof GT_Block_Ores_Abstract) { - GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores(); - tTileEntity.mMetaData = ((short) aMeta); + } else { + if (aBlock instanceof GT_Block_Ores_Abstract) { + final GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores(); + tTileEntity.mMetaData = ((short) aMeta); - aBlock.setBlockBoundsForItemRender(); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) DOWN.ordinal()), true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) UP.ordinal()), true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) NORTH.ordinal()), true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) SOUTH.ordinal()), true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) WEST.ordinal()), true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) EAST.ordinal()), true); - - } else if (aMeta > 0 + aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) DOWN.ordinal()), true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) UP.ordinal()), true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) NORTH.ordinal()), true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) SOUTH.ordinal()), true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) WEST.ordinal()), true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) EAST.ordinal()), true); + } else if (aMeta > 0 && (aMeta < GregTech_API.METATILEENTITIES.length) && aBlock instanceof GT_Block_Machines && (GregTech_API.METATILEENTITIES[aMeta] != null) - && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) { - renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); + && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) + { + renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); + } + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); } - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); GL11.glTranslatef(0.5F, 0.5F, 0.5F); @@ -529,7 +568,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { if ((aMeta <= 0) || (aMeta >= GregTech_API.METATILEENTITIES.length)) { return; } - IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta]; + final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta]; if (tMetaTileEntity == null) { return; } @@ -643,18 +682,55 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID, RenderBlocks aRenderer) { aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion; aRenderer.useInventoryTint = false; - TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (aBlock instanceof IRenderedBlock) { + IRenderedBlock tRenderer = ((IRenderedBlock)aBlock).passRenderingToObject(aWorld, aX, aY, aZ); + if (tRenderer != null) tRenderer = tRenderer.passRenderingToObject(aWorld, aX, aY, aZ); + if (tRenderer == null) tRenderer = IRenderedBlock.ErrorRenderer.INSTANCE; + boolean tNeedsToSetBounds = true; + boolean rReturn = false; + if (tRenderer.renderBlock(aBlock, aRenderer, aWorld, aX, aY, aZ)) { + rReturn = true; + } else { + final boolean[] tSides = new boolean[6]; + if (tRenderer instanceof IRenderedBlockSideCheck) { + for (byte tSide : ALL_VALID_SIDES) rReturn |= (tSides[tSide] = ((IRenderedBlockSideCheck)tRenderer).renderFullBlockSide(aBlock, aRenderer, tSide)); + } else { + for (byte tSide : ALL_VALID_SIDES) rReturn |= (tSides[tSide] = aBlock.shouldSideBeRendered(aWorld, aX+OFFX[tSide], aY+OFFY[tSide], aZ+OFFZ[tSide], tSide)); + } + for (int i = 0, j = tRenderer.getRenderPasses(aBlock); i < j; i++) { + if (tRenderer.usesRenderPass(i)) { + if (tRenderer.setBlockBounds(aBlock, i)) { + tNeedsToSetBounds = true; + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); + aRenderer.setRenderBoundsFromBlock(aBlock); + tNeedsToSetBounds = false; + } + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) DOWN.ordinal(), i, tSides), tSides[DOWN.ordinal()]); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) UP.ordinal(), i, tSides), tSides[UP.ordinal()]); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) NORTH.ordinal(), i, tSides), tSides[NORTH.ordinal()]); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) SOUTH.ordinal(), i, tSides), tSides[SOUTH.ordinal()]); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) WEST.ordinal(), i, tSides), tSides[WEST.ordinal()]); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) EAST.ordinal(), i, tSides), tSides[EAST.ordinal()]); + } + } + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); + } + + return rReturn; + } + + final TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); if (tileEntity == null) return false; if (tileEntity instanceof IGregTechTileEntity) { - IMetaTileEntity metaTileEntity; - if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null && - metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + final IMetaTileEntity metaTileEntity; + if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { aRenderer.enableAO = false; return true; } } - if (tileEntity instanceof IPipeRenderedTileEntity && - renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { + if (tileEntity instanceof IPipeRenderedTileEntity && renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { aRenderer.enableAO = false; return true; } diff --git a/src/main/java/gregtech/common/render/IRenderedBlock.java b/src/main/java/gregtech/common/render/IRenderedBlock.java new file mode 100644 index 0000000000..6d2ba999d5 --- /dev/null +++ b/src/main/java/gregtech/common/render/IRenderedBlock.java @@ -0,0 +1,72 @@ +package gregtech.common.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; + +public interface IRenderedBlock { + /** @return the Textures to be rendered */ + @SideOnly(Side.CLIENT) + ITexture[] getTexture(Block aBlock, byte aSide, int aRenderPass, boolean[] aShouldSideBeRendered); + + @SideOnly(Side.CLIENT) + ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass); + + /** gets the Amount of Render Passes for this TileEntity or similar Handler. Only gets called once per Rendering. */ + @SideOnly(Side.CLIENT) + int getRenderPasses(Block aBlock); + + /** if this uses said Render Pass or if it can be skipped entirely. */ + @SideOnly(Side.CLIENT) + boolean usesRenderPass(int aRenderPass); + + /** sets the Block Size rendered; return false for letting it select the normal Block Bounds. */ + @SideOnly(Side.CLIENT) + boolean setBlockBounds(Block aBlock, int aRenderPass); + + /** returning true stops all the other Rendering from happening. */ + @SideOnly(Side.CLIENT) + default boolean renderItem(Block aBlock, RenderBlocks aRenderer) { return false; } + + /** returning true stops all the other Rendering from happening. */ + @SideOnly(Side.CLIENT) + default boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) { return false; } + + /** if this Block lets the TileEntity or a similar Handler do all the Inventory Render work. */ + @SideOnly(Side.CLIENT) + IRenderedBlock passRenderingToObject(ItemStack aStack); + + /** if this Block lets the TileEntity or a similar Handler do all the World Render work. */ + @SideOnly(Side.CLIENT) + IRenderedBlock passRenderingToObject(IBlockAccess aWorld, int aX, int aY, int aZ); + + class ErrorRenderer implements IRenderedBlockSideCheck, IRenderedBlock { + public static final ErrorRenderer INSTANCE = new ErrorRenderer(); + public ITexture[] mErrorTexture = Textures.BlockIcons.ERROR_RENDERING; + @Override public ITexture[] getTexture(Block aBlock, byte aSide, int aRenderPass, boolean[] aShouldSideBeRendered) {return mErrorTexture;} + @Override public ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass) {return mErrorTexture;} + @Override public int getRenderPasses(Block aBlock) {return 1;} + @Override public boolean usesRenderPass(int aRenderPass) {return true;} + @Override public boolean setBlockBounds(Block aBlock, int aRenderPass) {aBlock.setBlockBounds(-0.25F, -0.25F, -0.25F, 1.25F, 1.25F, 1.25F); return true;} + @Override public boolean renderFullBlockSide(Block aBlock, RenderBlocks aRenderer, byte aSide) {return true;} + @Override public IRenderedBlock passRenderingToObject(ItemStack aStack) {return this;} + @Override public IRenderedBlock passRenderingToObject(IBlockAccess aWorld, int aX, int aY, int aZ) {return this;} + + @Override + public boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) { + aBlock.setBlockBounds(-0.25F, -0.25F, -0.25F, 1.25F, 1.25F, 1.25F); + GT_Renderer_Block.renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GT_Renderer_Block.renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GT_Renderer_Block.renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GT_Renderer_Block.renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GT_Renderer_Block.renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + GT_Renderer_Block.renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false); + return true; + } + } +} diff --git a/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java b/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java new file mode 100644 index 0000000000..ef0c469f04 --- /dev/null +++ b/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java @@ -0,0 +1,12 @@ +package gregtech.common.render; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; + +public interface IRenderedBlockSideCheck { + /** returning false stops all the other Rendering from happening on that Side. */ + @SideOnly(Side.CLIENT) + boolean renderFullBlockSide(Block aBlock, RenderBlocks aRenderer, byte aSide); +} |