From 75f09adba223a0e221c52a7d77f10cbf62e4312d Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Mon, 16 Jun 2014 01:50:40 +0200 Subject: [PATCH] Seismic Vibrator model --- .../java/mekanism/client/ClientProxy.java | 2 + .../client/model/ModelSeismicVibrator.java | 151 ++++++++++++++++++ .../client/nei/ElementBoundHandler.java | 2 - .../render/block/MachineRenderingHandler.java | 10 ++ .../tileentity/RenderSeismicVibrator.java | 63 ++++++++ .../java/mekanism/common/CommonProxy.java | 1 + src/main/java/mekanism/common/Mekanism.java | 2 - .../mekanism/common/block/BlockMachine.java | 2 +- .../tile/TileEntitySeismicVibrator.java | 4 +- .../mekanism/render/SeismicVibrator.png | Bin 0 -> 10340 bytes 10 files changed, 231 insertions(+), 6 deletions(-) create mode 100644 src/main/java/mekanism/client/model/ModelSeismicVibrator.java create mode 100644 src/main/java/mekanism/client/render/tileentity/RenderSeismicVibrator.java create mode 100755 src/main/resources/assets/mekanism/render/SeismicVibrator.png diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 1a6b27941..2c3d712d4 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -73,6 +73,7 @@ import mekanism.client.render.tileentity.RenderMetallurgicInfuser; import mekanism.client.render.tileentity.RenderObsidianTNT; import mekanism.client.render.tileentity.RenderRotaryCondensentrator; import mekanism.client.render.tileentity.RenderSalinationController; +import mekanism.client.render.tileentity.RenderSeismicVibrator; import mekanism.client.render.tileentity.RenderTeleporter; import mekanism.client.sound.Sound; import mekanism.client.sound.SoundHandler; @@ -314,6 +315,7 @@ public class ClientProxy extends CommonProxy ClientRegistry.registerTileEntity(TileEntityChemicalDissolutionChamber.class, "ChemicalDissolutionChamber", new RenderChemicalDissolutionChamber()); ClientRegistry.registerTileEntity(TileEntityChemicalWasher.class, "ChemicalWasher", new RenderChemicalWasher()); ClientRegistry.registerTileEntity(TileEntityChemicalCrystallizer.class, "ChemicalCrystallizer", new RenderChemicalCrystallizer()); + ClientRegistry.registerTileEntity(TileEntitySeismicVibrator.class, "SeismicVibrator", new RenderSeismicVibrator()); ClientRegistry.registerTileEntity(TileEntityPRC.class, "PressurizedReactionChamber", new RenderConfigurableMachine()); } diff --git a/src/main/java/mekanism/client/model/ModelSeismicVibrator.java b/src/main/java/mekanism/client/model/ModelSeismicVibrator.java new file mode 100644 index 000000000..612042609 --- /dev/null +++ b/src/main/java/mekanism/client/model/ModelSeismicVibrator.java @@ -0,0 +1,151 @@ +package mekanism.client.model; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ModelSeismicVibrator extends ModelBase +{ + ModelRenderer Base; + ModelRenderer Tower; + ModelRenderer TowerTop; + ModelRenderer TopPanel; + ModelRenderer Vibrator; + ModelRenderer PoleBR; + ModelRenderer PoleLB; + ModelRenderer PoleFL; + ModelRenderer PoleRF; + ModelRenderer PoleL; + ModelRenderer PoleR; + ModelRenderer Cable; + ModelRenderer ScreenFront; + ModelRenderer Keyboard; + + public ModelSeismicVibrator() + { + textureWidth = 128; + textureHeight = 128; + + Base = new ModelRenderer(this, 0, 0); + Base.addBox(0F, 0F, 0F, 16, 1, 16); + Base.setRotationPoint(-8F, 23F, -8F); + Base.setTextureSize(128, 128); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + Tower = new ModelRenderer(this, 64, 0); + Tower.addBox(0F, 0F, 0F, 4, 11, 4); + Tower.setRotationPoint(-2F, 12F, -2F); + Tower.setTextureSize(128, 128); + Tower.mirror = true; + setRotation(Tower, 0F, 0F, 0F); + TowerTop = new ModelRenderer(this, 80, 0); + TowerTop.addBox(0F, 0F, 0F, 2, 1, 2); + TowerTop.setRotationPoint(-1F, 10F, -1F); + TowerTop.setTextureSize(128, 128); + TowerTop.mirror = true; + setRotation(TowerTop, 0F, 0F, 0F); + TopPanel = new ModelRenderer(this, 0, 17); + TopPanel.addBox(0F, 0F, 0F, 8, 1, 8); + TopPanel.setRotationPoint(-4F, 11F, -4F); + TopPanel.setTextureSize(128, 128); + TopPanel.mirror = true; + setRotation(TopPanel, 0F, 0F, 0F); + Vibrator = new ModelRenderer(this, 32, 17); + Vibrator.addBox(0F, 0F, 0F, 8, 4, 8); + Vibrator.setRotationPoint(-4F, 19F, -4F); + Vibrator.setTextureSize(128, 128); + Vibrator.mirror = true; + setRotation(Vibrator, 0F, 0F, 0F); + PoleBR = new ModelRenderer(this, 0, 26); + PoleBR.addBox(0F, 0F, 0F, 1, 13, 1); + PoleBR.setRotationPoint(-5F, 10F, 4F); + PoleBR.setTextureSize(128, 128); + PoleBR.mirror = true; + setRotation(PoleBR, 0F, 0F, 0F); + PoleLB = new ModelRenderer(this, 0, 26); + PoleLB.addBox(0F, 0F, 0F, 1, 13, 1); + PoleLB.setRotationPoint(4F, 10F, 4F); + PoleLB.setTextureSize(128, 128); + PoleLB.mirror = true; + setRotation(PoleLB, 0F, 0F, 0F); + PoleFL = new ModelRenderer(this, 0, 26); + PoleFL.addBox(0F, 0F, 0F, 1, 13, 1); + PoleFL.setRotationPoint(4F, 10F, -5F); + PoleFL.setTextureSize(128, 128); + PoleFL.mirror = true; + setRotation(PoleFL, 0F, 0F, 0F); + PoleRF = new ModelRenderer(this, 0, 26); + PoleRF.addBox(0F, 0F, 0F, 1, 13, 1); + PoleRF.setRotationPoint(-5F, 10F, -5F); + PoleRF.setTextureSize(128, 128); + PoleRF.mirror = true; + setRotation(PoleRF, 0F, 0F, 0F); + PoleL = new ModelRenderer(this, 4, 26); + PoleL.addBox(0F, 0F, 0F, 1, 1, 8); + PoleL.setRotationPoint(4F, 10F, -4F); + PoleL.setTextureSize(128, 128); + PoleL.mirror = true; + setRotation(PoleL, 0F, 0F, 0F); + PoleR = new ModelRenderer(this, 4, 26); + PoleR.addBox(0F, 0F, 0F, 1, 1, 8); + PoleR.setRotationPoint(-5F, 10F, -4F); + PoleR.setTextureSize(128, 128); + PoleR.mirror = true; + setRotation(PoleR, 0F, 0F, 0F); + Cable = new ModelRenderer(this, 64, 15); + Cable.addBox(0F, 0F, 0F, 6, 2, 6); + Cable.setRotationPoint(-3F, 8F, -3F); + Cable.setTextureSize(128, 128); + Cable.mirror = true; + setRotation(Cable, 0F, 0F, 0F); + ScreenFront = new ModelRenderer(this, 0, 40); + ScreenFront.addBox(0F, 0F, 0F, 8, 6, 1); + ScreenFront.setRotationPoint(-4F, 11F, -6F); + ScreenFront.setTextureSize(128, 128); + ScreenFront.mirror = true; + setRotation(ScreenFront, 0F, 0F, 0F); + Keyboard = new ModelRenderer(this, 0, 47); + Keyboard.addBox(0F, 0F, 0F, 8, 1, 3); + Keyboard.setRotationPoint(-4F, 18F, -8F); + Keyboard.setTextureSize(128, 128); + Keyboard.mirror = true; + setRotation(Keyboard, 0.4363323F, 0F, 0F); + } + + public void render(float size) + { + Base.render(size); + Tower.render(size); + TowerTop.render(size); + TopPanel.render(size); + Vibrator.render(size); + PoleBR.render(size); + PoleLB.render(size); + PoleFL.render(size); + PoleRF.render(size); + PoleL.render(size); + PoleR.render(size); + Cable.render(size); + ScreenFront.render(size); + + GL11.glScalef(1.01F, 1.01F, 1.01F); + Keyboard.render(size); + } + + public void renderWithPiston(float piston, float size) + { + Vibrator.rotationPointY = 19 - (piston*7); + render(size); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/mekanism/client/nei/ElementBoundHandler.java b/src/main/java/mekanism/client/nei/ElementBoundHandler.java index ce28c06c8..08a3cb23d 100644 --- a/src/main/java/mekanism/client/nei/ElementBoundHandler.java +++ b/src/main/java/mekanism/client/nei/ElementBoundHandler.java @@ -15,8 +15,6 @@ public class ElementBoundHandler extends INEIGuiAdapter { GuiMekanism guiMek = (GuiMekanism)gui; - System.out.println(x + " " + y + " " + width + " " + height + " " + guiMek.getXPos() + " " + guiMek.getYPos()); - Rectangle4i rect = new Rectangle4i(x, y, width, height); for(GuiElement element : guiMek.guiElements) diff --git a/src/main/java/mekanism/client/render/block/MachineRenderingHandler.java b/src/main/java/mekanism/client/render/block/MachineRenderingHandler.java index 2b6fe5d26..b6a67d581 100644 --- a/src/main/java/mekanism/client/render/block/MachineRenderingHandler.java +++ b/src/main/java/mekanism/client/render/block/MachineRenderingHandler.java @@ -13,6 +13,7 @@ import mekanism.client.model.ModelElectrolyticSeparator; import mekanism.client.model.ModelLogisticalSorter; import mekanism.client.model.ModelMetallurgicInfuser; import mekanism.client.model.ModelRotaryCondensentrator; +import mekanism.client.model.ModelSeismicVibrator; import mekanism.client.render.MekanismRenderer; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.util.MekanismUtils; @@ -43,6 +44,7 @@ public class MachineRenderingHandler implements ISimpleBlockRenderingHandler public ModelChemicalDissolutionChamber chemicalDissolutionChamber = new ModelChemicalDissolutionChamber(); public ModelChemicalWasher chemicalWasher = new ModelChemicalWasher(); public ModelChemicalCrystallizer chemicalCrystallizer = new ModelChemicalCrystallizer(); + public ModelSeismicVibrator seismicVibrator = new ModelSeismicVibrator(); @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) @@ -153,6 +155,14 @@ public class MachineRenderingHandler implements ISimpleBlockRenderingHandler Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ChemicalCrystallizer.png")); chemicalCrystallizer.render(0.0625F); } + else if(type == MachineType.SEISMIC_VIBRATOR) + { + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(270F, 0.0F, -1.0F, 0.0F); + GL11.glTranslatef(0.0F, -1.06F, 0.05F); + Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "SeismicVibrator.png")); + seismicVibrator.render(0.0625F); + } else { MekanismRenderer.renderItem(renderer, metadata, block); } diff --git a/src/main/java/mekanism/client/render/tileentity/RenderSeismicVibrator.java b/src/main/java/mekanism/client/render/tileentity/RenderSeismicVibrator.java new file mode 100644 index 000000000..fab5006ee --- /dev/null +++ b/src/main/java/mekanism/client/render/tileentity/RenderSeismicVibrator.java @@ -0,0 +1,63 @@ +package mekanism.client.render.tileentity; + +import mekanism.client.model.ModelSeismicVibrator; +import mekanism.common.tile.TileEntitySeismicVibrator; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderSeismicVibrator extends TileEntitySpecialRenderer +{ + private ModelSeismicVibrator model = new ModelSeismicVibrator(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) + { + renderAModelAt((TileEntitySeismicVibrator)tileEntity, x, y, z, partialTick); + } + + private void renderAModelAt(TileEntitySeismicVibrator tileEntity, double x, double y, double z, float partialTick) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); + + bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "SeismicVibrator.png")); + + switch(tileEntity.facing) + { + case 2: GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); break; + case 3: GL11.glRotatef(180, 0.0F, 1.0F, 0.0F); break; + case 4: GL11.glRotatef(90, 0.0F, 1.0F, 0.0F); break; + case 5: GL11.glRotatef(270, 0.0F, 1.0F, 0.0F); break; + } + + float rate = 0.01F; + + if(!tileEntity.getActive() && tileEntity.clientPiston > 0) + { + if(tileEntity.clientPiston < 1) + { + tileEntity.clientPiston = 1 + (1-tileEntity.clientPiston); + } + + tileEntity.clientPiston = Math.min(2, tileEntity.clientPiston+rate)%2; + } + else if(tileEntity.getActive()) + { + tileEntity.clientPiston = Math.min(2, tileEntity.clientPiston+rate)%2; + } + + float actualRate = tileEntity.clientPiston < 1 ? tileEntity.clientPiston : 2-tileEntity.clientPiston; + + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + model.renderWithPiston(actualRate, 0.0625F); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index 596f35fa9..eabe17675 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -126,6 +126,7 @@ public class CommonProxy GameRegistry.registerTileEntity(TileEntityChemicalDissolutionChamber.class, "ChemicalDissolutionChamber"); GameRegistry.registerTileEntity(TileEntityChemicalWasher.class, "ChemicalWasher"); GameRegistry.registerTileEntity(TileEntityChemicalCrystallizer.class, "ChemicalCrystallizer"); + GameRegistry.registerTileEntity(TileEntitySeismicVibrator.class, "SeismicVibrator"); GameRegistry.registerTileEntity(TileEntityPRC.class, "PressurizedReactionChamber"); } diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index b29e56adb..55949ae33 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -103,7 +103,6 @@ import mekanism.common.tile.TileEntityElectricBlock; import mekanism.common.tile.TileEntityEnergizedSmelter; import mekanism.common.tile.TileEntitySalinationTank; import mekanism.common.tile.TileEntitySalinationValve; -import mekanism.common.tile.TileEntitySeismicVibrator; import mekanism.common.transporter.TransporterManager; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; @@ -1176,7 +1175,6 @@ public class Mekanism GameRegistry.registerTileEntity(TileEntityBoundingBlock.class, "BoundingBlock"); GameRegistry.registerTileEntity(TileEntityAdvancedBoundingBlock.class, "AdvancedBoundingBlock"); GameRegistry.registerTileEntity(TileEntityCardboardBox.class, "CardboardBox"); - GameRegistry.registerTileEntity(TileEntitySeismicVibrator.class, "SeismicVibrator"); GameRegistry.registerTileEntity(TileEntitySalinationValve.class, "SalinationValve"); GameRegistry.registerTileEntity(TileEntitySalinationTank.class, "SalinationTank"); diff --git a/src/main/java/mekanism/common/block/BlockMachine.java b/src/main/java/mekanism/common/block/BlockMachine.java index c3bfcbb22..c915efb9b 100644 --- a/src/main/java/mekanism/common/block/BlockMachine.java +++ b/src/main/java/mekanism/common/block/BlockMachine.java @@ -1152,7 +1152,7 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer CHEMICAL_DISSOLUTION_CHAMBER(Mekanism.MachineBlock2, 6, "ChemicalDissolutionChamber", 35, 20000, TileEntityChemicalDissolutionChamber.class, true, false), CHEMICAL_WASHER(Mekanism.MachineBlock2, 7, "ChemicalWasher", 36, 20000, TileEntityChemicalWasher.class, true, false), CHEMICAL_CRYSTALLIZER(Mekanism.MachineBlock2, 8, "ChemicalCrystallizer", 37, 20000, TileEntityChemicalCrystallizer.class, true, false), - SEISMIC_VIBRATOR(Mekanism.MachineBlock2, 9, "SeismicVibrator", 39, 20000, TileEntitySeismicVibrator.class, false, false), + SEISMIC_VIBRATOR(Mekanism.MachineBlock2, 9, "SeismicVibrator", 39, 20000, TileEntitySeismicVibrator.class, true, false), PRESSURIZED_REACTION_CHAMBER(Mekanism.MachineBlock2, 10, "PressurizedReactionChamber", 40, 20000, TileEntityPRC.class, false, false); public Block typeBlock; diff --git a/src/main/java/mekanism/common/tile/TileEntitySeismicVibrator.java b/src/main/java/mekanism/common/tile/TileEntitySeismicVibrator.java index ba57df1ef..3c5f73942 100644 --- a/src/main/java/mekanism/common/tile/TileEntitySeismicVibrator.java +++ b/src/main/java/mekanism/common/tile/TileEntitySeismicVibrator.java @@ -23,6 +23,8 @@ public class TileEntitySeismicVibrator extends TileEntityElectricBlock implement public int updateDelay; + public float clientPiston; + public RedstoneControl controlType = RedstoneControl.DISABLED; public TileEntitySeismicVibrator() @@ -63,7 +65,7 @@ public class TileEntitySeismicVibrator extends TileEntityElectricBlock implement ChargeUtils.discharge(0, this); - if(MekanismUtils.canFunction(this) && getEnergy() > Mekanism.seismicVibratorUsage) + if(MekanismUtils.canFunction(this) && getEnergy() >= Mekanism.seismicVibratorUsage) { setActive(true); setEnergy(getEnergy()-Mekanism.seismicVibratorUsage); diff --git a/src/main/resources/assets/mekanism/render/SeismicVibrator.png b/src/main/resources/assets/mekanism/render/SeismicVibrator.png new file mode 100755 index 0000000000000000000000000000000000000000..96a9bd83bd0559c32c891848ecae100d21446fcb GIT binary patch literal 10340 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