From 7584d006813a3ef37911c99f2487c63f1577395f Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Wed, 14 Sep 2016 00:50:02 +0200 Subject: [PATCH] Added crafting monitor item TESR (refactored out item rendering of that kind into a shared class). Fixes server startup issues due to sidedness. --- .../block/networking/BlockCableBus.java | 14 +- .../appeng/block/storage/ChestRendering.java | 4 + src/main/java/appeng/client/ClientHelper.java | 26 ---- .../client/render/TesrRenderHelper.java | 125 ++++++++++++++++++ .../crafting/CraftingCubeRendering.java | 9 ++ .../render/crafting/CraftingMonitorTESR.java | 47 +++++++ src/main/java/appeng/core/CommonHelper.java | 3 - .../core/api/definitions/ApiBlocks.java | 8 +- .../items/parts/ItemMultipartRendering.java | 3 + .../parts/reporting/AbstractPartMonitor.java | 61 +-------- src/main/java/appeng/server/ServerHelper.java | 7 - .../crafting/TileCraftingMonitorTile.java | 4 +- 12 files changed, 210 insertions(+), 101 deletions(-) create mode 100644 src/main/java/appeng/client/render/TesrRenderHelper.java create mode 100644 src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java diff --git a/src/main/java/appeng/block/networking/BlockCableBus.java b/src/main/java/appeng/block/networking/BlockCableBus.java index f1e4ab56..7c5fd2fe 100644 --- a/src/main/java/appeng/block/networking/BlockCableBus.java +++ b/src/main/java/appeng/block/networking/BlockCableBus.java @@ -52,6 +52,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.property.ExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IUnlistedProperty; +import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -74,6 +75,7 @@ import appeng.integration.abstraction.IFMP; import appeng.parts.ICableBusContainer; import appeng.parts.NullCableBusContainer; import appeng.tile.AEBaseTile; +import appeng.tile.networking.CableBusTESR; import appeng.tile.networking.TileCableBus; import appeng.tile.networking.TileCableBusTESR; import appeng.util.Platform; @@ -285,6 +287,7 @@ public class BlockCableBus extends AEBaseTileBlock } @Override + @SideOnly( Side.CLIENT ) public boolean addDestroyEffects( final World world, final BlockPos pos, final ParticleManager effectRenderer ) { ICableBusContainer cb = this.cb( world, pos ); @@ -390,11 +393,17 @@ public class BlockCableBus extends AEBaseTileBlock GameRegistry.registerTileEntity( noTesrTile, "BlockCableBus" ); if( Platform.isClient() ) { - tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class ); - GameRegistry.registerTileEntity( tesrTile, "ClientOnly_TESR_CableBus" ); + setupTesr(); } } + @SideOnly( Side.CLIENT ) + private static void setupTesr() { + tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class ); + GameRegistry.registerTileEntity( tesrTile, "ClientOnly_TESR_CableBus" ); + ClientRegistry.bindTileEntitySpecialRenderer( BlockCableBus.getTesrTile(), new CableBusTESR() ); + } + public static Class getNoTesrTile() { return noTesrTile; @@ -406,6 +415,7 @@ public class BlockCableBus extends AEBaseTileBlock } // Helper to get access to the protected constructor + @SideOnly( Side.CLIENT ) private static class DestroyFX extends ParticleDigging { DestroyFX( World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, IBlockState state ) diff --git a/src/main/java/appeng/block/storage/ChestRendering.java b/src/main/java/appeng/block/storage/ChestRendering.java index 25584722..0abf4376 100644 --- a/src/main/java/appeng/block/storage/ChestRendering.java +++ b/src/main/java/appeng/block/storage/ChestRendering.java @@ -1,6 +1,9 @@ package appeng.block.storage; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + import appeng.api.util.AEColor; import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.IBlockRendering; @@ -13,6 +16,7 @@ public class ChestRendering extends BlockRenderingCustomizer { @Override + @SideOnly( Side.CLIENT ) public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { // I checked, the ME chest doesn't keep its color in item form diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 18df4ab3..c6de0a07 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -27,8 +27,6 @@ import java.util.Random; import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -193,30 +191,6 @@ public class ClientHelper extends ServerHelper return Minecraft.getMinecraft().objectMouseOver; } - @Override - public void doRenderItem( final ItemStack itemstack ) - { - if( itemstack != null ) - { - - GlStateManager.pushMatrix(); - - // The Z-scaling by 0.0001 causes the model to be visually "flattened" - // This cannot replace a proper projection, but it's cheap and gives the desired - // effect at least from head-on - final float scale = 0.8f; - GlStateManager.scale( scale / 32.0f, scale / 32.0f, 0.0001f ); - // Position the item icon at the top middle of the panel - GlStateManager.translate( -8, -11, 0 ); - - RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); - renderItem.renderItemAndEffectIntoGUI(itemstack, 0, 0); - - GlStateManager.popMatrix(); - - } - } - @Override public void postInit() { diff --git a/src/main/java/appeng/client/render/TesrRenderHelper.java b/src/main/java/appeng/client/render/TesrRenderHelper.java new file mode 100644 index 00000000..44767c0e --- /dev/null +++ b/src/main/java/appeng/client/render/TesrRenderHelper.java @@ -0,0 +1,125 @@ +package appeng.client.render; + + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; + +import appeng.api.storage.data.IAEItemStack; +import appeng.util.IWideReadableNumberConverter; +import appeng.util.ReadableNumberConverter; + + +/** + * Helper methods for rendering TESRs. + */ +public class TesrRenderHelper +{ + + private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE; + + /** + * Move the current coordinate system to the center of the given block face, assuming that the origin is currently at the center of a block. + */ + public static void moveToFace( EnumFacing face ) + { + GL11.glTranslated( face.getFrontOffsetX() * 0.50, face.getFrontOffsetY() * 0.50, face.getFrontOffsetZ() * 0.50 ); + } + + /** + * Rotate the current coordinate system so it is on the face of the given block side. This can be used to render on the given face as if it was + * a 2D canvas. + */ + public static void rotateToFace( EnumFacing face, byte spin ) + { + switch( face ) + { + case UP: + GL11.glScalef( 1.0f, -1.0f, 1.0f ); + GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); + GL11.glRotatef( spin * 90.0F, 0, 0, 1 ); + break; + + case DOWN: + GL11.glScalef( 1.0f, -1.0f, 1.0f ); + GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f ); + GL11.glRotatef( spin * -90.0F, 0, 0, 1 ); + break; + + case EAST: + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f ); + break; + + case WEST: + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); + break; + + case NORTH: + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + break; + + case SOUTH: + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f ); + break; + + default: + break; + } + } + + /** + * Render an item in 2D. + */ + public static void renderItem2d( ItemStack itemStack, float scale ) + { + if( itemStack != null ) + { + OpenGlHelper.setLightmapTextureCoords( OpenGlHelper.lightmapTexUnit, 240.f, 240.0f ); + + GlStateManager.pushMatrix(); + + // The Z-scaling by 0.0001 causes the model to be visually "flattened" + // This cannot replace a proper projection, but it's cheap and gives the desired + // effect at least from head-on + GlStateManager.scale( scale / 32.0f, scale / 32.0f, 0.0001f ); + // Position the item icon at the top middle of the panel + GlStateManager.translate( -8, -11, 0 ); + + RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); + renderItem.renderItemAndEffectIntoGUI( itemStack, 0, 0 ); + + GlStateManager.popMatrix(); + } + } + + /** + * Render an item in 2D and the given text below it. + * @param spacing Specifies how far apart the item and the item stack amount are rendered. + */ + public static void renderItem2dWithAmount( IAEItemStack itemStack, float itemScale, float spacing ) { + + TesrRenderHelper.renderItem2d( itemStack.getItemStack(), itemScale ); + + final long stackSize = itemStack.getStackSize(); + final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm( stackSize ); + + // Render the item count + final FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + final int width = fr.getStringWidth( renderedStackSize ); + GL11.glTranslatef( 0.0f, spacing, 0 ); + GL11.glScalef( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f ); + GL11.glTranslatef( -0.5f * width, 0.0f, 0.5f ); + fr.drawString( renderedStackSize, 0, 0, 0 ); + + } + +} diff --git a/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java b/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java index 242ec287..13a0e437 100644 --- a/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java +++ b/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java @@ -8,6 +8,8 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.block.crafting.BlockCraftingUnit; import appeng.bootstrap.BlockRenderingCustomizer; @@ -33,6 +35,7 @@ public class CraftingCubeRendering extends BlockRenderingCustomizer } @Override + @SideOnly( Side.CLIENT ) public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { ResourceLocation baseName = new ResourceLocation( AppEng.MOD_ID, registryName ); @@ -50,6 +53,12 @@ public class CraftingCubeRendering extends BlockRenderingCustomizer rendering.builtInModel( builtInName, new CraftingCubeModel( type ) ); rendering.stateMapper( block -> mapState( block, defaultModel, builtInModelName ) ); + + if( type == BlockCraftingUnit.CraftingUnitType.MONITOR ) + { + rendering.tesr( new CraftingMonitorTESR() ); + } + } private Map mapState( Block block, ModelResourceLocation defaultModel, ModelResourceLocation formedModel ) diff --git a/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java b/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java new file mode 100644 index 00000000..6d00a723 --- /dev/null +++ b/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java @@ -0,0 +1,47 @@ +package appeng.client.render.crafting; + + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.storage.data.IAEItemStack; +import appeng.client.render.TesrRenderHelper; +import appeng.tile.crafting.TileCraftingMonitorTile; + + +/** + * Renders the item currently being crafted + */ +@SideOnly( Side.CLIENT ) +public class CraftingMonitorTESR extends TileEntitySpecialRenderer +{ + + @Override + public void renderTileEntityAt( TileCraftingMonitorTile te, double x, double y, double z, float partialTicks, int destroyStage ) + { + if( te == null ) + { + return; + } + + EnumFacing facing = te.getForward(); + + IAEItemStack jobProgress = te.getJobProgress(); + if( jobProgress != null ) + { + GlStateManager.pushMatrix(); + GL11.glTranslated( x + 0.5, y + 0.5, z + 0.5 ); + + TesrRenderHelper.moveToFace( facing ); + TesrRenderHelper.rotateToFace( facing, (byte) 0 ); + TesrRenderHelper.renderItem2dWithAmount( jobProgress, 0.7f, 0.1f ); + + GlStateManager.popMatrix(); + } + } +} diff --git a/src/main/java/appeng/core/CommonHelper.java b/src/main/java/appeng/core/CommonHelper.java index a7687e37..c22533ae 100644 --- a/src/main/java/appeng/core/CommonHelper.java +++ b/src/main/java/appeng/core/CommonHelper.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Random; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -59,8 +58,6 @@ public abstract class CommonHelper public abstract RayTraceResult getRTR(); - public abstract void doRenderItem( ItemStack itemstack ); - public abstract void postInit(); public abstract CableRenderMode getRenderMode(); diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index 20fd2b32..b284fca3 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -23,7 +23,6 @@ import net.minecraft.block.BlockDispenser; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.oredict.OreDictionary; @@ -104,8 +103,6 @@ import appeng.decorative.solid.BlockSkyStone; import appeng.decorative.solid.BlockSkyStone.SkystoneType; import appeng.decorative.stair.BlockStairCommon; import appeng.hooks.DispenserBehaviorTinyTNT; -import appeng.tile.networking.CableBusTESR; -import appeng.util.Platform; /** @@ -261,6 +258,7 @@ public final class ApiBlocks implements IBlocks .rendering( new BlockRenderingCustomizer() { @Override + @SideOnly( Side.CLIENT ) public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { rendering.tesr( BlockCharger.createTesr() ); @@ -373,10 +371,6 @@ public final class ApiBlocks implements IBlocks .rendering( new CableBusRendering( partModels ) ) .postInit( (block, item) -> { ( (BlockCableBus) block ).setupTile(); - if( Platform.isClient() ) - { - ClientRegistry.bindTileEntitySpecialRenderer( BlockCableBus.getTesrTile(), new CableBusTESR() ); - } } ) .build(); diff --git a/src/main/java/appeng/items/parts/ItemMultipartRendering.java b/src/main/java/appeng/items/parts/ItemMultipartRendering.java index bf92947a..5eef92be 100644 --- a/src/main/java/appeng/items/parts/ItemMultipartRendering.java +++ b/src/main/java/appeng/items/parts/ItemMultipartRendering.java @@ -9,6 +9,8 @@ import java.util.stream.Collectors; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.AEColor; import appeng.bootstrap.IItemRendering; @@ -34,6 +36,7 @@ public class ItemMultipartRendering extends ItemRenderingCustomizer } @Override + @SideOnly( Side.CLIENT ) public void customize( IItemRendering rendering ) { diff --git a/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java b/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java index 8b69676f..40023183 100644 --- a/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java +++ b/src/main/java/appeng/parts/reporting/AbstractPartMonitor.java @@ -26,13 +26,12 @@ import org.lwjgl.opengl.GL11; import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.RayTraceResult; @@ -49,8 +48,7 @@ import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; -import appeng.api.util.AEPartLocation; -import appeng.client.ClientHelper; +import appeng.client.render.TesrRenderHelper; import appeng.core.localization.PlayerMessages; import appeng.helpers.Reflected; import appeng.me.GridAccessException; @@ -256,58 +254,11 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements GlStateManager.pushMatrix(); GL11.glTranslated( x + 0.5, y + 0.5, z + 0.5 ); - final AEPartLocation d = this.getSide(); - GL11.glTranslated( d.xOffset * 0.50, d.yOffset * 0.50, d.zOffset * 0.50 ); + EnumFacing facing = this.getSide().getFacing(); - switch( d ) - { - case UP: - GL11.glScalef( 1.0f, -1.0f, 1.0f ); - GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); - GL11.glRotatef( this.getSpin() * 90.0F, 0, 0, 1 ); - break; - - case DOWN: - GL11.glScalef( 1.0f, -1.0f, 1.0f ); - GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f ); - GL11.glRotatef( this.getSpin() * -90.0F, 0, 0, 1 ); - break; - - case EAST: - GL11.glScalef( -1.0f, -1.0f, -1.0f ); - GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f ); - break; - - case WEST: - GL11.glScalef( -1.0f, -1.0f, -1.0f ); - GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); - break; - - case NORTH: - GL11.glScalef( -1.0f, -1.0f, -1.0f ); - break; - - case SOUTH: - GL11.glScalef( -1.0f, -1.0f, -1.0f ); - GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f ); - break; - - default: - break; - } - - ClientHelper.proxy.doRenderItem( ais.getItemStack() ); - - final long stackSize = ais.getStackSize(); - final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm( stackSize ); - - // Render the item count - final FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - final int width = fr.getStringWidth( renderedStackSize ); - GL11.glTranslatef( 0.0f, 0.17f, 0 ); - GL11.glScalef( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f ); - GL11.glTranslatef( -0.5f * width, 0.0f, 0.5f ); - fr.drawString( renderedStackSize, 0, 0, 0 ); + TesrRenderHelper.moveToFace( facing ); + TesrRenderHelper.rotateToFace( facing, getSpin() ); + TesrRenderHelper.renderItem2dWithAmount( ais, 0.8f, 0.17f ); GlStateManager.popMatrix(); diff --git a/src/main/java/appeng/server/ServerHelper.java b/src/main/java/appeng/server/ServerHelper.java index 55ee2c62..3a1f1851 100644 --- a/src/main/java/appeng/server/ServerHelper.java +++ b/src/main/java/appeng/server/ServerHelper.java @@ -30,7 +30,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -134,12 +133,6 @@ public class ServerHelper extends CommonHelper return null; } - @Override - public void doRenderItem( final ItemStack sis ) - { - - } - @Override public void postInit() { diff --git a/src/main/java/appeng/tile/crafting/TileCraftingMonitorTile.java b/src/main/java/appeng/tile/crafting/TileCraftingMonitorTile.java index 93da0e25..172cf8d3 100644 --- a/src/main/java/appeng/tile/crafting/TileCraftingMonitorTile.java +++ b/src/main/java/appeng/tile/crafting/TileCraftingMonitorTile.java @@ -24,6 +24,8 @@ import java.io.IOException; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.fml.relauncher.Side; @@ -132,7 +134,7 @@ public class TileCraftingMonitorTile extends TileCraftingTile implements IColora public IAEItemStack getJobProgress() { - return this.dspPlay;// AEItemStack.create( new ItemStack( Items.diamond, 64 ) ); + return AEItemStack.create( new ItemStack( Items.DIAMOND, 64 ) ); // this.dspPlay;// } @Override