From 75e762fd35e9901f6b4009a486cf0502f9be0be0 Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Wed, 19 Dec 2012 15:23:55 -0500 Subject: [PATCH] v5.0.1 Beta #1 *Gave the Hydrogen Generator a model. *Gave the Electrolytic Separator a model. *Gave the Heat Generator a model. *Fixed Energy Cubes dropping two of themselves. *Updated javadocs. *Added option to change Electrolytic Separator output. *Added three tiers of Smelting Factory. *Other minor changes. --- .../mekanism/gui/GuiElectrolyticSeparator.png | Bin 4264 -> 4443 bytes .../smelting/GuiAdvancedSmeltingFactory.png | Bin 0 -> 4528 bytes .../gui/smelting/GuiBasicSmeltingFactory.png | Bin 0 -> 4390 bytes .../smelting/GuiUltimateSmeltingFactory.png | Bin 0 -> 4522 bytes .../mekanism/render/ElectrolyticSeparator.png | Bin 0 -> 2738 bytes .../mekanism/render/HeatGenerator.png | Bin 0 -> 2783 bytes .../mekanism/render/HydrogenGenerator.png | Bin 0 -> 3596 bytes .../resources/mekanism/textures/terrain.png | Bin 20043 -> 21123 bytes src/common/mekanism/api/IAccessibleGui.java | 6 +- src/common/mekanism/api/IActiveState.java | 21 + src/common/mekanism/api/IElectricMachine.java | 6 - src/common/mekanism/api/IEnergyCube.java | 38 +- src/common/mekanism/api/Tier.java | 84 +++ src/common/mekanism/common/BlockBasic.java | 9 +- .../mekanism/common/BlockEnergyCube.java | 21 +- src/common/mekanism/common/BlockMachine.java | 202 ++++--- src/common/mekanism/common/CommonProxy.java | 2 + .../common/ContainerSmeltingFactory.java | 195 +++++++ .../mekanism/common/ItemBlockEnergyCube.java | 15 +- .../mekanism/common/ItemBlockMachine.java | 12 + .../mekanism/common/ItemStorageTank.java | 1 - src/common/mekanism/common/Mekanism.java | 38 +- src/common/mekanism/common/MekanismHooks.java | 10 - src/common/mekanism/common/MekanismUtils.java | 26 +- src/common/mekanism/common/PacketHandler.java | 7 + .../TileEntityAdvancedElectricMachine.java | 13 +- .../TileEntityAdvancedSmeltingFactory.java | 11 + .../mekanism/common/TileEntityBasicBlock.java | 18 +- .../common/TileEntityBasicMachine.java | 18 +- .../common/TileEntityElectricBlock.java | 34 +- .../common/TileEntityElectricMachine.java | 13 +- .../mekanism/common/TileEntityEnergyCube.java | 46 +- .../common/TileEntitySmeltingFactory.java | 541 ++++++++++++++++++ .../TileEntityUltimateSmeltingFactory.java | 11 + .../generators/common/BlockGenerator.java | 71 +-- .../common/GeneratorsCommonProxy.java | 3 + .../generators/common/MekanismGenerators.java | 3 - .../common/TileEntityBioGenerator.java | 6 + .../TileEntityElectrolyticSeparator.java | 9 + .../common/TileEntityGenerator.java | 45 +- .../common/TileEntityHeatGenerator.java | 6 + .../mekanism/client/ClientProxy.java | 3 + .../mekanism/client/GuiSmeltingFactory.java | 77 +++ .../mekanism/client/ItemRenderingHandler.java | 6 +- .../client/BlockRenderingHandler.java | 36 +- .../client/GeneratorsClientProxy.java | 3 + .../client/GuiElectrolyticSeparator.java | 33 +- .../client/ModelElectrolyticSeparator.java | 234 ++++++++ .../generators/client/ModelHeatGenerator.java | 171 ++++++ .../client/ModelHydrogenGenerator.java | 207 +++++++ .../client/RenderElectrolyticSeparator.java | 36 ++ .../client/RenderHeatGenerator.java | 35 ++ .../client/RenderHydrogenGenerator.java | 38 ++ 53 files changed, 2129 insertions(+), 291 deletions(-) create mode 100755 bin/minecraft/resources/mekanism/gui/smelting/GuiAdvancedSmeltingFactory.png create mode 100755 bin/minecraft/resources/mekanism/gui/smelting/GuiBasicSmeltingFactory.png create mode 100755 bin/minecraft/resources/mekanism/gui/smelting/GuiUltimateSmeltingFactory.png create mode 100644 bin/minecraft/resources/mekanism/render/ElectrolyticSeparator.png create mode 100644 bin/minecraft/resources/mekanism/render/HeatGenerator.png create mode 100644 bin/minecraft/resources/mekanism/render/HydrogenGenerator.png create mode 100644 src/common/mekanism/api/IActiveState.java create mode 100644 src/common/mekanism/api/Tier.java create mode 100644 src/common/mekanism/common/ContainerSmeltingFactory.java create mode 100644 src/common/mekanism/common/TileEntityAdvancedSmeltingFactory.java create mode 100644 src/common/mekanism/common/TileEntitySmeltingFactory.java create mode 100644 src/common/mekanism/common/TileEntityUltimateSmeltingFactory.java create mode 100644 src/minecraft/mekanism/client/GuiSmeltingFactory.java create mode 100644 src/minecraft/mekanism/generators/client/ModelElectrolyticSeparator.java create mode 100644 src/minecraft/mekanism/generators/client/ModelHeatGenerator.java create mode 100644 src/minecraft/mekanism/generators/client/ModelHydrogenGenerator.java create mode 100644 src/minecraft/mekanism/generators/client/RenderElectrolyticSeparator.java create mode 100644 src/minecraft/mekanism/generators/client/RenderHeatGenerator.java create mode 100644 src/minecraft/mekanism/generators/client/RenderHydrogenGenerator.java diff --git a/bin/minecraft/resources/mekanism/gui/GuiElectrolyticSeparator.png b/bin/minecraft/resources/mekanism/gui/GuiElectrolyticSeparator.png index 7df2a34d55209d903a843b385b4e888bc7195c09..42dfd0cdcb2aada865e59bebf96ffe65f06e6351 100755 GIT binary patch literal 4443 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 literal 4264 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 diff --git a/bin/minecraft/resources/mekanism/gui/smelting/GuiAdvancedSmeltingFactory.png b/bin/minecraft/resources/mekanism/gui/smelting/GuiAdvancedSmeltingFactory.png new file mode 100755 index 0000000000000000000000000000000000000000..b51c26750b2e8f6bb212a2a93016cdbb750de41c GIT binary patch literal 4528 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 a0v?wvGe`}cN8tY-fVGwFiQ;1(|N1xoP+s`} literal 0 HcmV?d00001 diff --git a/bin/minecraft/resources/mekanism/gui/smelting/GuiUltimateSmeltingFactory.png b/bin/minecraft/resources/mekanism/gui/smelting/GuiUltimateSmeltingFactory.png new file mode 100755 index 0000000000000000000000000000000000000000..84756190144cdf45d8fccf55025181f065d086ec GIT binary patch literal 4522 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 literal 0 HcmV?d00001 diff --git a/bin/minecraft/resources/mekanism/render/ElectrolyticSeparator.png b/bin/minecraft/resources/mekanism/render/ElectrolyticSeparator.png new file mode 100644 index 0000000000000000000000000000000000000000..e62b03736d23ad500d8a9b47ea5fda32a4d62b0c GIT binary patch literal 2738 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 S5I(g400001$!(U}a%(z#%mFfp35p0C09kqBAiV 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 elI*z>T%E4=rCGhpR+sHA)m^;(_x}OCT-!nb literal 20043 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ν-c1Vv1IG0!==>^& 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 aQht6yqiegL_a$)v;~VDJi>^KR>;C|=ds~+P diff --git a/src/common/mekanism/api/IAccessibleGui.java b/src/common/mekanism/api/IAccessibleGui.java index 74a96ec74..c604428a5 100644 --- a/src/common/mekanism/api/IAccessibleGui.java +++ b/src/common/mekanism/api/IAccessibleGui.java @@ -15,9 +15,13 @@ public interface IAccessibleGui /** * The mod's instance object - * @return mod instance + * @return what the @Instance field is named in your mod. */ public String getInstanceName(); + /** + * Gets the mod's main class path as a string. For Mekanism I would return "mekanism.common.Mekanism" + * @return + */ public String getClassPath(); } diff --git a/src/common/mekanism/api/IActiveState.java b/src/common/mekanism/api/IActiveState.java new file mode 100644 index 000000000..f89a1cb33 --- /dev/null +++ b/src/common/mekanism/api/IActiveState.java @@ -0,0 +1,21 @@ +package mekanism.api; + +/** + * Implement this if your machine/generator has some form of active state. + * @author aidancbrady + * + */ +public interface IActiveState +{ + /** + * Gets the active state as a boolean. + * @return active state + */ + public boolean getActive(); + + /** + * Sets the active state to a new value. + * @param active - new active state + */ + public void setActive(boolean active); +} diff --git a/src/common/mekanism/api/IElectricMachine.java b/src/common/mekanism/api/IElectricMachine.java index 6e029cd95..8a420e787 100644 --- a/src/common/mekanism/api/IElectricMachine.java +++ b/src/common/mekanism/api/IElectricMachine.java @@ -39,10 +39,4 @@ public interface IElectricMachine * @return recipes */ public List getRecipes(); - - /** - * Sets this machine's active state, sending a packet to the server if it differs from the previous update. - * @param active - */ - public void setActive(boolean active); } diff --git a/src/common/mekanism/api/IEnergyCube.java b/src/common/mekanism/api/IEnergyCube.java index 2a63e9292..a2b8d8e5c 100644 --- a/src/common/mekanism/api/IEnergyCube.java +++ b/src/common/mekanism/api/IEnergyCube.java @@ -1,43 +1,11 @@ package mekanism.api; +import mekanism.api.Tier.EnergyCubeTier; import net.minecraft.src.*; public interface IEnergyCube { - public EnumTier getTier(ItemStack itemstack); + public EnergyCubeTier getTier(ItemStack itemstack); - public void setTier(ItemStack itemstack, EnumTier tier); - - public static enum EnumTier - { - BASIC("Basic", 1000000, 10000), - ADVANCED("Advanced", 2500000, 25000), - ULTIMATE("Ultimate", 5000000, 50000); - - public double MAX_ELECTRICITY; - public double VOLTAGE; - public int DIVIDER; - public String name; - - public static EnumTier getFromName(String gasName) - { - for(EnumTier tier : values()) - { - if(gasName.contains(tier.name)) - { - return tier; - } - } - - System.out.println("[Mekanism] Invalid tier identifier when retrieving with name."); - return BASIC; - } - - private EnumTier(String s, double maxEnergy, int divider) - { - name = s; - MAX_ELECTRICITY = maxEnergy; - DIVIDER = divider; - } - } + public void setTier(ItemStack itemstack, EnergyCubeTier tier); } diff --git a/src/common/mekanism/api/Tier.java b/src/common/mekanism/api/Tier.java new file mode 100644 index 000000000..ba1a0bb1e --- /dev/null +++ b/src/common/mekanism/api/Tier.java @@ -0,0 +1,84 @@ +package mekanism.api; + +/** + * Tier information for Mekanism. This currently includes tiers for Energy Cubes and Smelting Factories. + * @author aidancbrady + * + */ +public final class Tier +{ + /** + * The tiers used by the Energy Cube and their corresponding values. + * @author aidancbrady + * + */ + public static enum EnergyCubeTier + { + BASIC("Basic", 1000000, 10000), + ADVANCED("Advanced", 2500000, 25000), + ULTIMATE("Ultimate", 5000000, 50000); + + public double MAX_ELECTRICITY; + public double VOLTAGE; + public int DIVIDER; + public String name; + + public static EnergyCubeTier getFromName(String tierName) + { + for(EnergyCubeTier tier : values()) + { + if(tierName.contains(tier.name)) + { + return tier; + } + } + + System.out.println("[Mekanism] Invalid tier identifier when retrieving with name."); + return BASIC; + } + + private EnergyCubeTier(String s, double maxEnergy, int divider) + { + name = s; + MAX_ELECTRICITY = maxEnergy; + DIVIDER = divider; + } + } + + /** + * The tiers used by the Smelting Factory and their corresponding values. + * @author aidancbrady + * + */ + public static enum SmeltingFactoryTier + { + BASIC("Basic", 3, "GuiBasicSmeltingFactory.png"), + ADVANCED("Advanced", 5, "GuiAdvancedSmeltingFactory.png"), + ULTIMATE("Ultimate", 7, "GuiUltimateSmeltingFactory.png"); + + public int processes; + public String guiTexturePath; + public String name; + + public static SmeltingFactoryTier getFromName(String tierName) + { + for(SmeltingFactoryTier tier : values()) + { + if(tierName.contains(tier.name)) + { + return tier; + } + } + + System.out.println("[Mekanism] Invalid tier identifier when retrieving with name."); + return BASIC; + } + + private SmeltingFactoryTier(String s, int process, String gui) + { + name = s; + processes = process; + guiTexturePath = gui; + } + } +} diff --git a/src/common/mekanism/common/BlockBasic.java b/src/common/mekanism/common/BlockBasic.java index 634a98317..301eb9639 100644 --- a/src/common/mekanism/common/BlockBasic.java +++ b/src/common/mekanism/common/BlockBasic.java @@ -73,7 +73,7 @@ public class BlockBasic extends Block list.add(new ItemStack(i, 1, 3)); list.add(new ItemStack(i, 1, 4)); list.add(new ItemStack(i, 1, 5)); - list.add(new ItemStack(i, 1, 6)); + //list.add(new ItemStack(i, 1, 6)); } @Override @@ -134,7 +134,12 @@ public class BlockBasic extends Block @Override public TileEntity createTileEntity(World world, int metadata) { - return metadata == 6 ? new TileEntityControlPanel() : null; + switch(metadata) + { + case 6: + return new TileEntityControlPanel(); + } + return null; } @Override diff --git a/src/common/mekanism/common/BlockEnergyCube.java b/src/common/mekanism/common/BlockEnergyCube.java index 4605c087b..9e9add15e 100644 --- a/src/common/mekanism/common/BlockEnergyCube.java +++ b/src/common/mekanism/common/BlockEnergyCube.java @@ -11,7 +11,7 @@ import universalelectricity.core.implement.IItemElectric; import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly; import mekanism.api.IEnergyCube; -import mekanism.api.IEnergyCube.EnumTier; +import mekanism.api.Tier.EnergyCubeTier; import mekanism.generators.common.MekanismGenerators; import mekanism.generators.common.BlockGenerator.GeneratorType; import net.minecraft.src.*; @@ -116,7 +116,7 @@ public class BlockEnergyCube extends BlockContainer int metadata = world.getBlockMetadata(x, y, z); TileEntityEnergyCube tileEntity = (TileEntityEnergyCube)world.getBlockTileEntity(x, y, z); - if(tileEntity.tier == EnumTier.BASIC) + if(tileEntity.tier == EnergyCubeTier.BASIC) { if(side == tileEntity.facing) { @@ -126,7 +126,7 @@ public class BlockEnergyCube extends BlockContainer return 21; } } - else if(tileEntity.tier == EnumTier.ADVANCED) + else if(tileEntity.tier == EnergyCubeTier.ADVANCED) { if(side == tileEntity.facing) { @@ -136,7 +136,7 @@ public class BlockEnergyCube extends BlockContainer return 22; } } - else if(tileEntity.tier == EnumTier.ULTIMATE) + else if(tileEntity.tier == EnergyCubeTier.ULTIMATE) { if(side == tileEntity.facing) { @@ -206,21 +206,22 @@ public class BlockEnergyCube extends BlockContainer electricItem.setJoules(tileEntity.electricityStored, entityItem.item); world.spawnEntityInWorld(entityItem); - - if(Mekanism.hooks.IC2Loaded) - { - EnergyNet.getForWorld(tileEntity.worldObj).removeTileEntity(tileEntity); - } } super.breakBlock(world, x, y, z, i1, i2); } + @Override + public int quantityDropped(Random random) + { + return 0; + } + @Override @SideOnly(Side.CLIENT) public void getSubBlocks(int i, CreativeTabs creativetabs, List list) { - for(EnumTier tier : EnumTier.values()) + for(EnergyCubeTier tier : EnergyCubeTier.values()) { ItemStack discharged = new ItemStack(this); discharged.setItemDamage(100); diff --git a/src/common/mekanism/common/BlockMachine.java b/src/common/mekanism/common/BlockMachine.java index 398b5b6dc..0268016db 100644 --- a/src/common/mekanism/common/BlockMachine.java +++ b/src/common/mekanism/common/BlockMachine.java @@ -18,6 +18,9 @@ import net.minecraftforge.common.ForgeDirection; * 2: Combiner * 3: Crusher * 4: Theoretical Elementizer + * 5: Basic Smelting Factory + * 6: Advanced Smelting Factory + * 7: Ultimate Smelting Factory * @author AidanBrady * */ @@ -37,22 +40,19 @@ public class BlockMachine extends BlockContainer @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entityliving) { - if(!(world.getBlockMetadata(x, y, z) == 6)) - { - TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getBlockTileEntity(x, y, z); - int side = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - int change = 3; - - switch(side) - { - case 0: change = 2; break; - case 1: change = 5; break; - case 2: change = 3; break; - case 3: change = 4; break; - } - - tileEntity.setFacing((short)change); - } + TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getBlockTileEntity(x, y, z); + int side = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + int change = 3; + + switch(side) + { + case 0: change = 2; break; + case 1: change = 5; break; + case 2: change = 3; break; + case 3: change = 4; break; + } + + tileEntity.setFacing((short)change); } @Override @@ -60,7 +60,7 @@ public class BlockMachine extends BlockContainer public void randomDisplayTick(World world, int x, int y, int z, Random random) { TileEntityElectricBlock tileEntity = (TileEntityElectricBlock)world.getBlockTileEntity(x, y, z); - if (isActive(world, x, y, z)) + if (MekanismUtils.isActive(world, x, y, z)) { float xRandom = (float)x + 0.5F; float yRandom = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F; @@ -148,6 +148,36 @@ public class BlockMachine extends BlockContainer return 19; } } + else if(meta == 5) + { + if(side == 3) + { + return 41; + } + else { + return 44; + } + } + else if(meta == 6) + { + if(side == 3) + { + return 42; + } + else { + return 45; + } + } + else if(meta == 7) + { + if(side == 3) + { + return 43; + } + else { + return 46; + } + } else { return 0; } @@ -164,7 +194,7 @@ public class BlockMachine extends BlockContainer { if(side == tileEntity.facing) { - return isActive(world, x, y, z) ? 8 : 9; + return MekanismUtils.isActive(world, x, y, z) ? 8 : 9; } else { return 2; @@ -174,8 +204,7 @@ public class BlockMachine extends BlockContainer { if(side == tileEntity.facing) { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+2 : 14; - + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+2 : 14; } else { return 2; @@ -185,7 +214,7 @@ public class BlockMachine extends BlockContainer { if(side == tileEntity.facing) { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+3 : 15; + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+3 : 15; } else { return 2; @@ -195,7 +224,7 @@ public class BlockMachine extends BlockContainer { if(side == tileEntity.facing) { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+1 : 13; + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+1 : 13; } else { return 2; @@ -205,22 +234,52 @@ public class BlockMachine extends BlockContainer { if(side == 0 || side == 1) { - return isActive(world, x, y, z) ? 20 : 18; + return MekanismUtils.isActive(world, x, y, z) ? 20 : 18; } else { if(side == tileEntity.facing) { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+4 : 16; + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+4 : 16; } else if(side == ForgeDirection.getOrientation(tileEntity.facing).getOpposite().ordinal()) { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+5 : 17; + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+5 : 17; } else { - return isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+6 : 19; + return MekanismUtils.isActive(world, x, y, z) ? Mekanism.ANIMATED_TEXTURE_INDEX+6 : 19; } } } + else if(metadata == 5) + { + if(side == tileEntity.facing) + { + return 41; + } + else { + return 44; + } + } + else if(metadata == 6) + { + if(side == tileEntity.facing) + { + return 42; + } + else { + return 45; + } + } + else if(metadata == 7) + { + if(side == tileEntity.facing) + { + return 43; + } + else { + return 46; + } + } else { return 0; } @@ -241,26 +300,11 @@ public class BlockMachine extends BlockContainer list.add(new ItemStack(i, 1, 2)); list.add(new ItemStack(i, 1, 3)); list.add(new ItemStack(i, 1, 4)); + list.add(new ItemStack(i, 1, 5)); + list.add(new ItemStack(i, 1, 6)); + list.add(new ItemStack(i, 1, 7)); } - /** - * Checks if a machine is in it's active state. - * @param world - * @param x - * @param y - * @param z - * @return if machine is active - */ - public boolean isActive(IBlockAccess world, int x, int y, int z) - { - TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); - if(tileEntity != null) - { - return tileEntity.isActive; - } - return false; - } - @Override public void breakBlock(World world, int x, int y, int z, int i1, int i2) { @@ -303,11 +347,6 @@ public class BlockMachine extends BlockContainer } } } - - if(Mekanism.hooks.IC2Loaded) - { - EnergyNet.getForWorld(tileEntity.worldObj).removeTileEntity(tileEntity); - } } super.breakBlock(world, x, y, z, i1, i2); @@ -328,7 +367,7 @@ public class BlockMachine extends BlockContainer { if(!entityplayer.isSneaking()) { - entityplayer.openGui(Mekanism.instance, MachineType.getGuiID(metadata), world, x, y, z); + entityplayer.openGui(Mekanism.instance, MachineType.getFromMetadata(metadata).guiId, world, x, y, z); return true; } } @@ -345,29 +384,7 @@ public class BlockMachine extends BlockContainer @Override public TileEntity createNewTileEntity(World world, int metadata) { - if(metadata == MachineType.ENRICHMENT_CHAMBER.meta) - { - return new TileEntityEnrichmentChamber(); - } - else if(metadata == MachineType.PLATINUM_COMPRESSOR.meta) - { - return new TileEntityPlatinumCompressor(); - } - else if(metadata == MachineType.COMBINER.meta) - { - return new TileEntityCombiner(); - } - else if(metadata == MachineType.CRUSHER.meta) - { - return new TileEntityCrusher(); - } - else if(metadata == MachineType.THEORETICAL_ELEMENTIZER.meta) - { - return new TileEntityTheoreticalElementizer(); - } - else { - return null; - } + return MachineType.getFromMetadata(metadata).create(); } @Override @@ -378,24 +395,43 @@ public class BlockMachine extends BlockContainer public static enum MachineType { - ENRICHMENT_CHAMBER(0, 3), - PLATINUM_COMPRESSOR(1, 4), - COMBINER(2, 5), - CRUSHER(3, 6), - THEORETICAL_ELEMENTIZER(4, 7); + ENRICHMENT_CHAMBER(0, 3, TileEntityEnrichmentChamber.class), + PLATINUM_COMPRESSOR(1, 4, TileEntityPlatinumCompressor.class), + COMBINER(2, 5, TileEntityCombiner.class), + CRUSHER(3, 6, TileEntityCrusher.class), + THEORETICAL_ELEMENTIZER(4, 7, TileEntityTheoreticalElementizer.class), + BASIC_SMELTING_FACTORY(5, 11, TileEntitySmeltingFactory.class), + ADVANCED_SMELTING_FACTORY(6, 11, TileEntityAdvancedSmeltingFactory.class), + ULTIMATE_SMELTING_FACTORY(7, 11, TileEntityUltimateSmeltingFactory.class); - private int meta; - private int guiId; + public int meta; + public int guiId; + public Class tileEntityClass; - private MachineType(int i, int j) + private MachineType(int i, int j, Class tileClass) { meta = i; guiId = j; + tileEntityClass = tileClass; } - public static int getGuiID(int meta) + public static MachineType getFromMetadata(int meta) { - return values()[meta].guiId; + return values()[meta]; + } + + public TileEntity create() + { + TileEntity tileEntity; + + try { + tileEntity = tileEntityClass.newInstance(); + return tileEntity; + } catch(Exception e) { + System.err.println("[Mekanism] Unable to indirectly create tile entity."); + e.printStackTrace(); + return null; + } } @Override diff --git a/src/common/mekanism/common/CommonProxy.java b/src/common/mekanism/common/CommonProxy.java index a6ffe98be..35f009aa4 100644 --- a/src/common/mekanism/common/CommonProxy.java +++ b/src/common/mekanism/common/CommonProxy.java @@ -126,6 +126,8 @@ public class CommonProxy return new ContainerEnergyCube(player.inventory, (TileEntityEnergyCube)tileEntity); case 10: return new ContainerGasTank(player.inventory, (TileEntityGasTank)tileEntity); + case 11: + return new ContainerSmeltingFactory(player.inventory, (TileEntitySmeltingFactory)tileEntity); } return null; } diff --git a/src/common/mekanism/common/ContainerSmeltingFactory.java b/src/common/mekanism/common/ContainerSmeltingFactory.java new file mode 100644 index 000000000..8c6cea27a --- /dev/null +++ b/src/common/mekanism/common/ContainerSmeltingFactory.java @@ -0,0 +1,195 @@ +package mekanism.common; + +import ic2.api.IElectricItem; +import universalelectricity.core.implement.IItemElectric; +import mekanism.api.ItemMachineUpgrade; +import mekanism.api.Tier.SmeltingFactoryTier; +import net.minecraft.src.*; + +public class ContainerSmeltingFactory extends Container +{ + private TileEntitySmeltingFactory tileEntity; + + public ContainerSmeltingFactory(InventoryPlayer inventory, TileEntitySmeltingFactory tentity) + { + tileEntity = tentity; + + addSlotToContainer(new SlotMachineUpgrade(tentity, 0, 7, 7)); + addSlotToContainer(new SlotEnergy(tentity, 1, 7, 35)); + + if(tileEntity.tier == SmeltingFactoryTier.BASIC) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 55 + (i*38); + + addSlotToContainer(new Slot(tentity, 2+i*2, xAxis, 13)); + addSlotToContainer(new SlotFurnace(inventory.player, tentity, 3+i*2, xAxis, 57)); + } + } + + else if(tileEntity.tier == SmeltingFactoryTier.ADVANCED) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 35 + (i*26); + + addSlotToContainer(new Slot(tentity, 2+i*2, xAxis, 13)); + addSlotToContainer(new SlotFurnace(inventory.player, tentity, 3+i*2, xAxis, 57)); + } + } + + else if(tileEntity.tier == SmeltingFactoryTier.ULTIMATE) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 29 + (i*19); + + addSlotToContainer(new Slot(tentity, 2+i*2, xAxis, 13)); + addSlotToContainer(new SlotFurnace(inventory.player, tentity, 3+i*2, xAxis, 57)); + } + } + + int slotX; + + for (slotX = 0; slotX < 3; ++slotX) + { + for (int slotY = 0; slotY < 9; ++slotY) + { + addSlotToContainer(new Slot(inventory, slotY + slotX * 9 + 9, 8 + slotY * 18, 84 + slotX * 18)); + } + } + + for (slotX = 0; slotX < 9; ++slotX) + { + addSlotToContainer(new Slot(inventory, slotX, 8 + slotX * 18, 142)); + } + + tileEntity.openChest(); + } + + @Override + public void onCraftGuiClosed(EntityPlayer entityplayer) + { + super.onCraftGuiClosed(entityplayer); + tileEntity.closeChest(); + } + + @Override + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + return tileEntity.isUseableByPlayer(par1EntityPlayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotID) + { + ItemStack stack = null; + Slot currentSlot = (Slot)inventorySlots.get(slotID); + + if(currentSlot != null && currentSlot.getHasStack()) + { + ItemStack slotStack = currentSlot.getStack(); + stack = slotStack.copy(); + + if(slotID == 3 || slotID == 5 || slotID == 7 || slotID == 9 || slotID == 11 || slotID == 13 || slotID == 15) + { + if(!mergeItemStack(slotStack, tileEntity.inventory.length, inventorySlots.size(), true)) + { + return null; + } + } + else if(slotStack.getItem() instanceof IItemElectric || slotStack.getItem() instanceof IElectricItem || slotStack.itemID == Item.redstone.shiftedIndex) + { + if(slotID != 1) + { + if(!mergeItemStack(slotStack, 1, 2, false)) + { + return null; + } + } + else if(slotID == 1) + { + if(!mergeItemStack(slotStack, tileEntity.inventory.length, inventorySlots.size(), true)) + { + return null; + } + } + } + else if(FurnaceRecipes.smelting().getSmeltingResult(slotStack) != null) + { + if(slotID != 2 && slotID != 4 && slotID != 6 && slotID != 8 && slotID != 10 && slotID != 12 && slotID != 14) + { + if(!mergeItemStack(slotStack, 2, 3, false)) + { + if(!mergeItemStack(slotStack, 4, 5, false)) + { + if(!mergeItemStack(slotStack, 6, 7, false)) + { + if(tileEntity.tier != SmeltingFactoryTier.BASIC) + { + if(!mergeItemStack(slotStack, 8, 9, false)) + { + if(!mergeItemStack(slotStack, 10, 11, false)) + { + if(tileEntity.tier != SmeltingFactoryTier.ADVANCED) + { + if(!mergeItemStack(slotStack, 12, 13, false)) + { + if(!mergeItemStack(slotStack, 14, 15, false)) + { + return null; + } + } + } + } + } + } + } + } + } + } + else { + if(!mergeItemStack(slotStack, tileEntity.inventory.length, inventorySlots.size(), true)) + { + return null; + } + } + } + else if(slotStack.getItem() instanceof ItemMachineUpgrade) + { + if(slotID != 0) + { + if(!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, tileEntity.inventory.length, inventorySlots.size(), true)) + { + return null; + } + } + } + + if (slotStack.stackSize == 0) + { + currentSlot.putStack((ItemStack)null); + } + else + { + currentSlot.onSlotChanged(); + } + + if (slotStack.stackSize == stack.stackSize) + { + return null; + } + + currentSlot.onPickupFromSlot(player, slotStack); + } + + return stack; + } +} diff --git a/src/common/mekanism/common/ItemBlockEnergyCube.java b/src/common/mekanism/common/ItemBlockEnergyCube.java index ed86c21c5..e6845e781 100644 --- a/src/common/mekanism/common/ItemBlockEnergyCube.java +++ b/src/common/mekanism/common/ItemBlockEnergyCube.java @@ -6,6 +6,7 @@ import universalelectricity.core.electricity.ElectricInfo; import universalelectricity.core.electricity.ElectricInfo.ElectricUnit; import universalelectricity.core.implement.IItemElectric; import mekanism.api.IEnergyCube; +import mekanism.api.Tier.EnergyCubeTier; import net.minecraft.src.*; public class ItemBlockEnergyCube extends ItemBlock implements IItemElectric, IEnergyCube @@ -38,7 +39,7 @@ public class ItemBlockEnergyCube extends ItemBlock implements IItemElectric, IEn item.setTier(itemstack, item.getTier(itemstack)); } - public ItemStack getUnchargedItem(EnumTier tier) + public ItemStack getUnchargedItem(EnergyCubeTier tier) { ItemStack charged = new ItemStack(this); setTier(charged, tier); @@ -103,7 +104,7 @@ public class ItemBlockEnergyCube extends ItemBlock implements IItemElectric, IEn return getTier(itemstack).MAX_ELECTRICITY; } - return EnumTier.BASIC.MAX_ELECTRICITY; + return EnergyCubeTier.BASIC.MAX_ELECTRICITY; } @Override @@ -162,23 +163,23 @@ public class ItemBlockEnergyCube extends ItemBlock implements IItemElectric, IEn } @Override - public EnumTier getTier(ItemStack itemstack) + public EnergyCubeTier getTier(ItemStack itemstack) { if(itemstack.stackTagCompound == null) { - return EnumTier.BASIC; + return EnergyCubeTier.BASIC; } if(itemstack.stackTagCompound.getString("tier") == null) { - return EnumTier.BASIC; + return EnergyCubeTier.BASIC; } - return EnumTier.getFromName(itemstack.stackTagCompound.getString("tier")); + return EnergyCubeTier.getFromName(itemstack.stackTagCompound.getString("tier")); } @Override - public void setTier(ItemStack itemstack, EnumTier tier) + public void setTier(ItemStack itemstack, EnergyCubeTier tier) { if (itemstack.stackTagCompound == null) { diff --git a/src/common/mekanism/common/ItemBlockMachine.java b/src/common/mekanism/common/ItemBlockMachine.java index 60713f4b5..58f10af8a 100644 --- a/src/common/mekanism/common/ItemBlockMachine.java +++ b/src/common/mekanism/common/ItemBlockMachine.java @@ -11,6 +11,9 @@ import net.minecraft.src.ItemStack; * 2: Combiner * 3: Crusher * 4: Theoretical Elementizer + * 5: Basic Smelting Factory + * 6: Advanced Smelting Factory + * 7: Ultimate Smelting Factory * @author AidanBrady * */ @@ -58,6 +61,15 @@ public class ItemBlockMachine extends ItemBlock case 4: name = "TheoreticalElementizer"; break; + case 5: + name = "BasicSmeltingFactory"; + break; + case 6: + name = "AdvancedSmeltingFactory"; + break; + case 7: + name = "UltimateSmeltingFactory"; + break; default: name = "Unknown"; break; diff --git a/src/common/mekanism/common/ItemStorageTank.java b/src/common/mekanism/common/ItemStorageTank.java index a28613000..683cefb47 100644 --- a/src/common/mekanism/common/ItemStorageTank.java +++ b/src/common/mekanism/common/ItemStorageTank.java @@ -5,7 +5,6 @@ import java.util.List; import ic2.api.IElectricItem; import mekanism.api.EnumGas; import mekanism.api.IStorageTank; -import mekanism.api.IEnergyCube.EnumTier; import net.minecraft.src.*; public class ItemStorageTank extends ItemMekanism implements IStorageTank diff --git a/src/common/mekanism/common/Mekanism.java b/src/common/mekanism/common/Mekanism.java index 295cb12e4..2628e12ee 100644 --- a/src/common/mekanism/common/Mekanism.java +++ b/src/common/mekanism/common/Mekanism.java @@ -15,8 +15,8 @@ import java.util.Random; import java.util.logging.Logger; import universalelectricity.prefab.multiblock.*; -import mekanism.api.IEnergyCube.EnumTier; import mekanism.api.ItemMachineUpgrade; +import mekanism.api.Tier.EnergyCubeTier; import mekanism.client.SoundHandler; import net.minecraftforge.common.*; import net.minecraftforge.event.ForgeSubscribe; @@ -47,7 +47,7 @@ import cpw.mods.fml.common.registry.TickRegistry; * @author AidanBrady * */ -@Mod(modid = "Mekanism", name = "Mekanism", version = "5.0.0") +@Mod(modid = "Mekanism", name = "Mekanism", version = "5.0.1") @NetworkMod(channels = {"Mekanism"}, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class) public class Mekanism { @@ -69,7 +69,7 @@ public class Mekanism public static Configuration configuration; /** Mekanism version number */ - public static Version versionNumber = new Version(5, 0, 0); + public static Version versionNumber = new Version(5, 0, 1); /** Mekanism creative tab */ public static CreativeTabMekanism tabMekanism = new CreativeTabMekanism(); @@ -236,27 +236,36 @@ public class Mekanism CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(GasTank, new Object[] { "PPP", "PDP", "PPP", Character.valueOf('P'), "ingotPlatinum", Character.valueOf('D'), "dustIron" })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnumTier.BASIC), new Object[] { + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnergyCubeTier.BASIC), new Object[] { "ELE", "TIT", "ELE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('L'), new ItemStack(Item.dyePowder, 1, 4), Character.valueOf('T'), EnergyTablet.getUnchargedItem(), Character.valueOf('I'), new ItemStack(BasicBlock, 1, 5) })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnumTier.ADVANCED), new Object[] { - "EGE", "TBT", "EGE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('G'), Item.ingotGold, Character.valueOf('T'), EnergyTablet.getUnchargedItem(), Character.valueOf('B'), MekanismUtils.getEnergyCubeWithTier(EnumTier.BASIC) + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnergyCubeTier.ADVANCED), new Object[] { + "EGE", "TBT", "EGE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('G'), Item.ingotGold, Character.valueOf('T'), EnergyTablet.getUnchargedItem(), Character.valueOf('B'), MekanismUtils.getEnergyCubeWithTier(EnergyCubeTier.BASIC) })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnumTier.ULTIMATE), new Object[] { - "EDE", "TAT", "EDE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('D'), Item.diamond, Character.valueOf('T'), EnergyTablet.getUnchargedItem(), Character.valueOf('A'), MekanismUtils.getEnergyCubeWithTier(EnumTier.ADVANCED) + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(MekanismUtils.getEnergyCubeWithTier(EnergyCubeTier.ULTIMATE), new Object[] { + "EDE", "TAT", "EDE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('D'), Item.diamond, Character.valueOf('T'), EnergyTablet.getUnchargedItem(), Character.valueOf('A'), MekanismUtils.getEnergyCubeWithTier(EnergyCubeTier.ADVANCED) })); CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(ControlCircuit), new Object[] { " P ", "PEP", " P ", Character.valueOf('P'), new ItemStack(Ingot, 1, 1), Character.valueOf('E'), EnrichedAlloy })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 6), new Object[] { + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 2), new Object[] { "A", "I", "A", Character.valueOf('A'), EnrichedAlloy, Character.valueOf('I'), "dustIron" })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 4), new Object[] { + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 1), new Object[] { "C", "I", "C", Character.valueOf('C'), "dustCopper", Character.valueOf('I'), "dustIron" })); - CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 4), new Object[] { + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(EnrichedIron, 1), new Object[] { "T", "I", "T", Character.valueOf('T'), "dustTin", Character.valueOf('I'), "dustIron" })); + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(MachineBlock, 1, 5), new Object[] { + "CAC", "GIG", "CAC", Character.valueOf('C'), ControlCircuit, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('G'), "dustGold", Character.valueOf('I'), new ItemStack(BasicBlock, 1, 5) + })); + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(MachineBlock, 1, 6), new Object[] { + "CAC", "DFD", "CAC", Character.valueOf('C'), ControlCircuit, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('D'), "dustDiamond", Character.valueOf('F'), new ItemStack(MachineBlock, 1, 5) + })); + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(new ItemStack(MachineBlock, 1, 7), new Object[] { + "CAC", "cFc", "CAC", Character.valueOf('C'), ControlCircuit, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('c'), AtomicCore, Character.valueOf('F'), new ItemStack(MachineBlock, 1, 6) + })); if(extrasEnabled) { @@ -345,6 +354,9 @@ public class Mekanism LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.Combiner.name", "Combiner"); LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.Crusher.name", "Crusher"); LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.TheoreticalElementizer.name", "Theoretical Elementizer"); + LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.BasicSmeltingFactory.name", "Basic Smelting Factory"); + LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.AdvancedSmeltingFactory.name", "Advanced Smelting Factory"); + LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.UltimateSmeltingFactory.name", "Ultimate Smelting Factory"); //Localization for OreBlock LanguageRegistry.instance().addStringLocalization("tile.OreBlock.PlatinumOre.name", "Platinum Ore"); @@ -458,6 +470,7 @@ public class Mekanism OreDictionary.registerOre("dustGold", new ItemStack(Dust, 1, 1)); OreDictionary.registerOre("dustPlatinum", new ItemStack(Dust, 1, 2)); OreDictionary.registerOre("dustObsidian", new ItemStack(Dust, 1, 3)); + OreDictionary.registerOre("dustDiamond", new ItemStack(Dust, 1, 4)); OreDictionary.registerOre("ingotObsidian", new ItemStack(Ingot, 1, 0)); OreDictionary.registerOre("ingotPlatinum", new ItemStack(Ingot, 1, 1)); @@ -620,6 +633,9 @@ public class Mekanism GameRegistry.registerTileEntity(TileEntityMulti.class, "Multi"); GameRegistry.registerTileEntity(TileEntityControlPanel.class, "ControlPanel"); GameRegistry.registerTileEntity(TileEntityGasTank.class, "GasTank"); + GameRegistry.registerTileEntity(TileEntitySmeltingFactory.class, "SmeltingFactory"); + GameRegistry.registerTileEntity(TileEntityAdvancedSmeltingFactory.class, "AdvancedSmeltingFactory"); + GameRegistry.registerTileEntity(TileEntityUltimateSmeltingFactory.class, "UltimateSmeltingFactory"); //Load tile entities that have special renderers. proxy.registerSpecialTileEntities(); diff --git a/src/common/mekanism/common/MekanismHooks.java b/src/common/mekanism/common/MekanismHooks.java index 497b4503a..a13f8a7f8 100644 --- a/src/common/mekanism/common/MekanismHooks.java +++ b/src/common/mekanism/common/MekanismHooks.java @@ -1,7 +1,6 @@ package mekanism.common; import cpw.mods.fml.common.Loader; -import railcraft.common.api.core.items.ItemRegistry; import ic2.api.Ic2Recipes; import net.minecraft.src.*; @@ -30,8 +29,6 @@ public final class MekanismHooks public ItemStack IC2TinDust; public ItemStack IC2CoalDust; - public ItemStack RailcraftObsidianDust; - public int BuildCraftFuelID = 3808; public ItemStack BuildCraftFuelBucket; @@ -72,8 +69,6 @@ public final class MekanismHooks } if(RailcraftLoaded) { - RailcraftObsidianDust = getRailcraftItem("dust.obsidian"); - System.out.println("[Mekanism] Hooked into Railcraft successfully."); } if(BasicComponentsLoaded) @@ -120,11 +115,6 @@ public final class MekanismHooks } } - public ItemStack getRailcraftItem(String name) - { - return ItemRegistry.getItem(name, 1); - } - public ItemStack getBuildCraftItem(String name) { try { diff --git a/src/common/mekanism/common/MekanismUtils.java b/src/common/mekanism/common/MekanismUtils.java index 8ab9d4ca8..ec009ad0f 100644 --- a/src/common/mekanism/common/MekanismUtils.java +++ b/src/common/mekanism/common/MekanismUtils.java @@ -16,8 +16,9 @@ import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.server.FMLServerHandler; +import mekanism.api.IActiveState; import mekanism.api.IEnergyCube; -import mekanism.api.IEnergyCube.EnumTier; +import mekanism.api.Tier.EnergyCubeTier; import mekanism.client.ThreadSendData; import net.minecraft.src.*; import net.minecraftforge.oredict.ShapedOreRecipe; @@ -207,9 +208,30 @@ public final class MekanismUtils * @param tier - tier to add to the Energy Cube * @return empty energy cube with defined tier */ - public static ItemStack getEnergyCubeWithTier(EnumTier tier) + public static ItemStack getEnergyCubeWithTier(EnergyCubeTier tier) { ItemStack itemstack = ((ItemBlockEnergyCube)new ItemStack(Mekanism.EnergyCube).getItem()).getUnchargedItem(tier); return itemstack; } + + /** + * Checks if a machine is in it's active state. + * @param world + * @param x + * @param y + * @param z + * @return if machine is active + */ + public static boolean isActive(IBlockAccess world, int x, int y, int z) + { + TileEntity tileEntity = (TileEntity)world.getBlockTileEntity(x, y, z); + if(tileEntity != null) + { + if(tileEntity instanceof IActiveState) + { + return ((IActiveState)tileEntity).getActive(); + } + } + return false; + } } diff --git a/src/common/mekanism/common/PacketHandler.java b/src/common/mekanism/common/PacketHandler.java index 0813af287..0d74d9281 100644 --- a/src/common/mekanism/common/PacketHandler.java +++ b/src/common/mekanism/common/PacketHandler.java @@ -232,6 +232,13 @@ public class PacketHandler implements IPacketHandler { output.writeUTF((String)data); } + else if(data instanceof int[]) + { + for(int i : (int[])data) + { + output.writeInt(i); + } + } } Packet250CustomPayload packet = new Packet250CustomPayload(); diff --git a/src/common/mekanism/common/TileEntityAdvancedElectricMachine.java b/src/common/mekanism/common/TileEntityAdvancedElectricMachine.java index e01e8a44d..b375ce92d 100644 --- a/src/common/mekanism/common/TileEntityAdvancedElectricMachine.java +++ b/src/common/mekanism/common/TileEntityAdvancedElectricMachine.java @@ -68,6 +68,7 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM public void onUpdate() { super.onUpdate(); + boolean testActive = operatingTicks > 0; if(inventory[3] != null) @@ -230,17 +231,7 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM return; } - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = RecipeHandler.getOutput(inventory[0], false, getRecipes()).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = RecipeHandler.getOutput(inventory[0], true, getRecipes()).copy(); - } + ItemStack itemstack = RecipeHandler.getOutput(inventory[0], true, getRecipes()); if (inventory[0].stackSize <= 0) { diff --git a/src/common/mekanism/common/TileEntityAdvancedSmeltingFactory.java b/src/common/mekanism/common/TileEntityAdvancedSmeltingFactory.java new file mode 100644 index 000000000..2b35f19cd --- /dev/null +++ b/src/common/mekanism/common/TileEntityAdvancedSmeltingFactory.java @@ -0,0 +1,11 @@ +package mekanism.common; + +import mekanism.api.Tier.SmeltingFactoryTier; + +public class TileEntityAdvancedSmeltingFactory extends TileEntitySmeltingFactory +{ + public TileEntityAdvancedSmeltingFactory() + { + super(SmeltingFactoryTier.ADVANCED); + } +} diff --git a/src/common/mekanism/common/TileEntityBasicBlock.java b/src/common/mekanism/common/TileEntityBasicBlock.java index 01815b7e9..b16d7f934 100644 --- a/src/common/mekanism/common/TileEntityBasicBlock.java +++ b/src/common/mekanism/common/TileEntityBasicBlock.java @@ -5,8 +5,10 @@ import com.google.common.io.ByteArrayDataInput; import universalelectricity.prefab.tile.TileEntityDisableable; import ic2.api.EnergyNet; import ic2.api.IWrenchable; +import ic2.api.energy.EnergyTileLoadEvent; import mekanism.api.ITileNetwork; import net.minecraft.src.*; +import net.minecraftforge.common.MinecraftForge; public abstract class TileEntityBasicBlock extends TileEntityDisableable implements IWrenchable, ITileNetwork { @@ -27,16 +29,6 @@ public abstract class TileEntityBasicBlock extends TileEntityDisableable impleme { super.updateEntity(); - if(!initialized && worldObj != null) - { - if(Mekanism.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).addTileEntity(this); - } - - initialized = true; - } - onUpdate(); if(!worldObj.isRemote) @@ -137,4 +129,10 @@ public abstract class TileEntityBasicBlock extends TileEntityDisableable impleme { return 1.0F; } + + @Override + public ItemStack getWrenchDrop(EntityPlayer entityPlayer) + { + return new ItemStack(blockType.blockID, 1, blockMetadata); + } } diff --git a/src/common/mekanism/common/TileEntityBasicMachine.java b/src/common/mekanism/common/TileEntityBasicMachine.java index 08b150cd0..d676757a5 100644 --- a/src/common/mekanism/common/TileEntityBasicMachine.java +++ b/src/common/mekanism/common/TileEntityBasicMachine.java @@ -27,15 +27,18 @@ import ic2.api.Direction; import ic2.api.EnergyNet; import ic2.api.IEnergySink; import ic2.api.IWrenchable; +import ic2.api.energy.EnergyTileSinkEvent; +import mekanism.api.IActiveState; import mekanism.api.IElectricMachine; import mekanism.client.Sound; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; +import net.minecraftforge.common.MinecraftForge; -public abstract class TileEntityBasicMachine extends TileEntityElectricBlock implements IElectricMachine, IEnergySink, IJouleStorage, IVoltage, IPeripheral +public abstract class TileEntityBasicMachine extends TileEntityElectricBlock implements IElectricMachine, IEnergySink, IJouleStorage, IVoltage, IPeripheral, IActiveState { /** The Sound instance for this machine. */ @SideOnly(Side.CLIENT) @@ -95,12 +98,19 @@ public abstract class TileEntityBasicMachine extends TileEntityElectricBlock imp @Override public void onUpdate() { + super.onUpdate(); + if(!registered && worldObj != null && !worldObj.isRemote) { Mekanism.manager.register(this); registered = true; } + if(demandsEnergy()) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileSinkEvent(this, (int)((MAX_ELECTRICITY-electricityStored)*Mekanism.TO_IC2))); + } + if(!worldObj.isRemote) { for(ForgeDirection direction : ForgeDirection.values()) @@ -271,6 +281,12 @@ public abstract class TileEntityBasicMachine extends TileEntityElectricBlock imp { return 120; } + + @Override + public boolean getActive() + { + return isActive; + } @Override public void setActive(boolean active) diff --git a/src/common/mekanism/common/TileEntityElectricBlock.java b/src/common/mekanism/common/TileEntityElectricBlock.java index 4b6478659..eb1d4df01 100644 --- a/src/common/mekanism/common/TileEntityElectricBlock.java +++ b/src/common/mekanism/common/TileEntityElectricBlock.java @@ -6,13 +6,17 @@ import buildcraft.api.power.IPowerProvider; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerFramework; import ic2.api.EnergyNet; +import ic2.api.IEnergyTile; import ic2.api.IWrenchable; +import ic2.api.energy.EnergyTileLoadEvent; +import ic2.api.energy.EnergyTileUnloadEvent; import mekanism.api.ITileNetwork; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; +import net.minecraftforge.common.MinecraftForge; -public abstract class TileEntityElectricBlock extends TileEntityContainerBlock implements IWrenchable, ISidedInventory, IInventory, ITileNetwork, IPowerReceptor +public abstract class TileEntityElectricBlock extends TileEntityContainerBlock implements IWrenchable, ISidedInventory, IInventory, ITileNetwork, IPowerReceptor, IEnergyTile { /** How much energy is stored in this block. */ public double electricityStored; @@ -39,6 +43,34 @@ public abstract class TileEntityElectricBlock extends TileEntityContainerBlock i powerProvider.configure(5, 2, 10, 1, maxEnergy/10); } } + + @Override + public void onUpdate() + { + if(!initialized && worldObj != null) + { + if(Mekanism.hooks.IC2Loaded) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); + } + + initialized = true; + } + } + + @Override + public void invalidate() + { + super.invalidate(); + + if(initialized) + { + if(Mekanism.hooks.IC2Loaded) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + } + } + } @Override public void readFromNBT(NBTTagCompound nbtTags) diff --git a/src/common/mekanism/common/TileEntityElectricMachine.java b/src/common/mekanism/common/TileEntityElectricMachine.java index f27d1d9fb..c6533f944 100644 --- a/src/common/mekanism/common/TileEntityElectricMachine.java +++ b/src/common/mekanism/common/TileEntityElectricMachine.java @@ -45,6 +45,7 @@ public abstract class TileEntityElectricMachine extends TileEntityBasicMachine public void onUpdate() { super.onUpdate(); + boolean testActive = operatingTicks > 0; if(inventory[1] != null) @@ -188,17 +189,7 @@ public abstract class TileEntityElectricMachine extends TileEntityBasicMachine return; } - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = RecipeHandler.getOutput(inventory[0], false, getRecipes()).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = RecipeHandler.getOutput(inventory[0], true, getRecipes()).copy(); - } + ItemStack itemstack = RecipeHandler.getOutput(inventory[0], true, getRecipes()); if (inventory[0].stackSize <= 0) { diff --git a/src/common/mekanism/common/TileEntityEnergyCube.java b/src/common/mekanism/common/TileEntityEnergyCube.java index c39c6aed4..ee532c922 100644 --- a/src/common/mekanism/common/TileEntityEnergyCube.java +++ b/src/common/mekanism/common/TileEntityEnergyCube.java @@ -32,16 +32,17 @@ import ic2.api.IEnergySource; import ic2.api.IEnergyStorage; import ic2.api.IWrenchable; import ic2.api.IElectricItem; -import mekanism.api.IEnergyCube.EnumTier; import mekanism.api.EnumGas; +import mekanism.api.IEnergyCube; import mekanism.api.ITileNetwork; +import mekanism.api.Tier.EnergyCubeTier; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; public class TileEntityEnergyCube extends TileEntityElectricBlock implements IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IVoltage, IPeripheral { - public EnumTier tier = EnumTier.BASIC; + public EnergyCubeTier tier = EnergyCubeTier.BASIC; /** Output per tick this machine can transfer. */ public int output; @@ -244,13 +245,13 @@ public class TileEntityEnergyCube extends TileEntityElectricBlock implements IEn @Override public int getStored() { - return (int)(electricityStored*Mekanism.FROM_IC2); + return (int)(electricityStored*Mekanism.TO_IC2); } @Override public int getCapacity() { - return (int)(tier.MAX_ELECTRICITY*Mekanism.FROM_IC2); + return (int)(tier.MAX_ELECTRICITY*Mekanism.TO_IC2); } @Override @@ -407,7 +408,7 @@ public class TileEntityEnergyCube extends TileEntityElectricBlock implements IEn try { facing = dataStream.readInt(); electricityStored = dataStream.readDouble(); - tier = EnumTier.getFromName(dataStream.readUTF()); + tier = EnergyCubeTier.getFromName(dataStream.readUTF()); worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); } catch (Exception e) { @@ -421,7 +422,7 @@ public class TileEntityEnergyCube extends TileEntityElectricBlock implements IEn { super.readFromNBT(nbtTags); - tier = EnumTier.getFromName(nbtTags.getString("tier")); + tier = EnergyCubeTier.getFromName(nbtTags.getString("tier")); } @Override @@ -443,4 +444,37 @@ public class TileEntityEnergyCube extends TileEntityElectricBlock implements IEn { PacketHandler.sendTileEntityPacketToClients(this, 50, facing, electricityStored, tier.name); } + + @Override + public void setStored(int energy) + { + setJoules(energy*Mekanism.FROM_IC2); + } + + @Override + public int addEnergy(int amount) + { + setJoules(electricityStored + amount*Mekanism.FROM_IC2); + return (int)electricityStored; + } + + @Override + public boolean isTeleporterCompatible(Direction side) + { + return side.toForgeDirection() == ForgeDirection.getOrientation(facing); + } + + @Override + public ItemStack getWrenchDrop(EntityPlayer entityPlayer) + { + ItemStack itemStack = new ItemStack(Mekanism.EnergyCube); + + IEnergyCube energyCube = (IEnergyCube)itemStack.getItem(); + energyCube.setTier(itemStack, tier); + + IItemElectric electricItem = (IItemElectric)itemStack.getItem(); + electricItem.setJoules(electricityStored, itemStack); + + return itemStack; + } } diff --git a/src/common/mekanism/common/TileEntitySmeltingFactory.java b/src/common/mekanism/common/TileEntitySmeltingFactory.java new file mode 100644 index 000000000..9a75dfd80 --- /dev/null +++ b/src/common/mekanism/common/TileEntitySmeltingFactory.java @@ -0,0 +1,541 @@ +package mekanism.common; + +import universalelectricity.core.implement.IItemElectric; +import universalelectricity.core.implement.IJouleStorage; +import universalelectricity.core.implement.IVoltage; +import ic2.api.Direction; +import ic2.api.ElectricItem; +import ic2.api.IElectricItem; +import ic2.api.IEnergySink; +import ic2.api.energy.EnergyTileSinkEvent; +import mekanism.api.IActiveState; +import mekanism.api.Tier.EnergyCubeTier; +import mekanism.api.Tier.SmeltingFactoryTier; +import net.minecraft.src.*; +import net.minecraftforge.common.MinecraftForge; + +import com.google.common.io.ByteArrayDataInput; + +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.IPeripheral; + +public class TileEntitySmeltingFactory extends TileEntityElectricBlock implements IEnergySink, IJouleStorage, IVoltage, IPeripheral, IActiveState +{ + /** This Smelting Factory's tier. */ + public SmeltingFactoryTier tier; + + /** An int[] used to track all current operations' progress. */ + public int[] progress; + + /** How many ticks it takes, by default, to run an operation. */ + public int TICKS_REQUIRED = 200; + + /** How much energy each operation consumes per tick. */ + public int ENERGY_PER_TICK = 5; + + /** How many ticks it takes, currently, to run an operation. */ + public int currentTicksRequired; + + /** The current electricity cap this machine can handle. */ + public double currentMaxElectricity; + + /** This machine's previous active state, used for calculating packets. */ + public boolean prevActive; + + /** This machine's active state. */ + public boolean isActive; + + public TileEntitySmeltingFactory() + { + this(SmeltingFactoryTier.BASIC); + } + + public TileEntitySmeltingFactory(SmeltingFactoryTier type) + { + super(type.name + " Smelting Factory", type.processes*1000); + tier = type; + currentTicksRequired = TICKS_REQUIRED; + currentMaxElectricity = MAX_ELECTRICITY; + inventory = new ItemStack[2+type.processes*2]; + progress = new int[type.processes]; + isActive = false; + } + + @Override + public void onUpdate() + { + super.onUpdate(); + + boolean testActive = false; + + for(int i : progress) + { + if(i > 0) + { + testActive = true; + } + } + + if(demandsEnergy()) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileSinkEvent(this, (int)((currentMaxElectricity-electricityStored)*Mekanism.TO_IC2))); + } + + if(inventory[1] != null) + { + if(electricityStored < currentMaxElectricity) + { + if(inventory[1].getItem() instanceof IItemElectric) + { + IItemElectric electricItem = (IItemElectric)inventory[1].getItem(); + + if (electricItem.canProduceElectricity()) + { + double joulesNeeded = currentMaxElectricity-electricityStored; + double joulesReceived = 0; + + if(electricItem.getVoltage() <= joulesNeeded) + { + joulesReceived = electricItem.onUse(electricItem.getVoltage(), inventory[1]); + } + else if(electricItem.getVoltage() > joulesNeeded) + { + joulesReceived = electricItem.onUse(joulesNeeded, inventory[1]); + } + + setJoules(electricityStored + joulesReceived); + } + } + else if(inventory[1].getItem() instanceof IElectricItem) + { + IElectricItem item = (IElectricItem)inventory[1].getItem(); + if(item.canProvideEnergy()) + { + double gain = ElectricItem.discharge(inventory[1], (int)((MAX_ELECTRICITY - electricityStored)*Mekanism.TO_IC2), 3, false, false)*Mekanism.FROM_IC2; + setJoules(electricityStored + gain); + } + } + } + if(inventory[1].itemID == Item.redstone.shiftedIndex && electricityStored <= (currentMaxElectricity-1000)) + { + setJoules(electricityStored + 1000); + --inventory[1].stackSize; + + if (inventory[1].stackSize <= 0) + { + inventory[1] = null; + } + } + } + + if(inventory[0] != null) + { + int energyToAdd = 0; + int ticksToRemove = 0; + + if(inventory[0].isItemEqual(new ItemStack(Mekanism.SpeedUpgrade))) + { + if(currentTicksRequired == TICKS_REQUIRED) + { + ticksToRemove = 150; + } + } + else if(inventory[0].isItemEqual(new ItemStack(Mekanism.EnergyUpgrade))) + { + if(currentMaxElectricity == MAX_ELECTRICITY) + { + energyToAdd = 600; + } + } + else if(inventory[0].isItemEqual(new ItemStack(Mekanism.UltimateUpgrade))) + { + if(currentTicksRequired == TICKS_REQUIRED) + { + ticksToRemove = 150; + } + if(currentMaxElectricity == MAX_ELECTRICITY) + { + energyToAdd = 600; + } + } + + currentMaxElectricity += energyToAdd; + currentTicksRequired -= ticksToRemove; + } + else if(inventory[0] == null) + { + currentTicksRequired = TICKS_REQUIRED; + currentMaxElectricity = MAX_ELECTRICITY; + } + + for(int mainSlot = 0; mainSlot < tier.processes; mainSlot++) + { + if(canOperate(getInputSlot(mainSlot), getOutputSlot(mainSlot)) && (progress[mainSlot]+1) < currentTicksRequired) + { + ++progress[mainSlot]; + electricityStored -= ENERGY_PER_TICK; + } + else if(canOperate(getInputSlot(mainSlot), getOutputSlot(mainSlot)) && (progress[mainSlot]+1) >= currentTicksRequired) + { + if(!worldObj.isRemote) + { + operate(getInputSlot(mainSlot), getOutputSlot(mainSlot)); + } + progress[mainSlot] = 0; + electricityStored -= ENERGY_PER_TICK; + } + + if(electricityStored < 0) + { + electricityStored = 0; + } + + if(electricityStored > currentMaxElectricity) + { + electricityStored = currentMaxElectricity; + } + + if(!canOperate(getInputSlot(mainSlot), getOutputSlot(mainSlot))) + { + progress[mainSlot] = 0; + } + } + + if(!worldObj.isRemote) + { + boolean newActive = false; + boolean hasOperation = false; + + for(int i = 0; i < tier.processes; i++) + { + if(canOperate(getInputSlot(i), getOutputSlot(i))) + { + hasOperation = true; + } + } + + for(int i : progress) + { + if(i > 0) + { + newActive = true; + } + } + + if(testActive != newActive) + { + if(newActive) + { + setActive(true); + } + + else if(!hasOperation) + { + setActive(false); + } + } + } + } + + public int getScaledProgress(int i, int process) + { + return progress[process]*i / currentTicksRequired; + } + + /** + * Gets the scaled energy level for the GUI. + * @param i - multiplier + * @return scaled energy + */ + public int getScaledEnergyLevel(int i) + { + return (int)(electricityStored*i / currentMaxElectricity); + } + + public boolean canOperate(int inputSlot, int outputSlot) + { + if (inventory[inputSlot] == null) + { + return false; + } + + if(electricityStored < ENERGY_PER_TICK) + { + return false; + } + + ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(inventory[inputSlot]).copy(); + + if (itemstack == null) + { + return false; + } + + if (inventory[outputSlot] == null) + { + return true; + } + + if (!inventory[outputSlot].isItemEqual(itemstack)) + { + return false; + } + else + { + return inventory[outputSlot].stackSize + itemstack.stackSize <= inventory[outputSlot].getMaxStackSize(); + } + } + + public void operate(int inputSlot, int outputSlot) + { + if (!canOperate(inputSlot, outputSlot)) + { + return; + } + + ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(inventory[inputSlot]).copy(); + + inventory[inputSlot].stackSize--; + + if (inventory[inputSlot].stackSize <= 0) + { + inventory[inputSlot] = null; + } + + if (inventory[outputSlot] == null) + { + inventory[outputSlot] = itemstack; + } + else + { + inventory[outputSlot].stackSize += itemstack.stackSize; + } + } + + @Override + public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try { + facing = dataStream.readInt(); + electricityStored = dataStream.readDouble(); + currentTicksRequired = dataStream.readInt(); + currentMaxElectricity = dataStream.readDouble(); + isActive = dataStream.readBoolean(); + + for(int i = 0; i < tier.processes; i++) + { + progress[i] = dataStream.readInt(); + } + + worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord); + } catch (Exception e) + { + System.out.println("[Mekanism] Error while handling tile entity packet."); + e.printStackTrace(); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbtTags) + { + super.readFromNBT(nbtTags); + + currentTicksRequired = nbtTags.getInteger("currentTicksRequired"); + currentMaxElectricity = nbtTags.getDouble("currentMaxElectricity"); + isActive = nbtTags.getBoolean("isActive"); + + for(int i = 0; i < tier.processes; i++) + { + progress[i] = nbtTags.getInteger("progress" + i); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbtTags) + { + super.writeToNBT(nbtTags); + + nbtTags.setInteger("currentTicksRequired", currentTicksRequired); + nbtTags.setDouble("currentMaxElectricity", currentMaxElectricity); + nbtTags.setBoolean("isActive", isActive); + + for(int i = 0; i < tier.processes; i++) + { + nbtTags.setInteger("progress" + i, progress[i]); + } + } + + @Override + public void sendPacket() + { + PacketHandler.sendTileEntityPacketToClients(this, 0, facing, electricityStored, currentTicksRequired, currentMaxElectricity, isActive, progress); + } + + @Override + public void sendPacketWithRange() + { + PacketHandler.sendTileEntityPacketToClients(this, 50, facing, electricityStored, currentTicksRequired, currentMaxElectricity, isActive, progress); + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, Direction direction) + { + return true; + } + + public int getInputSlot(int operation) + { + return (operation+operation)+2; + } + + public int getOutputSlot(int operation) + { + return (operation+operation)+3; + } + + @Override + public String getType() + { + return getInvName(); + } + + @Override + public String[] getMethodNames() + { + return new String[] {"getStored", "getProgress", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"}; + } + + @Override + public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception + { + switch(method) + { + case 0: + return new Object[] {electricityStored}; + case 1: + if(arguments[0] == null) + { + return new Object[] {"Please provide a target operation."}; + } + + if(!(arguments[0] instanceof Double) && !(arguments[0] instanceof Integer)) + { + return new Object[] {"Invalid characters."}; + } + + if((Integer)arguments[0] < 0 || (Integer)arguments[0] > progress.length) + { + return new Object[] {"No such operation found."}; + } + + return new Object[] {progress[(Integer)arguments[0]]}; + case 2: + return new Object[] {facing}; + case 3: + if(arguments[0] == null) + { + return new Object[] {"Please provide a target operation."}; + } + + if(!(arguments[0] instanceof Double) && !(arguments[0] instanceof Integer)) + { + return new Object[] {"Invalid characters."}; + } + + if((Integer)arguments[0] < 0 || (Integer)arguments[0] > progress.length) + { + return new Object[] {"No such operation found."}; + } + + return new Object[] {canOperate(getInputSlot((Integer)arguments[0]), getOutputSlot((Integer)arguments[0]))}; + case 4: + return new Object[] {currentMaxElectricity}; + case 5: + return new Object[] {(currentMaxElectricity-electricityStored)}; + default: + System.err.println("[Mekanism] Attempted to call unknown method with computer ID " + computer.getID()); + return new Object[] {"Unknown command."}; + } + } + + @Override + public boolean canAttachToSide(int side) + { + return true; + } + + @Override + public void attach(IComputerAccess computer, String computerSide) {} + + @Override + public void detach(IComputerAccess computer) {} + + @Override + public double getVoltage() + { + return 120; + } + + @Override + public double getJoules(Object... data) + { + return electricityStored; + } + + @Override + public void setJoules(double joules, Object... data) + { + electricityStored = Math.max(Math.min(joules, getMaxJoules()), 0); + } + + @Override + public double getMaxJoules(Object... data) + { + return currentMaxElectricity; + } + + @Override + public boolean demandsEnergy() + { + return electricityStored < currentMaxElectricity; + } + + @Override + public void setActive(boolean active) + { + isActive = active; + + if(prevActive != active) + { + sendPacket(); + } + + prevActive = active; + } + + @Override + public boolean getActive() + { + return isActive; + } + + @Override + public int injectEnergy(Direction direction, int i) + { + double givenEnergy = i*Mekanism.FROM_IC2; + double rejects = 0; + double neededEnergy = currentMaxElectricity-electricityStored; + + if(givenEnergy < neededEnergy) + { + electricityStored += givenEnergy; + } + else if(givenEnergy > neededEnergy) + { + electricityStored += neededEnergy; + rejects = givenEnergy-neededEnergy; + } + + return (int)(rejects*Mekanism.TO_IC2); + } +} diff --git a/src/common/mekanism/common/TileEntityUltimateSmeltingFactory.java b/src/common/mekanism/common/TileEntityUltimateSmeltingFactory.java new file mode 100644 index 000000000..d61778090 --- /dev/null +++ b/src/common/mekanism/common/TileEntityUltimateSmeltingFactory.java @@ -0,0 +1,11 @@ +package mekanism.common; + +import mekanism.api.Tier.SmeltingFactoryTier; + +public class TileEntityUltimateSmeltingFactory extends TileEntitySmeltingFactory +{ + public TileEntityUltimateSmeltingFactory() + { + super(SmeltingFactoryTier.ULTIMATE); + } +} diff --git a/src/common/mekanism/generators/common/BlockGenerator.java b/src/common/mekanism/generators/common/BlockGenerator.java index 5ac289456..c2d05fcf3 100644 --- a/src/common/mekanism/generators/common/BlockGenerator.java +++ b/src/common/mekanism/generators/common/BlockGenerator.java @@ -329,11 +329,6 @@ public class BlockGenerator extends BlockContainer world.spawnEntityInWorld(entityItem); } - if(Mekanism.hooks.IC2Loaded) - { - EnergyNet.getForWorld(tileEntity.worldObj).removeTileEntity(tileEntity); - } - if(tileEntity instanceof IMultiBlock) { ((IMultiBlock)tileEntity).onDestroy(tileEntity); @@ -367,7 +362,7 @@ public class BlockGenerator extends BlockContainer { if(!entityplayer.isSneaking()) { - entityplayer.openGui(MekanismGenerators.instance, GeneratorType.getGuiID(metadata), world, x, y, z); + entityplayer.openGui(MekanismGenerators.instance, GeneratorType.getFromMetadata(metadata).guiId, world, x, y, z); return true; } } @@ -389,33 +384,7 @@ public class BlockGenerator extends BlockContainer @Override public TileEntity createNewTileEntity(World world, int metadata) { - if(metadata == GeneratorType.HEAT_GENERATOR.meta) - { - return new TileEntityHeatGenerator(); - } - else if(metadata == GeneratorType.SOLAR_GENERATOR.meta) - { - return new TileEntitySolarGenerator(); - } - else if(metadata == GeneratorType.ELECTROLYTIC_SEPARATOR.meta) - { - return new TileEntityElectrolyticSeparator(); - } - else if(metadata == GeneratorType.HYDROGEN_GENERATOR.meta) - { - return new TileEntityHydrogenGenerator(); - } - else if(metadata == GeneratorType.BIO_GENERATOR.meta) - { - return new TileEntityBioGenerator(); - } - else if(metadata == GeneratorType.ADVANCED_SOLAR_GENERATOR.meta) - { - return new TileEntityAdvancedSolarGenerator(); - } - else { - return null; - } + return GeneratorType.getFromMetadata(metadata).create(); } @Override @@ -473,25 +442,43 @@ public class BlockGenerator extends BlockContainer public static enum GeneratorType { - HEAT_GENERATOR(0, 0), - SOLAR_GENERATOR(1, 1), - ELECTROLYTIC_SEPARATOR(2, 2), - HYDROGEN_GENERATOR(3, 3), - BIO_GENERATOR(4, 4), - ADVANCED_SOLAR_GENERATOR(5, 1); + HEAT_GENERATOR(0, 0, TileEntityHeatGenerator.class, true), + SOLAR_GENERATOR(1, 1, TileEntitySolarGenerator.class, false), + ELECTROLYTIC_SEPARATOR(2, 2, TileEntityElectrolyticSeparator.class, true), + HYDROGEN_GENERATOR(3, 3, TileEntityHydrogenGenerator.class, true), + BIO_GENERATOR(4, 4, TileEntityBioGenerator.class, true), + ADVANCED_SOLAR_GENERATOR(5, 1, TileEntityAdvancedSolarGenerator.class, true); public int meta; public int guiId; + public Class tileEntityClass; + public boolean hasModel; - private GeneratorType(int i, int j) + private GeneratorType(int i, int j, Class tileClass, boolean model) { meta = i; guiId = j; + tileEntityClass = tileClass; + hasModel = model; } - public static int getGuiID(int meta) + public static GeneratorType getFromMetadata(int meta) { - return values()[meta].guiId; + return values()[meta]; + } + + public TileEntity create() + { + TileEntity tileEntity; + + try { + tileEntity = tileEntityClass.newInstance(); + return tileEntity; + } catch(Exception e) { + System.err.println("[Mekanism] Unable to indirectly create tile entity."); + e.printStackTrace(); + return null; + } } @Override diff --git a/src/common/mekanism/generators/common/GeneratorsCommonProxy.java b/src/common/mekanism/generators/common/GeneratorsCommonProxy.java index 1d50b87ed..81919480c 100644 --- a/src/common/mekanism/generators/common/GeneratorsCommonProxy.java +++ b/src/common/mekanism/generators/common/GeneratorsCommonProxy.java @@ -26,6 +26,9 @@ public class GeneratorsCommonProxy { GameRegistry.registerTileEntity(TileEntityAdvancedSolarGenerator.class, "AdvancedSolarGenerator"); GameRegistry.registerTileEntity(TileEntityBioGenerator.class, "BioGenerator"); + GameRegistry.registerTileEntity(TileEntityHeatGenerator.class, "HeatGenerator"); + GameRegistry.registerTileEntity(TileEntityHydrogenGenerator.class, "HydrogenGenerator"); + GameRegistry.registerTileEntity(TileEntityElectrolyticSeparator.class, "ElectrolyticSeparator"); } /** diff --git a/src/common/mekanism/generators/common/MekanismGenerators.java b/src/common/mekanism/generators/common/MekanismGenerators.java index 9e7d5874b..c7c9af35f 100644 --- a/src/common/mekanism/generators/common/MekanismGenerators.java +++ b/src/common/mekanism/generators/common/MekanismGenerators.java @@ -138,10 +138,7 @@ public class MekanismGenerators public void addEntities() { - GameRegistry.registerTileEntity(TileEntityHeatGenerator.class, "HeatGenerator"); GameRegistry.registerTileEntity(TileEntitySolarGenerator.class, "SolarGenerator"); - GameRegistry.registerTileEntity(TileEntityElectrolyticSeparator.class, "ElectrolyticSeparator"); - GameRegistry.registerTileEntity(TileEntityHydrogenGenerator.class, "HydrogenGenerator"); } public void addBlocks() diff --git a/src/common/mekanism/generators/common/TileEntityBioGenerator.java b/src/common/mekanism/generators/common/TileEntityBioGenerator.java index 6338929e9..3e19806a0 100644 --- a/src/common/mekanism/generators/common/TileEntityBioGenerator.java +++ b/src/common/mekanism/generators/common/TileEntityBioGenerator.java @@ -89,6 +89,7 @@ public class TileEntityBioGenerator extends TileEntityGenerator implements ITank } int fuel = getFuel(inventory[0]); + ItemStack prevStack = inventory[0].copy(); if(fuel > 0) { int fuelNeeded = bioFuelSlot.MAX_LIQUID - bioFuelSlot.liquidStored; @@ -98,6 +99,11 @@ public class TileEntityBioGenerator extends TileEntityGenerator implements ITank --inventory[0].stackSize; } + if(prevStack.itemID == Mekanism.hooks.ForestryBiofuelBucket.itemID) + { + inventory[0] = Mekanism.hooks.ForestryBiofuelBucket; + } + if(inventory[0].stackSize == 0) { inventory[0] = null; diff --git a/src/common/mekanism/generators/common/TileEntityElectrolyticSeparator.java b/src/common/mekanism/generators/common/TileEntityElectrolyticSeparator.java index 1d43c4ebb..cd56da527 100644 --- a/src/common/mekanism/generators/common/TileEntityElectrolyticSeparator.java +++ b/src/common/mekanism/generators/common/TileEntityElectrolyticSeparator.java @@ -6,6 +6,7 @@ import ic2.api.Direction; import ic2.api.ElectricItem; import ic2.api.IElectricItem; import ic2.api.IEnergySink; +import ic2.api.energy.EnergyTileSinkEvent; import universalelectricity.core.electricity.ElectricInfo; import universalelectricity.core.electricity.ElectricityConnections; @@ -30,6 +31,7 @@ import mekanism.common.PacketHandler; import mekanism.common.TileEntityElectricBlock; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.liquids.ILiquidTank; import net.minecraftforge.liquids.ITankContainer; import net.minecraftforge.liquids.LiquidStack; @@ -65,6 +67,13 @@ public class TileEntityElectrolyticSeparator extends TileEntityElectricBlock imp @Override public void onUpdate() { + super.onUpdate(); + + if(demandsEnergy()) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileSinkEvent(this, (int)((MAX_ELECTRICITY-electricityStored)*Mekanism.TO_IC2))); + } + if(hydrogenStored > MAX_GAS) { hydrogenStored = MAX_GAS; diff --git a/src/common/mekanism/generators/common/TileEntityGenerator.java b/src/common/mekanism/generators/common/TileEntityGenerator.java index 9e0dc7030..1010c62c8 100644 --- a/src/common/mekanism/generators/common/TileEntityGenerator.java +++ b/src/common/mekanism/generators/common/TileEntityGenerator.java @@ -27,13 +27,14 @@ import universalelectricity.core.implement.IVoltage; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.tile.TileEntityConductor; +import mekanism.api.IActiveState; import mekanism.common.Mekanism; import mekanism.common.TileEntityElectricBlock; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; -public abstract class TileEntityGenerator extends TileEntityElectricBlock implements IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IVoltage, IPeripheral +public abstract class TileEntityGenerator extends TileEntityElectricBlock implements IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IVoltage, IPeripheral, IActiveState { /** Output per tick this generator can transfer. */ public int output; @@ -61,17 +62,13 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem output = out; isActive = false; - - if(PowerFramework.currentFramework != null) - { - powerProvider = PowerFramework.currentFramework.createPowerProvider(); - powerProvider.configure(0, 2, 2000, 1, (int)(MAX_ELECTRICITY*Mekanism.TO_BC)); - } } @Override public void onUpdate() { + super.onUpdate(); + if(electricityStored > 0) { TileEntity tileEntity = Vector3.getTileEntityFromSide(worldObj, Vector3.get(this), ForgeDirection.getOrientation(facing)); @@ -151,10 +148,13 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem return (int)(electricityStored*i / MAX_ELECTRICITY); } - /** - * Sets this block's active state to a new value. - * @param active - new active state - */ + @Override + public boolean getActive() + { + return isActive; + } + + @Override public void setActive(boolean active) { isActive = active; @@ -245,13 +245,13 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem @Override public int getStored() { - return (int)(electricityStored*Mekanism.FROM_IC2); + return (int)(electricityStored*Mekanism.TO_IC2); } @Override public int getCapacity() { - return (int)(MAX_ELECTRICITY*Mekanism.FROM_IC2); + return (int)(MAX_ELECTRICITY*Mekanism.TO_IC2); } @Override @@ -260,6 +260,25 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem return output; } + @Override + public boolean isTeleporterCompatible(Direction side) + { + return side.toForgeDirection() == ForgeDirection.getOrientation(facing); + } + + @Override + public int addEnergy(int amount) + { + setJoules(electricityStored + amount*Mekanism.FROM_IC2); + return (int)electricityStored; + } + + @Override + public void setStored(int energy) + { + setJoules(energy*Mekanism.FROM_IC2); + } + @Override public void readFromNBT(NBTTagCompound nbtTags) { diff --git a/src/common/mekanism/generators/common/TileEntityHeatGenerator.java b/src/common/mekanism/generators/common/TileEntityHeatGenerator.java index 38b3223c2..81aaeff29 100644 --- a/src/common/mekanism/generators/common/TileEntityHeatGenerator.java +++ b/src/common/mekanism/generators/common/TileEntityHeatGenerator.java @@ -92,6 +92,7 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements ITan } int fuel = getFuel(inventory[0]); + ItemStack prevStack = inventory[0].copy(); if(fuel > 0) { int fuelNeeded = fuelSlot.MAX_LIQUID - fuelSlot.liquidStored; @@ -99,6 +100,11 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements ITan { fuelSlot.liquidStored += fuel; --inventory[0].stackSize; + + if(prevStack.itemID == Mekanism.hooks.BuildCraftFuelBucket.itemID) + { + inventory[0] = Mekanism.hooks.BuildCraftFuelBucket; + } } if(inventory[0].stackSize == 0) diff --git a/src/minecraft/mekanism/client/ClientProxy.java b/src/minecraft/mekanism/client/ClientProxy.java index 983cb7643..46a50d873 100644 --- a/src/minecraft/mekanism/client/ClientProxy.java +++ b/src/minecraft/mekanism/client/ClientProxy.java @@ -27,6 +27,7 @@ import mekanism.common.TileEntityEnrichmentChamber; import mekanism.common.TileEntityGasTank; import mekanism.common.TileEntityPlatinumCompressor; import mekanism.common.TileEntityEnergyCube; +import mekanism.common.TileEntitySmeltingFactory; import mekanism.common.TileEntityTheoreticalElementizer; import net.minecraft.client.Minecraft; import net.minecraft.src.*; @@ -129,6 +130,8 @@ public class ClientProxy extends CommonProxy return new GuiControlPanel((TileEntityControlPanel)tileEntity, player, world); case 10: return new GuiGasTank(player.inventory, (TileEntityGasTank)tileEntity); + case 11: + return new GuiSmeltingFactory(player.inventory, (TileEntitySmeltingFactory)tileEntity); } return null; } diff --git a/src/minecraft/mekanism/client/GuiSmeltingFactory.java b/src/minecraft/mekanism/client/GuiSmeltingFactory.java new file mode 100644 index 000000000..ee7622348 --- /dev/null +++ b/src/minecraft/mekanism/client/GuiSmeltingFactory.java @@ -0,0 +1,77 @@ +package mekanism.client; + +import org.lwjgl.opengl.GL11; + +import mekanism.api.Tier.SmeltingFactoryTier; +import mekanism.common.ContainerElectricMachine; +import mekanism.common.ContainerSmeltingFactory; +import mekanism.common.TileEntityElectricMachine; +import mekanism.common.TileEntitySmeltingFactory; +import net.minecraft.src.*; + +public class GuiSmeltingFactory extends GuiContainer +{ + public TileEntitySmeltingFactory tileEntity; + + public GuiSmeltingFactory(InventoryPlayer inventory, TileEntitySmeltingFactory tentity) + { + super(new ContainerSmeltingFactory(inventory, tentity)); + tileEntity = tentity; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + fontRenderer.drawString(tileEntity.fullName, 34, 4, 0x404040); + fontRenderer.drawString("Inventory", 8, (ySize - 93) + 2, 0x404040); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + int texture = mc.renderEngine.getTexture("/resources/mekanism/gui/smelting/" + tileEntity.tier.guiTexturePath); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.renderEngine.bindTexture(texture); + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + int displayInt; + + displayInt = tileEntity.getScaledEnergyLevel(52); + drawTexturedModalRect(guiWidth + 165, guiHeight + 17 + 52 - displayInt, 176, 52 - displayInt, 4, displayInt); + + if(tileEntity.tier == SmeltingFactoryTier.BASIC) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 59 + (i*38); + + displayInt = tileEntity.getScaledProgress(20, i); + drawTexturedModalRect(guiWidth + xAxis, guiHeight + 33, 176, 52, 8, displayInt); + } + } + + if(tileEntity.tier == SmeltingFactoryTier.ADVANCED) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 39 + (i*26); + + displayInt = tileEntity.getScaledProgress(20, i); + drawTexturedModalRect(guiWidth + xAxis, guiHeight + 33, 176, 52, 8, displayInt); + } + } + + if(tileEntity.tier == SmeltingFactoryTier.ULTIMATE) + { + for(int i = 0; i < tileEntity.tier.processes; i++) + { + int xAxis = 33 + (i*19); + + displayInt = tileEntity.getScaledProgress(20, i); + drawTexturedModalRect(guiWidth + xAxis, guiHeight + 33, 176, 52, 8, displayInt); + } + } + } +} diff --git a/src/minecraft/mekanism/client/ItemRenderingHandler.java b/src/minecraft/mekanism/client/ItemRenderingHandler.java index 7596e6ed7..8d2721269 100644 --- a/src/minecraft/mekanism/client/ItemRenderingHandler.java +++ b/src/minecraft/mekanism/client/ItemRenderingHandler.java @@ -5,7 +5,7 @@ import java.util.Random; import org.lwjgl.opengl.GL11; import mekanism.api.IEnergyCube; -import mekanism.api.IEnergyCube.EnumTier; +import mekanism.api.Tier.EnergyCubeTier; import mekanism.common.Mekanism; import net.minecraft.src.*; import net.minecraftforge.client.ForgeHooksClient; @@ -28,7 +28,7 @@ public class ItemRenderingHandler implements IItemRenderer @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - EnumTier tier = ((IEnergyCube)item.getItem()).getTier(item); + EnergyCubeTier tier = ((IEnergyCube)item.getItem()).getTier(item); ForgeHooksClient.bindTexture(item.getItem().getTextureFile(), 0); @@ -37,7 +37,7 @@ public class ItemRenderingHandler implements IItemRenderer GL11.glTranslatef(0.5F, 0.5F, 0.5F); } - renderItem((RenderBlocks)data[0], tier == EnumTier.BASIC ? 0 : (tier == EnumTier.ADVANCED ? 1 : (tier == EnumTier.ULTIMATE ? 2 : 0))); + renderItem((RenderBlocks)data[0], tier == EnergyCubeTier.BASIC ? 0 : (tier == EnergyCubeTier.ADVANCED ? 1 : (tier == EnergyCubeTier.ULTIMATE ? 2 : 0))); } /** diff --git a/src/minecraft/mekanism/generators/client/BlockRenderingHandler.java b/src/minecraft/mekanism/generators/client/BlockRenderingHandler.java index d392a083f..367f3e3a1 100644 --- a/src/minecraft/mekanism/generators/client/BlockRenderingHandler.java +++ b/src/minecraft/mekanism/generators/client/BlockRenderingHandler.java @@ -17,8 +17,11 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; public class BlockRenderingHandler implements ISimpleBlockRenderingHandler { - public ModelAdvancedSolarGenerator solarGenerator = new ModelAdvancedSolarGenerator(); + public ModelAdvancedSolarGenerator advancedSolarGenerator = new ModelAdvancedSolarGenerator(); public ModelBioGenerator bioGenerator = new ModelBioGenerator(); + public ModelHeatGenerator heatGenerator = new ModelHeatGenerator(); + public ModelHydrogenGenerator hydrogenGenerator = new ModelHydrogenGenerator(); + public ModelElectrolyticSeparator electrolyticSeparator = new ModelElectrolyticSeparator(); @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) @@ -28,7 +31,7 @@ public class BlockRenderingHandler implements ISimpleBlockRenderingHandler if(block.blockID == MekanismGenerators.generatorID) { - if(metadata == 4) + if(metadata == GeneratorType.BIO_GENERATOR.meta) { GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90F, 0.0F, -1.0F, 0.0F); @@ -36,13 +39,36 @@ public class BlockRenderingHandler implements ISimpleBlockRenderingHandler GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/resources/mekanism/render/BioGenerator.png")); bioGenerator.render(0.0625F); } - else if(metadata == 5) + else if(metadata == GeneratorType.ADVANCED_SOLAR_GENERATOR.meta) { GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(0.0F, 0.3F, 0.0F); GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/resources/mekanism/render/AdvancedSolarGenerator.png")); - solarGenerator.render(0.0F, 0.022F); + advancedSolarGenerator.render(0.0F, 0.022F); + } + else if(metadata == GeneratorType.HEAT_GENERATOR.meta) + { + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90F, 0.0F, -1.0F, 0.0F); + GL11.glTranslated(0.0F, -1.0F, 0.0F); + GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/resources/mekanism/render/HeatGenerator.png")); + heatGenerator.render(0.0625F); + } + else if(metadata == GeneratorType.HYDROGEN_GENERATOR.meta) + { + GL11.glRotatef(180F, 0.0F, 1.0F, 1.0F); + GL11.glRotatef(90F, -1.0F, 0.0F, 0.0F); + GL11.glTranslated(0.0F, -1.0F, 0.0F); + GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/resources/mekanism/render/HydrogenGenerator.png")); + hydrogenGenerator.render(0.0625F); + } + else if(metadata == GeneratorType.ELECTROLYTIC_SEPARATOR.meta) + { + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glTranslated(0.0F, -1.0F, 0.0F); + GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/resources/mekanism/render/ElectrolyticSeparator.png")); + electrolyticSeparator.render(0.0625F); } else { ForgeHooksClient.bindTexture(block.getTextureFile(), 0); @@ -60,7 +86,7 @@ public class BlockRenderingHandler implements ISimpleBlockRenderingHandler { int metadata = world.getBlockMetadata(x, y, z); - if(metadata != 4 && metadata != 5) + if(!GeneratorType.getFromMetadata(metadata).hasModel) { renderer.renderStandardBlock(block, x, y, z); renderer.func_83018_a(block); diff --git a/src/minecraft/mekanism/generators/client/GeneratorsClientProxy.java b/src/minecraft/mekanism/generators/client/GeneratorsClientProxy.java index 02d81eba0..c6040d004 100644 --- a/src/minecraft/mekanism/generators/client/GeneratorsClientProxy.java +++ b/src/minecraft/mekanism/generators/client/GeneratorsClientProxy.java @@ -25,6 +25,9 @@ public class GeneratorsClientProxy extends GeneratorsCommonProxy { ClientRegistry.registerTileEntity(TileEntityAdvancedSolarGenerator.class, "AdvancedSolarGenerator", new RenderAdvancedSolarGenerator(new ModelAdvancedSolarGenerator())); ClientRegistry.registerTileEntity(TileEntityBioGenerator.class, "BioGenerator", new RenderBioGenerator()); + ClientRegistry.registerTileEntity(TileEntityHeatGenerator.class, "HeatGenerator", new RenderHeatGenerator()); + ClientRegistry.registerTileEntity(TileEntityHydrogenGenerator.class, "HydrogenGenerator", new RenderHydrogenGenerator()); + ClientRegistry.registerTileEntity(TileEntityElectrolyticSeparator.class, "ElectrolyticSeparator", new RenderElectrolyticSeparator()); } @Override diff --git a/src/minecraft/mekanism/generators/client/GuiElectrolyticSeparator.java b/src/minecraft/mekanism/generators/client/GuiElectrolyticSeparator.java index e12feff82..04e9b35da 100644 --- a/src/minecraft/mekanism/generators/client/GuiElectrolyticSeparator.java +++ b/src/minecraft/mekanism/generators/client/GuiElectrolyticSeparator.java @@ -2,6 +2,8 @@ package mekanism.generators.client; import org.lwjgl.opengl.GL11; +import cpw.mods.fml.client.FMLClientHandler; + import mekanism.api.EnumGas; import mekanism.common.MekanismUtils; import mekanism.common.PacketHandler; @@ -23,21 +25,15 @@ public class GuiElectrolyticSeparator extends GuiContainer tileEntity = tentity; } - /*@Override - public void initGui() - { - controlList.clear(); - controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 96 + 12, "")); - } - @Override - protected void actionPerformed(GuiButton guibutton) - { - if(!guibutton.enabled) - { - return; - } - if(guibutton.id == 1) + protected void mouseClicked(int x, int y, int button) + { + super.mouseClicked(x, y, button); + + int xAxis = (x - (width - xSize) / 2); + int yAxis = (y - (height - ySize) / 2); + + if(xAxis > 160 && xAxis < 169 && yAxis > 73 && yAxis < 82) { if(tileEntity.outputType == EnumGas.OXYGEN) { @@ -49,16 +45,16 @@ public class GuiElectrolyticSeparator extends GuiContainer } PacketHandler.sendTileEntityPacketToServer(tileEntity, tileEntity.outputType.name); - - outputButton.displayString = tileEntity.outputType.name; + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); } - }*/ + } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { fontRenderer.drawString(tileEntity.fullName, 45, 6, 0x404040); fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040); + fontRenderer.drawString("Output", 124, 73, 0x404040); } @Override @@ -70,6 +66,9 @@ public class GuiElectrolyticSeparator extends GuiContainer guiWidth = (width - xSize) / 2; guiHeight = (height - ySize) / 2; drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + drawTexturedModalRect(guiWidth + 160, guiHeight + 73, 176, (tileEntity.outputType == EnumGas.OXYGEN ? 82 : 90), 8, 8); + int displayInt; displayInt = tileEntity.getScaledWaterLevel(52); diff --git a/src/minecraft/mekanism/generators/client/ModelElectrolyticSeparator.java b/src/minecraft/mekanism/generators/client/ModelElectrolyticSeparator.java new file mode 100644 index 000000000..7a7568100 --- /dev/null +++ b/src/minecraft/mekanism/generators/client/ModelElectrolyticSeparator.java @@ -0,0 +1,234 @@ +package mekanism.generators.client; + +import net.minecraft.src.*; + +public class ModelElectrolyticSeparator extends ModelBase +{ + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + ModelRenderer H; + ModelRenderer I; + ModelRenderer J; + ModelRenderer K; + ModelRenderer L; + ModelRenderer M; + ModelRenderer N; + ModelRenderer OUTPUT; + ModelRenderer P; + ModelRenderer Q; + ModelRenderer R; + ModelRenderer S; + ModelRenderer T; + ModelRenderer U; + ModelRenderer V; + + public ModelElectrolyticSeparator() + { + textureWidth = 128; + textureHeight = 128; + + A = new ModelRenderer(this, 0, 0); + A.addBox(-8F, 0F, -8F, 16, 1, 16); + A.setRotationPoint(0F, 23F, 0F); + A.setTextureSize(128, 128); + A.mirror = true; + setRotation(A, 0F, 0F, 0F); + B = new ModelRenderer(this, 85, 0); + B.addBox(-2F, 0F, -2F, 4, 10, 4); + B.setRotationPoint(4F, 12F, -4F); + B.setTextureSize(128, 128); + B.mirror = true; + setRotation(B, 0F, 1.570796F, 0F); + C = new ModelRenderer(this, 66, 0); + C.addBox(-2F, 0F, -2F, 4, 10, 4); + C.setRotationPoint(-4F, 12F, -4F); + C.setTextureSize(128, 128); + C.mirror = true; + setRotation(C, 0F, 1.570796F, 0F); + D = new ModelRenderer(this, 48, 19); + D.addBox(-1F, -1F, 0F, 2, 2, 6); + D.setRotationPoint(-2F, 18F, -4F); + D.setTextureSize(128, 128); + D.mirror = true; + setRotation(D, 0F, 1.570796F, 0F); + E = new ModelRenderer(this, 0, 19); + E.addBox(0F, 0F, -6F, 4, 15, 14); + E.setRotationPoint(0F, 8F, 8F); + E.setTextureSize(128, 128); + E.mirror = true; + setRotation(E, 0F, 1.570796F, 0F); + F = new ModelRenderer(this, 103, 0); + F.addBox(-3F, -1F, -1F, 6, 2, 2); + F.setRotationPoint(4F, 20F, 1F); + F.setTextureSize(128, 128); + F.mirror = true; + setRotation(F, 0F, 1.570796F, 0F); + G = new ModelRenderer(this, 103, 0); + G.addBox(-3F, 0F, 0F, 6, 2, 2); + G.setRotationPoint(-5F, 20F, 1F); + G.setTextureSize(128, 128); + G.mirror = true; + setRotation(G, 0F, 1.570796F, 0F); + H = new ModelRenderer(this, 0, 50); + H.addBox(-2F, 0F, 0F, 4, 12, 2); + H.setRotationPoint(-8F, 11F, 6F); + H.setTextureSize(128, 128); + H.mirror = true; + setRotation(H, 0F, 1.570796F, 0F); + I = new ModelRenderer(this, 41, 28); + I.addBox(0F, 0F, 0F, 6, 1, 6); + I.setRotationPoint(-7F, 22F, -7F); + I.setTextureSize(128, 128); + I.mirror = true; + setRotation(I, 0F, 0F, 0F); + J = new ModelRenderer(this, 41, 28); + J.addBox(0F, 0F, 0F, 6, 1, 6); + J.setRotationPoint(1F, 22F, -7F); + J.setTextureSize(128, 128); + J.mirror = true; + setRotation(J, 0F, 0F, 0F); + K = new ModelRenderer(this, 66, 16); + K.addBox(0F, 0F, 0F, 2, 1, 2); + K.setRotationPoint(-5F, 11F, -5F); + K.setTextureSize(128, 128); + K.mirror = true; + setRotation(K, 0F, 0F, 0F); + L = new ModelRenderer(this, 85, 15); + L.addBox(0F, 0F, 0F, 2, 2, 2); + L.setRotationPoint(3F, 10F, -5F); + L.setTextureSize(128, 128); + L.mirror = true; + setRotation(L, 0F, 0F, 0F); + M = new ModelRenderer(this, 66, 22); + M.addBox(-1F, 0F, -1F, 2, 2, 6); + M.setRotationPoint(-4F, 9F, -4F); + M.setTextureSize(128, 128); + M.mirror = true; + setRotation(M, 0F, 1.570796F, 0F); + N = new ModelRenderer(this, 66, 32); + N.addBox(-1F, -1F, -1F, 2, 6, 2); + N.setRotationPoint(0F, 12F, -4F); + N.setTextureSize(128, 128); + N.mirror = true; + setRotation(N, 0F, 0F, 0F); + OUTPUT = new ModelRenderer(this, 66, 42); + OUTPUT.addBox(-1F, -1F, -1F, 4, 2, 2); + OUTPUT.setRotationPoint(0F, 16F, -5F); + OUTPUT.setTextureSize(128, 128); + OUTPUT.mirror = true; + setRotation(OUTPUT, 0F, 1.570796F, 0F); + P = new ModelRenderer(this, 85, 21); + P.addBox(-1F, -1F, -1F, 2, 3, 2); + P.setRotationPoint(5F, 9F, -4F); + P.setTextureSize(128, 128); + P.mirror = true; + setRotation(P, 0F, 0F, 0.6457718F); + Q = new ModelRenderer(this, 0, 65); + Q.addBox(0F, 0F, -2F, 3, 11, 6); + Q.setRotationPoint(-8F, 12F, 0F); + Q.setTextureSize(128, 128); + Q.mirror = true; + setRotation(Q, 0F, 0F, 0F); + R = new ModelRenderer(this, 0, 65); + R.addBox(0F, 0F, -3F, 3, 11, 6); + R.setRotationPoint(8F, 12F, 1F); + R.setTextureSize(128, 128); + R.mirror = true; + setRotation(R, 0F, 3.141593F, 0F); + S = new ModelRenderer(this, 0, 84); + S.addBox(0F, 0F, 0F, 4, 1, 1); + S.setRotationPoint(2F, 16F, 3F); + S.setTextureSize(128, 128); + S.mirror = true; + setRotation(S, 0F, 0F, 0F); + T = new ModelRenderer(this, 0, 84); + T.addBox(0F, 0F, 0F, 4, 1, 1); + T.setRotationPoint(-6F, 16F, 3F); + T.setTextureSize(128, 128); + T.mirror = true; + setRotation(T, 0F, 0F, 0F); + U = new ModelRenderer(this, 0, 87); + U.addBox(0F, 0F, 0F, 4, 1, 1); + U.setRotationPoint(-6F, 18F, 3F); + U.setTextureSize(128, 128); + U.mirror = true; + setRotation(U, 0F, 0F, 0F); + V = new ModelRenderer(this, 0, 87); + V.addBox(0F, 0F, 0F, 4, 1, 1); + V.setRotationPoint(2F, 18F, 3F); + V.setTextureSize(128, 128); + V.mirror = true; + setRotation(V, 0F, 0F, 0F); + } + + public void render(float size) + { + A.render(size); + B.render(size); + C.render(size); + D.render(size); + E.render(size); + F.render(size); + G.render(size); + H.render(size); + I.render(size); + J.render(size); + K.render(size); + L.render(size); + M.render(size); + N.render(size); + OUTPUT.render(size); + P.render(size); + Q.render(size); + R.render(size); + S.render(size); + T.render(size); + U.render(size); + V.render(size); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + A.renderWithRotation(f5); + B.renderWithRotation(f5); + C.renderWithRotation(f5); + D.renderWithRotation(f5); + E.renderWithRotation(f5); + F.renderWithRotation(f5); + G.renderWithRotation(f5); + H.renderWithRotation(f5); + I.renderWithRotation(f5); + J.renderWithRotation(f5); + K.renderWithRotation(f5); + L.renderWithRotation(f5); + M.renderWithRotation(f5); + N.renderWithRotation(f5); + OUTPUT.renderWithRotation(f5); + P.renderWithRotation(f5); + Q.renderWithRotation(f5); + R.renderWithRotation(f5); + S.renderWithRotation(f5); + T.renderWithRotation(f5); + U.renderWithRotation(f5); + V.renderWithRotation(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/src/minecraft/mekanism/generators/client/ModelHeatGenerator.java b/src/minecraft/mekanism/generators/client/ModelHeatGenerator.java new file mode 100644 index 000000000..6130b46d3 --- /dev/null +++ b/src/minecraft/mekanism/generators/client/ModelHeatGenerator.java @@ -0,0 +1,171 @@ +package mekanism.generators.client; + +import net.minecraft.src.*; + +public class ModelHeatGenerator extends ModelBase +{ + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + ModelRenderer H; + ModelRenderer I; + ModelRenderer J; + ModelRenderer K; + ModelRenderer L; + ModelRenderer M; + ModelRenderer N; + ModelRenderer O; + + public ModelHeatGenerator() + { + textureWidth = 128; + textureHeight = 128; + + A = new ModelRenderer(this, 0, 0); + A.addBox(-8F, 0F, -8F, 16, 1, 16); + A.setRotationPoint(0F, 23F, 0F); + A.setTextureSize(128, 128); + A.mirror = true; + setRotation(A, 0F, 0F, 0F); + B = new ModelRenderer(this, 0, 85); + B.addBox(0F, 0F, 0F, 8, 6, 10); + B.setRotationPoint(-8F, 17F, -5F); + B.setTextureSize(128, 128); + B.mirror = true; + setRotation(B, 0F, 0F, 0F); + C = new ModelRenderer(this, 0, 67); + C.addBox(-1F, -2F, 0F, 2, 4, 12); + C.setRotationPoint(-5F, 20F, -6F); + C.setTextureSize(128, 128); + C.mirror = true; + setRotation(C, 0F, 0F, 1.570796F); + D = new ModelRenderer(this, 0, 67); + D.addBox(-1F, -2F, 0F, 2, 4, 12); + D.setRotationPoint(-5F, 20F, -6F); + D.setTextureSize(128, 128); + D.mirror = true; + setRotation(D, 0F, 0F, 0.5235988F); + E = new ModelRenderer(this, 0, 67); + E.addBox(-1F, -2F, 0F, 2, 4, 12); + E.setRotationPoint(-5F, 20F, -6F); + E.setTextureSize(128, 128); + E.mirror = true; + setRotation(E, 0F, 0F, -0.5235988F); + F = new ModelRenderer(this, 68, 0); + F.addBox(-2F, -4F, 0F, 4, 8, 10); + F.setRotationPoint(-4F, 13F, -5F); + F.setTextureSize(128, 128); + F.mirror = true; + setRotation(F, 0F, 0F, 0.5235988F); + G = new ModelRenderer(this, 68, 0); + G.addBox(-2F, -4F, 0F, 4, 8, 10); + G.setRotationPoint(-4F, 13F, -5F); + G.setTextureSize(128, 128); + G.mirror = true; + setRotation(G, 0F, 0F, -0.5235988F); + H = new ModelRenderer(this, 68, 0); + H.addBox(-2F, -4F, 0F, 4, 8, 10); + H.setRotationPoint(-4F, 13F, -5F); + H.setTextureSize(128, 128); + H.mirror = true; + setRotation(H, 0F, 0F, 1.570796F); + I = new ModelRenderer(this, 0, 18); + I.addBox(0F, 0F, 0F, 8, 13, 14); + I.setRotationPoint(0F, 10F, -6F); + I.setTextureSize(128, 128); + I.mirror = true; + setRotation(I, 0F, 0F, 0F); + J = new ModelRenderer(this, 0, 47); + J.addBox(0F, 0F, 0F, 6, 11, 1); + J.setRotationPoint(1F, 11F, -7F); + J.setTextureSize(128, 128); + J.mirror = true; + setRotation(J, 0F, 0F, 0F); + K = new ModelRenderer(this, 51, 21); + K.addBox(0F, 0F, 0F, 10, 4, 1); + K.setRotationPoint(-8F, 13F, -4F); + K.setTextureSize(128, 128); + K.mirror = true; + setRotation(K, 0F, 0F, 0F); + L = new ModelRenderer(this, 51, 21); + L.addBox(0F, 0F, 0F, 10, 4, 1); + L.setRotationPoint(-8F, 13F, 3F); + L.setTextureSize(128, 128); + L.mirror = true; + setRotation(L, 0F, 0F, 0F); + M = new ModelRenderer(this, 0, 103); + M.addBox(0F, 0F, 0F, 2, 4, 2); + M.setRotationPoint(-2F, 19F, -7F); + M.setTextureSize(128, 128); + M.mirror = true; + setRotation(M, 0F, 0F, 0F); + N = new ModelRenderer(this, 51, 0); + N.addBox(0F, 0F, 0F, 6, 1, 1); + N.setRotationPoint(-3F, 9F, 0F); + N.setTextureSize(128, 128); + N.mirror = true; + setRotation(N, 0F, 0F, 0F); + O = new ModelRenderer(this, 51, 0); + O.addBox(0F, 0F, 0F, 6, 1, 1); + O.setRotationPoint(-3F, 9F, 2F); + O.setTextureSize(128, 128); + O.mirror = true; + setRotation(O, 0F, 0F, 0F); + } + + public void render(float size) + { + A.render(size); + B.render(size); + C.render(size); + D.render(size); + E.render(size); + F.render(size); + G.render(size); + H.render(size); + I.render(size); + J.render(size); + K.render(size); + L.render(size); + M.render(size); + N.render(size); + O.render(size); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + A.renderWithRotation(f5); + B.renderWithRotation(f5); + C.renderWithRotation(f5); + D.renderWithRotation(f5); + E.renderWithRotation(f5); + F.renderWithRotation(f5); + G.renderWithRotation(f5); + H.renderWithRotation(f5); + I.renderWithRotation(f5); + J.renderWithRotation(f5); + K.renderWithRotation(f5); + L.renderWithRotation(f5); + M.renderWithRotation(f5); + N.renderWithRotation(f5); + O.renderWithRotation(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/src/minecraft/mekanism/generators/client/ModelHydrogenGenerator.java b/src/minecraft/mekanism/generators/client/ModelHydrogenGenerator.java new file mode 100644 index 000000000..c126030cc --- /dev/null +++ b/src/minecraft/mekanism/generators/client/ModelHydrogenGenerator.java @@ -0,0 +1,207 @@ +package mekanism.generators.client; + +import net.minecraft.src.*; + +public class ModelHydrogenGenerator extends ModelBase +{ + ModelRenderer A; + ModelRenderer B; + ModelRenderer C; + ModelRenderer D; + ModelRenderer E; + ModelRenderer F; + ModelRenderer G; + ModelRenderer H; + ModelRenderer I; + ModelRenderer J; + ModelRenderer K; + ModelRenderer L; + ModelRenderer M; + ModelRenderer N; + ModelRenderer O; + ModelRenderer P; + ModelRenderer Q; + ModelRenderer R; + ModelRenderer S; + + public ModelHydrogenGenerator() + { + textureWidth = 128; + textureHeight = 128; + + A = new ModelRenderer(this, 0, 0); + A.addBox(0F, 0F, 0F, 16, 1, 16); + A.setRotationPoint(-8F, 23F, -8F); + A.setTextureSize(128, 128); + A.mirror = true; + setRotation(A, 0F, 0F, 0F); + B = new ModelRenderer(this, 0, 45); + B.addBox(0F, 0F, 0F, 16, 12, 6); + B.setRotationPoint(-8F, 11F, -3F); + B.setTextureSize(128, 128); + B.mirror = true; + setRotation(B, 0F, 0F, 0F); + C = new ModelRenderer(this, 0, 64); + C.addBox(-3F, 0F, -8F, 6, 12, 12); + C.setRotationPoint(0F, 11F, 0F); + C.setTextureSize(128, 128); + C.mirror = true; + setRotation(C, 0F, 0F, 0F); + D = new ModelRenderer(this, 66, 0); + D.addBox(-3F, 0F, 0F, 6, 10, 4); + D.setRotationPoint(0F, 13F, 4F); + D.setTextureSize(128, 128); + D.mirror = true; + setRotation(D, 0F, 0F, 0F); + E = new ModelRenderer(this, 0, 20); + E.addBox(-5F, 0F, -3F, 10, 13, 6); + E.setRotationPoint(0F, 10F, 0F); + E.setTextureSize(128, 128); + E.mirror = true; + setRotation(E, 0F, 0.5235988F, 0F); + F = new ModelRenderer(this, 0, 20); + F.addBox(-5F, 0F, -3F, 10, 13, 6); + F.setRotationPoint(0F, 10F, 0F); + F.setTextureSize(128, 128); + F.mirror = true; + setRotation(F, 0F, -0.5235988F, 0F); + G = new ModelRenderer(this, 34, 20); + G.addBox(-3F, 0F, -5F, 6, 13, 10); + G.setRotationPoint(0F, 10F, 0F); + G.setTextureSize(128, 128); + G.mirror = true; + setRotation(G, 0F, 0F, 0F); + H = new ModelRenderer(this, 67, 20); + H.addBox(-2F, 0F, -1F, 4, 2, 2); + H.setRotationPoint(0F, 8F, 0F); + H.setTextureSize(128, 128); + H.mirror = true; + setRotation(H, 0F, -0.5235988F, 0F); + I = new ModelRenderer(this, 67, 20); + I.addBox(-2F, 0F, -1F, 4, 2, 2); + I.setRotationPoint(0F, 8F, 0F); + I.setTextureSize(128, 128); + I.mirror = true; + setRotation(I, 0F, 0.5235988F, 0F); + J = new ModelRenderer(this, 67, 26); + J.addBox(-1F, 0F, -2F, 2, 2, 4); + J.setRotationPoint(0F, 8F, 0F); + J.setTextureSize(128, 128); + J.mirror = true; + setRotation(J, 0F, 0F, 0F); + K = new ModelRenderer(this, 88, 0); + K.addBox(-3F, 0F, 0F, 6, 2, 5); + K.setRotationPoint(0F, 10F, 4F); + K.setTextureSize(128, 128); + K.mirror = true; + setRotation(K, -0.6457718F, 0F, 0F); + L = new ModelRenderer(this, 0, 97); + L.addBox(0F, 0F, 0F, 4, 10, 4); + L.setRotationPoint(2F, 13F, -5F); + L.setTextureSize(128, 128); + L.mirror = true; + setRotation(L, 0F, 0.7853982F, 0F); + M = new ModelRenderer(this, 0, 90); + M.addBox(0F, 0F, 0F, 3, 1, 2); + M.setRotationPoint(2F, 12F, -4F); + M.setTextureSize(128, 128); + M.mirror = true; + setRotation(M, 0F, 0.7853982F, 0F); + N = new ModelRenderer(this, 0, 97); + N.addBox(0F, 0F, 0F, 4, 10, 4); + N.setRotationPoint(-8F, 13F, -5F); + N.setTextureSize(128, 128); + N.mirror = true; + setRotation(N, 0F, 0.7853982F, 0F); + O = new ModelRenderer(this, 0, 90); + O.addBox(0F, 0F, 0F, 2, 1, 3); + O.setRotationPoint(-6F, 12F, -5F); + O.setTextureSize(128, 128); + O.mirror = true; + setRotation(O, 0F, 0.7853982F, 0F); + P = new ModelRenderer(this, 0, 118); + P.addBox(-5F, 0F, 0F, 10, 1, 1); + P.setRotationPoint(0F, 15F, -7F); + P.setTextureSize(128, 128); + P.mirror = true; + setRotation(P, 0F, 0F, 0F); + Q = new ModelRenderer(this, 0, 118); + Q.addBox(-5F, 0F, 0F, 10, 1, 1); + Q.setRotationPoint(0F, 19F, -7F); + Q.setTextureSize(128, 128); + Q.mirror = true; + setRotation(Q, 0F, 0F, 0F); + R = new ModelRenderer(this, 0, 112); + R.addBox(-7F, 0F, -3F, 14, 1, 3); + R.setRotationPoint(0F, 15F, -2F); + R.setTextureSize(128, 128); + R.mirror = true; + setRotation(R, 0F, 0F, 0F); + S = new ModelRenderer(this, 0, 112); + S.addBox(-7F, 0F, -3F, 14, 1, 3); + S.setRotationPoint(0F, 19F, -2F); + S.setTextureSize(128, 128); + S.mirror = true; + setRotation(S, 0F, 0F, 0F); + } + + public void render(float size) + { + A.render(size); + B.render(size); + C.render(size); + D.render(size); + E.render(size); + F.render(size); + G.render(size); + H.render(size); + I.render(size); + J.render(size); + K.render(size); + L.render(size); + M.render(size); + N.render(size); + O.render(size); + P.render(size); + Q.render(size); + R.render(size); + S.render(size); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + A.renderWithRotation(f5); + B.renderWithRotation(f5); + C.renderWithRotation(f5); + D.renderWithRotation(f5); + E.renderWithRotation(f5); + F.renderWithRotation(f5); + G.renderWithRotation(f5); + H.renderWithRotation(f5); + I.renderWithRotation(f5); + J.renderWithRotation(f5); + K.renderWithRotation(f5); + L.renderWithRotation(f5); + M.renderWithRotation(f5); + N.renderWithRotation(f5); + O.renderWithRotation(f5); + P.renderWithRotation(f5); + Q.renderWithRotation(f5); + R.renderWithRotation(f5); + S.renderWithRotation(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/src/minecraft/mekanism/generators/client/RenderElectrolyticSeparator.java b/src/minecraft/mekanism/generators/client/RenderElectrolyticSeparator.java new file mode 100644 index 000000000..76c8763a0 --- /dev/null +++ b/src/minecraft/mekanism/generators/client/RenderElectrolyticSeparator.java @@ -0,0 +1,36 @@ +package mekanism.generators.client; + +import org.lwjgl.opengl.GL11; + +import mekanism.generators.common.TileEntityElectrolyticSeparator; +import net.minecraft.src.*; + +public class RenderElectrolyticSeparator extends TileEntitySpecialRenderer +{ + private ModelElectrolyticSeparator model = new ModelElectrolyticSeparator(); + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) + { + renderAModelAt((TileEntityElectrolyticSeparator) var1, var2, var4, var6, 1F); + } + + private void renderAModelAt(TileEntityElectrolyticSeparator tileEntity, double x, double y, double z, float f) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + bindTextureByName("/resources/mekanism/render/ElectrolyticSeparator.png"); + + switch(tileEntity.facing) + { + case 2: GL11.glRotatef(270, 0.0F, 1.0F, 0.0F); break; + case 3: GL11.glRotatef(90, 0.0F, 1.0F, 0.0F); break; + case 4: GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); break; + case 5: GL11.glRotatef(180, 0.0F, 1.0F, 0.0F); break; + } + + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); + model.render(0.0625F); + GL11.glPopMatrix(); + } +} diff --git a/src/minecraft/mekanism/generators/client/RenderHeatGenerator.java b/src/minecraft/mekanism/generators/client/RenderHeatGenerator.java new file mode 100644 index 000000000..5331ed4d9 --- /dev/null +++ b/src/minecraft/mekanism/generators/client/RenderHeatGenerator.java @@ -0,0 +1,35 @@ +package mekanism.generators.client; + +import org.lwjgl.opengl.GL11; + +import mekanism.generators.common.TileEntityHeatGenerator; +import net.minecraft.src.*; + +public class RenderHeatGenerator extends TileEntitySpecialRenderer +{ + private ModelHeatGenerator model = new ModelHeatGenerator(); + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) + { + renderAModelAt((TileEntityHeatGenerator) var1, var2, var4, var6, 1F); + } + + private void renderAModelAt(TileEntityHeatGenerator tileEntity, double x, double y, double z, float f) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + bindTextureByName("/resources/mekanism/render/HeatGenerator.png"); + + switch(tileEntity.facing) + { + case 2: GL11.glRotatef(270, 0.0F, 1.0F, 0.0F); break; + case 3: GL11.glRotatef(90, 0.0F, 1.0F, 0.0F); break; + case 4: GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); break; + case 5: GL11.glRotatef(180, 0.0F, 1.0F, 0.0F); break; + } + + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + model.render(0.0625F); + GL11.glPopMatrix(); + } +} diff --git a/src/minecraft/mekanism/generators/client/RenderHydrogenGenerator.java b/src/minecraft/mekanism/generators/client/RenderHydrogenGenerator.java new file mode 100644 index 000000000..589d350ab --- /dev/null +++ b/src/minecraft/mekanism/generators/client/RenderHydrogenGenerator.java @@ -0,0 +1,38 @@ +package mekanism.generators.client; + +import mekanism.generators.common.TileEntityHydrogenGenerator; + +import net.minecraft.src.*; + +import org.lwjgl.opengl.GL11; + +public class RenderHydrogenGenerator extends TileEntitySpecialRenderer +{ + private ModelHydrogenGenerator model = new ModelHydrogenGenerator(); + + public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) + { + renderAModelAt((TileEntityHydrogenGenerator) var1, var2, var4, var6, 1F); + } + + private void renderAModelAt(TileEntityHydrogenGenerator tileEntity, double x, double y, double z, float f) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5f, (float) y + 1.5f, (float) z + 0.5f); + bindTextureByName("/resources/mekanism/render/HydrogenGenerator.png"); + + switch(tileEntity.facing) + { + case 2: GL11.glRotatef(270, 0.0F, 1.0F, 0.0F); break; + case 3: GL11.glRotatef(90, 0.0F, 1.0F, 0.0F); break; + case 4: GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); break; + case 5: GL11.glRotatef(180, 0.0F, 1.0F, 0.0F); break; + } + + GL11.glRotatef(180F, 0.0F, 1.0F, 1.0F); + GL11.glRotatef(90F, -1.0F, 0.0F, 0.0F); + GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); + model.render(0.0625F); + GL11.glPopMatrix(); + } +}