From 1be888ca886ff72b14410e17f148a6a6101f399e Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Sun, 28 Oct 2012 18:18:23 -0400 Subject: [PATCH] v4.3 Beta #1 *Updated mcmod.info. *Removed PlatinumCable both physically and code-ly. *Completely refactored TileEntity hierarchy *again* to make code more efficient. *Fixed container bug. *Fixed GUI text not rendering. *Added missing javadocs. *Removed unused and unneeded code. *Added Generator base for making Obsidian Ingots generators. *Added Heat Generator, a block that generates energy with heat. *Doubled Platinum Ore generation. *Fixed energy devices to only have a max damage of 100. *Fixed energy devices not working in SMP. *Updated ITileNetwork with new packet changes. *Other various bugfixes. --- bin/minecraft/gui/GuiGenerator.png | Bin 0 -> 4109 bytes bin/minecraft/textures/PlatinumCable.png | Bin 2089 -> 0 bytes bin/minecraft/textures/items.png | Bin 15264 -> 15144 bytes bin/minecraft/textures/terrain.png | Bin 9594 -> 10267 bytes mcmod.info | 4 +- .../obsidian/common/BlockGenerator.java | 226 ++++++++ .../uberkat/obsidian/common/CommonProxy.java | 4 + .../ContainerAdvancedElectricMachine.java | 4 +- .../common/ContainerElectricMachine.java | 4 +- .../obsidian/common/ContainerGenerator.java | 105 ++++ .../obsidian/common/ContainerPowerUnit.java | 4 +- .../obsidian/common/ItemBlockGenerator.java | 46 ++ .../obsidian/common/ItemEnergized.java | 20 +- .../obsidian/common/ObsidianIngots.java | 18 +- .../uberkat/obsidian/common/OreHandler.java | 6 +- .../obsidian/common/PacketHandler.java | 68 +++ .../TileEntityAdvancedElectricMachine.java | 5 + .../common/TileEntityAdvancedPowerUnit.java | 2 +- .../common/TileEntityBasicMachine.java | 201 +------- .../common/TileEntityElectricBlock.java | 228 +++++++++ .../obsidian/common/TileEntityGenerator.java | 484 ++++++++++++++++++ .../common/TileEntityHeatGenerator.java | 18 + .../obsidian/common/TileEntityPowerUnit.java | 236 ++------- src/common/obsidian/api/IElectricMachine.java | 12 +- src/common/obsidian/api/IEnergizedItem.java | 6 + src/common/obsidian/api/ITileNetwork.java | 10 + .../uberkat/obsidian/client/ClientProxy.java | 5 +- .../client/GuiAdvancedElectricMachine.java | 2 +- .../obsidian/client/GuiElectricMachine.java | 2 +- .../uberkat/obsidian/client/GuiGenerator.java | 47 ++ .../uberkat/obsidian/client/GuiPowerUnit.java | 6 +- .../client/GuiTheoreticalElementizer.java | 4 +- 32 files changed, 1340 insertions(+), 437 deletions(-) create mode 100755 bin/minecraft/gui/GuiGenerator.png delete mode 100644 bin/minecraft/textures/PlatinumCable.png create mode 100644 src/common/net/uberkat/obsidian/common/BlockGenerator.java create mode 100644 src/common/net/uberkat/obsidian/common/ContainerGenerator.java create mode 100644 src/common/net/uberkat/obsidian/common/ItemBlockGenerator.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityElectricBlock.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityGenerator.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityHeatGenerator.java create mode 100644 src/minecraft/net/uberkat/obsidian/client/GuiGenerator.java diff --git a/bin/minecraft/gui/GuiGenerator.png b/bin/minecraft/gui/GuiGenerator.png new file mode 100755 index 0000000000000000000000000000000000000000..6f458c38e4dfe745393eff1b0e232ca391435493 GIT binary patch literal 4109 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 diff --git a/bin/minecraft/textures/terrain.png b/bin/minecraft/textures/terrain.png index 136841d07f97cb2da1ed8f0c11b9559b6c3efe6a..dbefb1405a2e406c00f001ff253b894d9f842fcb 100755 GIT binary patch literal 10267 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 V0Wg%#{HF?Fan 0) + { + int j = machineRand.nextInt(21) + 10; + + if (j > slotStack.stackSize) + { + j = slotStack.stackSize; + } + + slotStack.stackSize -= j; + EntityItem item = new EntityItem(world, (double)((float)x + xRandom), (double)((float)y + yRandom), (double)((float)z + zRandom), new ItemStack(slotStack.itemID, j, slotStack.getItemDamage())); + + if (slotStack.hasTagCompound()) + { + item.item.setTagCompound((NBTTagCompound)slotStack.getTagCompound().copy()); + } + + float k = 0.05F; + item.motionX = (double)((float)machineRand.nextGaussian() * k); + item.motionY = (double)((float)machineRand.nextGaussian() * k + 0.2F); + item.motionZ = (double)((float)machineRand.nextGaussian() * k); + world.spawnEntityInWorld(item); + } + } + } + tileEntity.invalidate(); + } + + super.breakBlock(world, x, y, z, i1, i2); + } + + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int facing, float playerX, float playerY, float playerZ) + { + if (world.isRemote) + { + return true; + } + else + { + TileEntityGenerator tileEntity = (TileEntityGenerator)world.getBlockTileEntity(x, y, z); + int metadata = world.getBlockMetadata(x, y, z); + + if (tileEntity != null) + { + if(!entityplayer.isSneaking()) + { + int id = 0; + + if(metadata == 0) id = 9; + + entityplayer.openGui(ObsidianIngots.instance, id, world, x, y, z); + } + else { + return false; + } + } + return true; + } + } + + public String getTextureFile() + { + return "/textures/terrain.png"; + } + + public TileEntity createNewTileEntity(World world, int metadata) + { + if(metadata == MachineType.HEAT_GENERATOR.index) + { + return new TileEntityHeatGenerator(); + } + else { + return null; + } + } + + /*This method is not used, metadata manipulation is required to create a Tile Entity.*/ + public TileEntity createNewTileEntity(World world) + { + return null; + } + + public static enum MachineType + { + HEAT_GENERATOR(0); + + private int index; + + private MachineType(int i) + { + index = i; + } + } +} diff --git a/src/common/net/uberkat/obsidian/common/CommonProxy.java b/src/common/net/uberkat/obsidian/common/CommonProxy.java index 6ed3e8972..227e9998c 100644 --- a/src/common/net/uberkat/obsidian/common/CommonProxy.java +++ b/src/common/net/uberkat/obsidian/common/CommonProxy.java @@ -55,6 +55,7 @@ public class CommonProxy ObsidianIngots.oreBlockID = ObsidianIngots.configuration.getBlock("OreBlock", 3002).getInt(); ObsidianIngots.obsidianTNTID = ObsidianIngots.configuration.getBlock("ObsidianTNT", 3003).getInt(); ObsidianIngots.powerUnitID = ObsidianIngots.configuration.getBlock("PowerUnit", 3004).getInt(); + ObsidianIngots.generatorID = ObsidianIngots.configuration.getBlock("Generator", 3005).getInt(); ObsidianIngots.extrasEnabled = ObsidianIngots.configuration.get("ExtrasEnabled", Configuration.CATEGORY_GENERAL, true).getBoolean(true); ObsidianIngots.oreGenerationEnabled = ObsidianIngots.configuration.get("OreGenerationEnabled", Configuration.CATEGORY_GENERAL, true).getBoolean(true); ObsidianIngots.configuration.save(); @@ -117,6 +118,9 @@ public class CommonProxy case 8: TileEntityPowerUnit tileentity5 = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); return new ContainerPowerUnit(player.inventory, tileentity5); + case 9: + TileEntityGenerator tileentity6 = (TileEntityGenerator)world.getBlockTileEntity(x, y, z); + return new ContainerGenerator(player.inventory, tileentity6); } return null; } diff --git a/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java b/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java index 12083c2e1..431f73511 100644 --- a/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java +++ b/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java @@ -42,7 +42,7 @@ public class ContainerAdvancedElectricMachine extends Container /** * Called to transfer a stack from one inventory to the other eg. when shift clicking. */ - public ItemStack transferStackInSlot(int slotID) + public ItemStack func_82846_b(EntityPlayer player, int slotID) { ItemStack stack = null; Slot currentSlot = (Slot)inventorySlots.get(slotID); @@ -165,7 +165,7 @@ public class ContainerAdvancedElectricMachine extends Container return null; } - currentSlot.putStack(slotStack); + currentSlot.func_82870_a(player, slotStack); } return stack; diff --git a/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java b/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java index d4add4114..66367b038 100644 --- a/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java +++ b/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java @@ -41,7 +41,7 @@ public class ContainerElectricMachine extends Container /** * Called to transfer a stack from one inventory to the other eg. when shift clicking. */ - public ItemStack transferStackInSlot(int slotID) + public ItemStack func_82846_b(EntityPlayer player, int slotID) { ItemStack stack = null; Slot currentSlot = (Slot)inventorySlots.get(slotID); @@ -122,7 +122,7 @@ public class ContainerElectricMachine extends Container return null; } - currentSlot.putStack(slotStack); + currentSlot.func_82870_a(player, slotStack); } return stack; diff --git a/src/common/net/uberkat/obsidian/common/ContainerGenerator.java b/src/common/net/uberkat/obsidian/common/ContainerGenerator.java new file mode 100644 index 000000000..46d625c99 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ContainerGenerator.java @@ -0,0 +1,105 @@ +package net.uberkat.obsidian.common; + +import ic2.api.IElectricItem; +import obsidian.api.IEnergizedItem; +import obsidian.api.IMachineUpgrade; +import universalelectricity.implement.IItemElectric; +import net.minecraft.src.*; + +public class ContainerGenerator extends Container +{ + private TileEntityGenerator tileEntity; + + public ContainerGenerator(InventoryPlayer inventory, TileEntityGenerator tentity) + { + tileEntity = tentity; + addSlotToContainer(new Slot(tentity, 0, 17, 35)); + addSlotToContainer(new SlotEnergy(tentity, 1, 143, 35)); + 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)); + } + } + + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + return tileEntity.isUseableByPlayer(par1EntityPlayer); + } + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + public ItemStack func_82846_b(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(slotStack.getItem() instanceof IEnergizedItem || 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, 2, inventorySlots.size(), false)) + { + return null; + } + } + } + else if(tileEntity.getFuel(slotStack) > 0) + { + if(slotID != 0 && slotID != 1) + { + if (!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 2, inventorySlots.size(), true)) + { + return null; + } + } + } + + if (slotStack.stackSize == 0) + { + currentSlot.putStack((ItemStack)null); + } + else + { + currentSlot.onSlotChanged(); + } + + if (slotStack.stackSize == stack.stackSize) + { + return null; + } + + currentSlot.func_82870_a(player, slotStack); + } + + return stack; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java b/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java index 71844d6f2..220c6185f 100644 --- a/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java +++ b/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java @@ -36,7 +36,7 @@ public class ContainerPowerUnit extends Container return tileEntity.isUseableByPlayer(par1EntityPlayer); } - public ItemStack transferStackInSlot(int slotID) + public ItemStack func_82846_b(EntityPlayer player, int slotID) { ItemStack stack = null; Slot currentSlot = (Slot)inventorySlots.get(slotID); @@ -91,7 +91,7 @@ public class ContainerPowerUnit extends Container return null; } - currentSlot.putStack(slotStack); + currentSlot.func_82870_a(player, slotStack); } return stack; diff --git a/src/common/net/uberkat/obsidian/common/ItemBlockGenerator.java b/src/common/net/uberkat/obsidian/common/ItemBlockGenerator.java new file mode 100644 index 000000000..0b6183615 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ItemBlockGenerator.java @@ -0,0 +1,46 @@ +package net.uberkat.obsidian.common; + +import net.minecraft.src.*; + +/** + * Item class for handling multiple generator block IDs. + * 0: Heat Generator + * @author AidanBrady + * + */ +public class ItemBlockGenerator extends ItemBlock +{ + public Block metaBlock; + + public ItemBlockGenerator(int id, Block block) + { + super(id); + metaBlock = block; + setHasSubtypes(true); + } + + public int getMetadata(int i) + { + return i; + } + + public int getIconFromDamage(int i) + { + return metaBlock.getBlockTextureFromSideAndMetadata(2, i); + } + + public String getItemNameIS(ItemStack itemstack) + { + String name = ""; + switch(itemstack.getItemDamage()) + { + case 0: + name = "HeatGenerator"; + break; + default: + name = "Unknown"; + break; + } + return getItemName() + "." + name; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ItemEnergized.java b/src/common/net/uberkat/obsidian/common/ItemEnergized.java index d76b9e49f..7b5c79ba7 100644 --- a/src/common/net/uberkat/obsidian/common/ItemEnergized.java +++ b/src/common/net/uberkat/obsidian/common/ItemEnergized.java @@ -17,13 +17,16 @@ public class ItemEnergized extends ItemObsidian implements IEnergizedItem, IItem public int transferRate; - public ItemEnergized(int id, int energy, int rate) + public int divider; + + public ItemEnergized(int id, int energy, int rate, int divide) { super(id); + divider = divide; maxEnergy = energy; transferRate = rate; setMaxStackSize(1); - setMaxDamage(maxEnergy); + setMaxDamage(maxEnergy/divider); setNoRepair(); setCreativeTab(CreativeTabs.tabRedstone); } @@ -60,7 +63,7 @@ public class ItemEnergized extends ItemObsidian implements IEnergizedItem, IItem stored = itemstack.stackTagCompound.getInteger("energy"); } - itemstack.setItemDamage(maxEnergy - stored); + itemstack.setItemDamage((maxEnergy - stored)/divider); return stored; } @@ -73,20 +76,20 @@ public class ItemEnergized extends ItemObsidian implements IEnergizedItem, IItem int stored = Math.max(Math.min(energy, maxEnergy), 0); itemstack.stackTagCompound.setInteger("energy", stored); - itemstack.setItemDamage(maxEnergy - stored); + itemstack.setItemDamage((maxEnergy - stored)/divider); } public ItemStack getUnchargedItem() { ItemStack charged = new ItemStack(this); - charged.setItemDamage(maxEnergy); + charged.setItemDamage(maxEnergy/divider); return charged; } public void getSubItems(int i, CreativeTabs tabs, List list) { ItemStack discharged = new ItemStack(this); - discharged.setItemDamage(maxEnergy); + discharged.setItemDamage(maxEnergy/divider); list.add(discharged); ItemStack charged = new ItemStack(this); setEnergy(charged, ((IEnergizedItem)charged.getItem()).getMaxEnergy()); @@ -170,4 +173,9 @@ public class ItemEnergized extends ItemObsidian implements IEnergizedItem, IItem { return true; } + + public int getDivider() + { + return divider; + } } diff --git a/src/common/net/uberkat/obsidian/common/ObsidianIngots.java b/src/common/net/uberkat/obsidian/common/ObsidianIngots.java index dbc0e0306..f31e1426a 100644 --- a/src/common/net/uberkat/obsidian/common/ObsidianIngots.java +++ b/src/common/net/uberkat/obsidian/common/ObsidianIngots.java @@ -39,7 +39,7 @@ import cpw.mods.fml.common.registry.TickRegistry; * @author AidanBrady * */ -@Mod(modid = "ObsidianIngots", name = "Obsidian Ingots", version = "4.2.3") +@Mod(modid = "ObsidianIngots", name = "Obsidian Ingots", version = "4.2.4") @NetworkMod(channels = { "ObsidianIngots" }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class) public class ObsidianIngots { @@ -61,7 +61,7 @@ public class ObsidianIngots public static Configuration configuration; /** Obsidian Ingots version number */ - public static Version versionNumber = new Version(4, 2, 3); + public static Version versionNumber = new Version(4, 2, 4); /** The latest version number which is received from the Obsidian Ingots server */ public static String latestVersionNumber; @@ -106,6 +106,7 @@ public class ObsidianIngots public static int oreBlockID = 3002; public static int obsidianTNTID = 3003; public static int powerUnitID = 3004; + public static int generatorID = 3005; //Base Items public static Item WoodPaxel; @@ -211,6 +212,7 @@ public class ObsidianIngots public static Block OreBlock; public static Block ObsidianTNT; public static Block PowerUnit; + public static Block Generator; //Boolean Values public static boolean extrasEnabled = true; @@ -674,6 +676,9 @@ public class ObsidianIngots LanguageRegistry.instance().addStringLocalization("tile.PowerUnit.PowerUnit.name", "Power Unit"); LanguageRegistry.instance().addStringLocalization("tile.PowerUnit.AdvancedPowerUnit.name", "Advanced Power Unit"); + //Localization for Generator + LanguageRegistry.instance().addStringLocalization("tile.Generator.HeatGenerator.name", "Heat Generator"); + if(extrasEnabled == true) { LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.TheoreticalElementizer.name", "Theoretical Elementizer"); @@ -870,9 +875,9 @@ public class ObsidianIngots GlowstoneLegs = new ItemObsidianArmor(11310, armorGLOWSTONE, proxy.getArmorIndex("glowstone"), 2).setItemName("GlowstoneLegs"); GlowstoneBoots = new ItemObsidianArmor(11311, armorGLOWSTONE, proxy.getArmorIndex("glowstone"), 3).setItemName("GlowstoneBoots"); GlowstoneKnife = new ItemObsidianKnife(11312, toolGLOWSTONE).setItemName("GlowstoneKnife"); - EnergyTablet = (ItemEnergized) new ItemEnergized(11314, 50000, 100).setItemName("EnergyTablet"); - EnergyOrb = (ItemEnergized) new ItemEnergized(11315, 15000000, 1000).setItemName("EnergyOrb"); - EnergyCube = (ItemEnergized) new ItemEnergized(11316, 12000, 100).setItemName("EnergyCube"); + EnergyTablet = (ItemEnergized) new ItemEnergized(11314, 50000, 100, 500).setItemName("EnergyTablet"); + EnergyOrb = (ItemEnergized) new ItemEnergized(11315, 15000000, 1000, 150000).setItemName("EnergyOrb"); + EnergyCube = (ItemEnergized) new ItemEnergized(11316, 12000, 100, 120).setItemName("EnergyCube"); SpeedUpgrade = new ItemMachineUpgrade(11317).setItemName("SpeedUpgrade"); EnergyUpgrade = new ItemMachineUpgrade(11318).setItemName("EnergyUpgrade"); UltimateUpgrade = new ItemMachineUpgrade(11319).setItemName("UltimateUpgrade"); @@ -888,6 +893,7 @@ public class ObsidianIngots MachineBlock = new BlockMachine(machineBlockID).setBlockName("MachineBlock"); OreBlock = new BlockOre(oreBlockID).setBlockName("OreBlock"); PowerUnit = new BlockPowerUnit(powerUnitID).setBlockName("PowerUnit"); + Generator = new BlockGenerator(generatorID).setBlockName("Generator"); ObsidianTNT = new BlockObsidianTNT(obsidianTNTID).setBlockName("ObsidianTNT").setCreativeTab(CreativeTabs.tabRedstone); //Registrations @@ -898,6 +904,7 @@ public class ObsidianIngots Item.itemsList[machineBlockID] = new ItemBlockMachine(machineBlockID - 256, MachineBlock).setItemName("MachineBlock"); Item.itemsList[oreBlockID] = new ItemBlockOre(oreBlockID - 256, OreBlock).setItemName("OreBlock"); Item.itemsList[powerUnitID] = new ItemBlockPowerUnit(powerUnitID - 256, PowerUnit).setItemName("PowerUnit"); + Item.itemsList[generatorID] = new ItemBlockGenerator(generatorID - 256, Generator).setItemName("Generator"); } /** @@ -971,6 +978,7 @@ public class ObsidianIngots GameRegistry.registerTileEntity(TileEntityTheoreticalElementizer.class, "TheoreticalElementizer"); GameRegistry.registerTileEntity(TileEntityPowerUnit.class, "PowerUnit"); GameRegistry.registerTileEntity(TileEntityAdvancedPowerUnit.class, "AdvancedPowerUnit"); + GameRegistry.registerTileEntity(TileEntityHeatGenerator.class, "HeatGenerator"); } /** diff --git a/src/common/net/uberkat/obsidian/common/OreHandler.java b/src/common/net/uberkat/obsidian/common/OreHandler.java index 8731fcce4..64fecd887 100644 --- a/src/common/net/uberkat/obsidian/common/OreHandler.java +++ b/src/common/net/uberkat/obsidian/common/OreHandler.java @@ -1,5 +1,7 @@ package net.uberkat.obsidian.common; +import java.util.ArrayList; +import java.util.List; import java.util.Random; import net.minecraft.src.IChunkProvider; @@ -9,7 +11,7 @@ import net.minecraft.src.WorldGenMinable; import cpw.mods.fml.common.IWorldGenerator; public class OreHandler implements IWorldGenerator -{ +{ public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) @@ -30,7 +32,7 @@ public class OreHandler implements IWorldGenerator { if(ObsidianIngots.oreGenerationEnabled == true) { - for (int i=0;i<3;i++) + for (int i=0;i<6;i++) { int randPosX = chunkX + random.nextInt(16); int randPosY = random.nextInt(60); diff --git a/src/common/net/uberkat/obsidian/common/PacketHandler.java b/src/common/net/uberkat/obsidian/common/PacketHandler.java index b61e2d82c..65c8cb666 100644 --- a/src/common/net/uberkat/obsidian/common/PacketHandler.java +++ b/src/common/net/uberkat/obsidian/common/PacketHandler.java @@ -316,6 +316,74 @@ public class PacketHandler implements IPacketHandler PacketDispatcher.sendPacketToAllAround(sender.xCoord, sender.yCoord, sender.zCoord, distance, sender.worldObj.provider.dimensionId, packet); } + /** + * Send a generator packet from server to client. This will send the data int '4,' as well as the machine's x, y, and z + * coordinates, along with it's facing, energy stored, and fuel stored. + * @param sender - tile entity who is sending the packet + */ + public static void sendGeneratorPacket(TileEntityGenerator sender) + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream output = new DataOutputStream(bytes); + + try { + output.writeInt(EnumPacketType.TILE_ENTITY.id); + output.writeInt(sender.xCoord); + output.writeInt(sender.yCoord); + output.writeInt(sender.zCoord); + output.writeInt(sender.facing); + output.writeInt(sender.energyStored); + output.writeInt(sender.fuelStored); + } catch (IOException e) + { + System.err.println("[ObsidianIngots] Error while writing tile entity packet."); + e.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "ObsidianIngots"; + packet.data = bytes.toByteArray(); + packet.length = packet.data.length; + + if(FMLCommonHandler.instance().getMinecraftServerInstance() != null) + { + FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().sendPacketToAllPlayers(packet); + } + } + + /** + * Send a generator packet from server to client with a defined range. This will send the data int '4,' as well as + * the machine's x, y, and z coordinates, along with it's facing, energy stored, and fuel stored. + * @param sender - tile entity who is sending the packet + * @param distance - radius to send packet in + */ + public static void sendGeneratorPacketWithRange(TileEntityGenerator sender, double distance) + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream output = new DataOutputStream(bytes); + + try { + output.writeInt(EnumPacketType.TILE_ENTITY.id); + output.writeInt(sender.xCoord); + output.writeInt(sender.yCoord); + output.writeInt(sender.zCoord); + output.writeInt(sender.facing); + output.writeInt(sender.energyStored); + output.writeInt(sender.fuelStored); + } catch (IOException e) + { + System.err.println("[ObsidianIngots] Error while writing tile entity packet."); + e.printStackTrace(); + } + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "ObsidianIngots"; + packet.data = bytes.toByteArray(); + packet.length = packet.data.length; + + PacketDispatcher.sendPacketToAllAround(sender.xCoord, sender.yCoord, sender.zCoord, distance, sender.worldObj.provider.dimensionId, packet); + } + /** * Sends the server the defined packet data int. * @param type - packet type diff --git a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java index c367b9d98..2fcbfbe3f 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java @@ -414,6 +414,11 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM secondaryEnergyStored = Math.max(Math.min(energy, getFuelTicks(inventory[1])), 0); } + /** + * Gets the scaled secondary energy level for the GUI. + * @param i - multiplier + * @return scaled secondary energy + */ public int getScaledSecondaryEnergyLevel(int i) { return secondaryEnergyStored*i / MAX_SECONDARY_ENERGY; diff --git a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java index e66ca4375..4b8689fdc 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java @@ -4,6 +4,6 @@ public class TileEntityAdvancedPowerUnit extends TileEntityPowerUnit { public TileEntityAdvancedPowerUnit() { - super(50000000, 1024); + super("Advanced Power Unit", 50000000, 1024); } } diff --git a/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java index 28efb28b0..55e6735e4 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java @@ -25,11 +25,8 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; import net.uberkat.obsidian.client.Sound; -public abstract class TileEntityBasicMachine extends TileEntityDisableable implements IElectricMachine +public abstract class TileEntityBasicMachine extends TileEntityElectricBlock implements IElectricMachine { - /** The inventory slot itemstacks used by this machine. */ - public ItemStack[] inventory; - /** The Sound instance for this machine. */ public Sound audio; @@ -42,39 +39,21 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple /** How many ticks this machine has operated for. */ public int operatingTicks = 0; - /** How much energy is stored in this machine. */ - public int energyStored = 0; - /** Ticks required to operate -- or smelt an item. */ public int TICKS_REQUIRED; /** The current tick requirement for this machine. */ public int currentTicksRequired; - /** Maximum amount of energy this machine can hold. */ - public int MAX_ENERGY; - /** The current energy capacity for this machine. */ public int currentMaxEnergy; - /** The direction this block is facing. */ - public int facing; - - /** A timer used to send packets to clients. */ - public int packetTick = 0; - /** Whether or not this block is in it's active state. */ public boolean isActive; /** The previous active state for this block. */ public boolean prevActive; - /** Whether or not this machine has initialized and registered with other mods. */ - public boolean initialized; - - /** The full name of this machine. */ - public String fullName; - /** The GUI texture path for this machine. */ public String guiTexturePath; @@ -92,49 +71,26 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple */ public TileEntityBasicMachine(String soundPath, String name, String path, int perTick, int ticksRequired, int maxEnergy) { + super(name, maxEnergy); ENERGY_PER_TICK = perTick; TICKS_REQUIRED = currentTicksRequired = ticksRequired; - MAX_ENERGY = currentMaxEnergy = maxEnergy; soundURL = soundPath; - fullName = name; guiTexturePath = path; isActive = false; if(PowerFramework.currentFramework != null) { powerProvider = PowerFramework.currentFramework.createPowerProvider(); - powerProvider.configure(5, 25, 25, 25, maxEnergy/10); + powerProvider.configure(20, 25, 25, 25, maxEnergy/10); } } - public void updateEntity() + public void onUpdate() { - if(!initialized && worldObj != null) - { - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).addTileEntity(this); - } - - initialized = true; - } - if(audio == null && worldObj.isRemote) { audio = ObsidianIngots.audioHandler.getSound(fullName.replace(" ", ""), soundURL, worldObj, xCoord, yCoord, zCoord); } - onUpdate(); - - if(!worldObj.isRemote) - { - if(packetTick == 5) - { - sendPacket(); - } - - packetTick++; - } - if(worldObj.isRemote) { audio.updateVolume(FMLClientHandler.instance().getClient().thePlayer); @@ -147,36 +103,12 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple audio.stop(); } } - - if(!worldObj.isRemote) - { - sendPacketWithRange(); - } - } - - public boolean isUseableByPlayer(EntityPlayer entityplayer) - { - return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : entityplayer.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; - } - - public void openChest() {} - - public void closeChest() {} - - public String getInvName() - { - return fullName; - } - - public int getInventoryStackLimit() - { - return 64; } public void invalidate() { super.invalidate(); - if(worldObj.isRemote) + if(worldObj.isRemote && audio != null) { audio.remove(); } @@ -203,46 +135,6 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple return rejects; } - - public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) - { - return true; - } - - public short getFacing() - { - return (short)facing; - } - - public void setFacing(short direction) - { - if(initialized) - { - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).removeTileEntity(this); - } - } - - initialized = false; - facing = direction; - sendPacket(); - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).addTileEntity(this); - } - initialized = true; - } - - public boolean wrenchCanRemove(EntityPlayer entityPlayer) - { - return true; - } - - public float getWrenchDropRate() - { - return 1.0F; - } public void setPowerProvider(IPowerProvider provider) { @@ -266,15 +158,10 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple return true; } - public boolean isAddedToEnergyNet() - { - return initialized; - } - /** * Gets the scaled energy level for the GUI. * @param i - multiplier - * @return + * @return scaled energy */ public int getScaledEnergyLevel(int i) { @@ -365,82 +252,6 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple public void attach(IComputerAccess computer, String computerSide) {} public void detach(IComputerAccess computer) {} - - public int getStartInventorySide(ForgeDirection side) - { - if (side == ForgeDirection.DOWN) return 1; - if (side == ForgeDirection.UP) return 0; - return 2; - } - - public int getSizeInventorySide(ForgeDirection side) - { - return 1; - } - - public int getSizeInventory() - { - return inventory.length; - } - - public ItemStack getStackInSlot(int par1) - { - return inventory[par1]; - } - - public ItemStack decrStackSize(int par1, int par2) - { - if (inventory[par1] != null) - { - ItemStack var3; - - if (inventory[par1].stackSize <= par2) - { - var3 = inventory[par1]; - inventory[par1] = null; - return var3; - } - else - { - var3 = inventory[par1].splitStack(par2); - - if (inventory[par1].stackSize == 0) - { - inventory[par1] = null; - } - - return var3; - } - } - else - { - return null; - } - } - - public ItemStack getStackInSlotOnClosing(int par1) - { - if (inventory[par1] != null) - { - ItemStack var2 = inventory[par1]; - inventory[par1] = null; - return var2; - } - else - { - return null; - } - } - - public void setInventorySlotContents(int par1, ItemStack par2ItemStack) - { - inventory[par1] = par2ItemStack; - - if (par2ItemStack != null && par2ItemStack.stackSize > getInventoryStackLimit()) - { - par2ItemStack.stackSize = getInventoryStackLimit(); - } - } public int transferToAcceptor(int amount) { diff --git a/src/common/net/uberkat/obsidian/common/TileEntityElectricBlock.java b/src/common/net/uberkat/obsidian/common/TileEntityElectricBlock.java new file mode 100644 index 000000000..104ea4e36 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityElectricBlock.java @@ -0,0 +1,228 @@ +package net.uberkat.obsidian.common; + +import obsidian.api.ITileNetwork; +import universalelectricity.prefab.TileEntityDisableable; +import ic2.api.EnergyNet; +import ic2.api.IWrenchable; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.ISidedInventory; + +public abstract class TileEntityElectricBlock extends TileEntityDisableable implements IWrenchable, ISidedInventory, IInventory, ITileNetwork +{ + /** The inventory slot itemstacks used by this block. */ + public ItemStack[] inventory; + + /** How much energy is stored in this block. */ + public int energyStored; + + /** The direction this block is facing. */ + public int facing; + + /** Maximum amount of energy this machine can hold. */ + public int MAX_ENERGY; + + /** The full name of this machine. */ + public String fullName; + + /** Whether or not this machine has initialized and registered with other mods. */ + public boolean initialized; + + /** The amount of players using this block */ + public int playersUsing = 0; + + /** A timer used to send packets to clients. */ + public int packetTick; + + /** + * The base of all blocks that deal with electricity. It has a facing state, initialized state, + * and a current amount of stored energy. + * @param name - full name of this block + * @param maxEnergy - how much energy this block can store + */ + public TileEntityElectricBlock(String name, int maxEnergy) + { + fullName = name; + MAX_ENERGY = maxEnergy; + } + + public void updateEntity() + { + if(!initialized && worldObj != null) + { + if(ObsidianIngots.hooks.IC2Loaded) + { + EnergyNet.getForWorld(worldObj).addTileEntity(this); + } + + initialized = true; + } + + onUpdate(); + + if(!worldObj.isRemote) + { + if(playersUsing > 0) + { + sendPacketWithRange(); + } + else { + if(packetTick % 100 == 0) + { + sendPacketWithRange(); + } + } + } + } + + /** + * Update call for machines. Use instead of updateEntity -- it's called every tick. + */ + public abstract void onUpdate(); + + public int getStartInventorySide(ForgeDirection side) + { + if (side == ForgeDirection.DOWN) return 1; + if (side == ForgeDirection.UP) return 0; + return 2; + } + + public int getSizeInventorySide(ForgeDirection side) + { + return 1; + } + + public int getSizeInventory() + { + return inventory.length; + } + + public ItemStack getStackInSlot(int par1) + { + return inventory[par1]; + } + + public ItemStack decrStackSize(int par1, int par2) + { + if (inventory[par1] != null) + { + ItemStack var3; + + if (inventory[par1].stackSize <= par2) + { + var3 = inventory[par1]; + inventory[par1] = null; + return var3; + } + else + { + var3 = inventory[par1].splitStack(par2); + + if (inventory[par1].stackSize == 0) + { + inventory[par1] = null; + } + + return var3; + } + } + else + { + return null; + } + } + + public ItemStack getStackInSlotOnClosing(int par1) + { + if (inventory[par1] != null) + { + ItemStack var2 = inventory[par1]; + inventory[par1] = null; + return var2; + } + else + { + return null; + } + } + + public void setInventorySlotContents(int par1, ItemStack par2ItemStack) + { + inventory[par1] = par2ItemStack; + + if (par2ItemStack != null && par2ItemStack.stackSize > getInventoryStackLimit()) + { + par2ItemStack.stackSize = getInventoryStackLimit(); + } + } + + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : entityplayer.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; + } + + public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) + { + return true; + } + + public short getFacing() + { + return (short)facing; + } + + public void setFacing(short direction) + { + if(initialized) + { + if(ObsidianIngots.hooks.IC2Loaded) + { + EnergyNet.getForWorld(worldObj).removeTileEntity(this); + } + } + + initialized = false; + facing = direction; + sendPacket(); + if(ObsidianIngots.hooks.IC2Loaded) + { + EnergyNet.getForWorld(worldObj).addTileEntity(this); + } + initialized = true; + } + + public boolean wrenchCanRemove(EntityPlayer entityPlayer) + { + return true; + } + + public float getWrenchDropRate() + { + return 1.0F; + } + + public boolean isAddedToEnergyNet() + { + return initialized; + } + + public String getInvName() + { + return fullName; + } + + public int getInventoryStackLimit() + { + return 64; + } + + public void openChest() + { + playersUsing++; + } + + public void closeChest() + { + playersUsing--; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityGenerator.java b/src/common/net/uberkat/obsidian/common/TileEntityGenerator.java new file mode 100644 index 000000000..5fe27ea3f --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityGenerator.java @@ -0,0 +1,484 @@ +package net.uberkat.obsidian.common; + +import buildcraft.api.core.Orientations; +import buildcraft.api.power.IPowerProvider; +import buildcraft.api.power.IPowerReceptor; +import buildcraft.api.power.PowerFramework; +import buildcraft.api.power.PowerProvider; + +import com.google.common.io.ByteArrayDataInput; + +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.IPeripheral; + +import ic2.api.Direction; +import ic2.api.ElectricItem; +import ic2.api.EnergyNet; +import ic2.api.IElectricItem; +import ic2.api.IEnergySource; +import ic2.api.IEnergyStorage; +import obsidian.api.IEnergizedItem; +import obsidian.api.IEnergyAcceptor; +import universalelectricity.core.UniversalElectricity; +import universalelectricity.core.Vector3; +import universalelectricity.electricity.ElectricInfo; +import universalelectricity.electricity.ElectricityManager; +import universalelectricity.implement.IConductor; +import universalelectricity.implement.IElectricityReceiver; +import universalelectricity.implement.IItemElectric; +import universalelectricity.implement.IJouleStorage; +import universalelectricity.prefab.TileEntityConductor; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; + +public abstract class TileEntityGenerator extends TileEntityElectricBlock implements IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IElectricityReceiver, IPeripheral +{ + /** The amount of fuel stored in this generator. */ + public int fuelStored; + + /** The maximum amount of fuel this generator can store. */ + public int MAX_FUEL; + + /** Output per tick this generator can transfer. */ + public int output = 128; + + /** BuildCraft power provider. */ + public IPowerProvider powerProvider; + + /** + * Generator -- a block that produces energy. It has a certain amount of fuel it can store as well as an output rate. + * @param name - full name of this generator + * @param maxEnergy - how much energy this generator can store + * @param maxFuel - how much fuel this generator can store + */ + public TileEntityGenerator(String name, int maxEnergy, int maxFuel) + { + super(name, maxEnergy); + MAX_FUEL = maxFuel; + inventory = new ItemStack[2]; + if(PowerFramework.currentFramework != null) + { + powerProvider = PowerFramework.currentFramework.createPowerProvider(); + powerProvider.configure(0, 2, 2000, 1, MAX_ENERGY/10); + } + } + + public void onUpdate() + { + if(powerProvider != null) + { + int received = (int)(powerProvider.useEnergy(25, 25, true)*10); + setEnergy(energyStored + received); + } + + if(inventory[1] != null && energyStored > 0) + { + if(inventory[1].getItem() instanceof IEnergizedItem) + { + IEnergizedItem item = (IEnergizedItem)inventory[1].getItem(); + int rejects = item.charge(inventory[1], item.getRate()); + setEnergy(energyStored - (item.getRate() - rejects)); + } + else if(inventory[1].getItem() instanceof IItemElectric) + { + IItemElectric electricItem = (IItemElectric) inventory[1].getItem(); + double ampsToGive = Math.min(ElectricInfo.getAmps(electricItem.getMaxJoules() * 0.005, getVoltage()), (energyStored*UniversalElectricity.IC2_RATIO)); + double joules = electricItem.onReceive(ampsToGive, getVoltage(), inventory[1]); + setJoules((energyStored*UniversalElectricity.IC2_RATIO) - (ElectricInfo.getJoules(ampsToGive, getVoltage(), 1) - joules)); + } + else if(inventory[1].getItem() instanceof IElectricItem) + { + int sent = ElectricItem.charge(inventory[1], energyStored, 3, false, false); + setEnergy(energyStored - sent); + } + } + + if(inventory[0] != null && fuelStored < MAX_ENERGY) + { + int fuel = getFuel(inventory[0]); + if(fuel > 0) + { + int fuelNeeded = MAX_FUEL - fuelStored; + if(fuel <= fuelNeeded) + { + fuelStored += fuel; + --inventory[0].stackSize; + } + + if(inventory[0].stackSize == 0) + { + inventory[0] = null; + } + } + } + + if(energyStored < MAX_ENERGY) + { + System.out.println(getEnvironmentBoost()); + setEnergy(energyStored + getEnvironmentBoost()); + + if(fuelStored > 0) + { + fuelStored--; + setEnergy(energyStored + 4); + } + } + + if(energyStored > 0) + { + TileEntity tileEntity = Vector3.getTileEntityFromSide(worldObj, Vector3.get(this), ForgeDirection.getOrientation(facing)); + + if(ObsidianIngots.hooks.IC2Loaded) + { + if(energyStored >= output) + { + setEnergy(energyStored - (output - EnergyNet.getForWorld(worldObj).emitEnergyFrom(this, output))); + } + } + + if(tileEntity != null) + { + if(isPowerReceptor(tileEntity)) + { + IPowerReceptor receptor = (IPowerReceptor)tileEntity; + int energyNeeded = Math.min(receptor.getPowerProvider().getMinEnergyReceived(), receptor.getPowerProvider().getMaxEnergyReceived())*10; + float transferEnergy = Math.max(Math.min(Math.min(energyNeeded, energyStored), 54000), 0); + receptor.getPowerProvider().receiveEnergy((float)(transferEnergy/10), Orientations.dirs()[ForgeDirection.getOrientation(facing).getOpposite().ordinal()]); + setEnergy(energyStored - (int)transferEnergy); + } + else if(tileEntity instanceof TileEntityConductor) + { + double joulesNeeded = ElectricityManager.instance.getElectricityRequired(((IConductor) tileEntity).getNetwork()); + double transferAmps = Math.max(Math.min(Math.min(ElectricInfo.getAmps(joulesNeeded, getVoltage()), ElectricInfo.getAmps(energyStored*UniversalElectricity.IC2_RATIO, getVoltage())), 80), 0); + if (!worldObj.isRemote) + { + ElectricityManager.instance.produceElectricity(this, (IConductor)tileEntity, transferAmps, getVoltage()); + } + setEnergy(energyStored - (int)(ElectricInfo.getJoules(transferAmps, getVoltage())*UniversalElectricity.TO_IC2_RATIO)); + } + else if(tileEntity instanceof IEnergyAcceptor) + { + if(((IEnergyAcceptor)tileEntity).canReceive(ForgeDirection.getOrientation(facing).getOpposite())) + { + int sendingEnergy = 0; + if(energyStored >= output) + { + sendingEnergy = output; + } + else if(energyStored < output) + { + sendingEnergy = energyStored; + } + + int rejects = ((IEnergyAcceptor)tileEntity).transferToAcceptor(output); + + setEnergy(energyStored - (sendingEnergy - rejects)); + } + } + } + } + } + + /** + * Gets the amount of fuel a certain ItemStack contains. + * @param itemstack - slot stack to check + * @return amount of fuel the stack contains + */ + public abstract int getFuel(ItemStack itemstack); + + /** + * Gets the boost this generator can receive in it's current location. + * @return environmental boost + */ + public int getEnvironmentBoost() + { + int boost = 0; + + if(worldObj.getBlockId(xCoord+1, yCoord, zCoord) == 10) + boost+=1; + if(worldObj.getBlockId(xCoord-1, yCoord, zCoord) == 10) + boost+=1; + if(worldObj.getBlockId(xCoord, yCoord+1, zCoord) == 10) + boost+=1; + if(worldObj.getBlockId(xCoord, yCoord-1, zCoord) == 10) + boost+=1; + if(worldObj.getBlockId(xCoord, yCoord, zCoord+1) == 10) + boost+=1; + if(worldObj.getBlockId(xCoord, yCoord, zCoord-1) == 10) + boost+=1; + + if(worldObj.isDaytime() && worldObj.canBlockSeeTheSky(xCoord, yCoord+1, zCoord) && !worldObj.isRaining() && !worldObj.isThundering() && !worldObj.provider.hasNoSky) + { + boost+=2; + if(worldObj.getWorldChunkManager().getBiomeGenAt(xCoord, zCoord).biomeName.equals("Desert")) + boost+=2; + else if(worldObj.getWorldChunkManager().getBiomeGenAt(xCoord, zCoord).biomeName.equals("Plains")) + boost+=1; + } + + return boost; + } + + /** + * Whether or not this machine can operate and generate power. + * @return if the machine can generate power + */ + public boolean canPower() + { + if(fuelStored <= 0) + { + return false; + } + + if(energyStored >= MAX_ENERGY) + { + return false; + } + return true; + } + + /** + * Whether or not the declared Tile Entity is an instance of a BuildCraft power receptor. + * @param tileEntity - tile entity to check + * @return if the tile entity is a power receptor + */ + public boolean isPowerReceptor(TileEntity tileEntity) + { + if(tileEntity instanceof IPowerReceptor) + { + IPowerReceptor receptor = (IPowerReceptor)tileEntity; + IPowerProvider provider = receptor.getPowerProvider(); + return provider != null && provider.getClass().getSuperclass().equals(PowerProvider.class); + } + return false; + } + + /** + * Gets the scaled energy level for the GUI. + * @param i - multiplier + * @return + */ + public int getScaledEnergyLevel(int i) + { + return energyStored*i / MAX_ENERGY; + } + + /** + * Gets the scaled fuel level for the GUI. + * @param i - multiplier + * @return + */ + public int getScaledFuelLevel(int i) + { + return fuelStored*i / MAX_FUEL; + } + + /** + * Set this block's energy to a new amount. + * @param energy - new amount of energy + */ + public void setEnergy(int energy) + { + energyStored = Math.max(Math.min(energy, MAX_ENERGY), 0); + } + + public void readFromNBT(NBTTagCompound nbtTags) + { + super.readFromNBT(nbtTags); + + if(PowerFramework.currentFramework != null) + { + PowerFramework.currentFramework.loadPowerProvider(this, nbtTags); + } + + NBTTagList tagList = nbtTags.getTagList("Items"); + inventory = new ItemStack[getSizeInventory()]; + + for (int slots = 0; slots < tagList.tagCount(); ++slots) + { + NBTTagCompound tagCompound = (NBTTagCompound)tagList.tagAt(slots); + byte slotID = tagCompound.getByte("Slot"); + + if (slotID >= 0 && slotID < inventory.length) + { + inventory[slotID] = ItemStack.loadItemStackFromNBT(tagCompound); + } + } + + energyStored = nbtTags.getInteger("energyStored"); + fuelStored = nbtTags.getInteger("fuelStored"); + facing = nbtTags.getInteger("facing"); + } + + public void writeToNBT(NBTTagCompound nbtTags) + { + super.writeToNBT(nbtTags); + + if(PowerFramework.currentFramework != null) + { + PowerFramework.currentFramework.savePowerProvider(this, nbtTags); + } + + nbtTags.setInteger("energyStored", energyStored); + nbtTags.setInteger("fuelStored", fuelStored); + nbtTags.setInteger("facing", facing); + NBTTagList tagList = new NBTTagList(); + + for (int slots = 0; slots < inventory.length; ++slots) + { + if (inventory[slots] != null) + { + NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setByte("Slot", (byte)slots); + inventory[slots].writeToNBT(tagCompound); + tagList.appendTag(tagCompound); + } + } + + nbtTags.setTag("Items", tagList); + } + + public double getVoltage() + { + return 120; + } + + public void setJoules(double joules, Object... data) + { + setEnergy((int)(joules*UniversalElectricity.TO_IC2_RATIO)); + } + + public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try { + facing = dataStream.readInt(); + energyStored = dataStream.readInt(); + fuelStored = dataStream.readInt(); + worldObj.markBlockAsNeedsUpdate(xCoord, yCoord, zCoord); + } catch (Exception e) + { + System.out.println("[ObsidianIngots] Error while handling tile entity packet."); + e.printStackTrace(); + } + } + + public void sendPacket() + { + PacketHandler.sendGeneratorPacket(this); + } + + public void sendPacketWithRange() + { + PacketHandler.sendGeneratorPacketWithRange(this, 50); + } + + public String getType() + { + return getInvName(); + } + + public String[] getMethodNames() + { + return new String[] {"getStored", "getOutput", "getMaxEnergy", "getEnergyNeeded", "getFuel", "getFuelNeeded"}; + } + + public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception + { + switch(method) + { + case 0: + return new Object[] {energyStored}; + case 1: + return new Object[] {output}; + case 2: + return new Object[] {MAX_ENERGY}; + case 3: + return new Object[] {(MAX_ENERGY-energyStored)}; + case 4: + return new Object[] {fuelStored}; + case 5: + return new Object[] {MAX_FUEL-fuelStored}; + default: + System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID()); + return null; + } + } + + public boolean canAttachToSide(int side) + { + return true; + } + + public void attach(IComputerAccess computer, String computerSide) {} + + public void detach(IComputerAccess computer) {} + + public void setPowerProvider(IPowerProvider provider) + { + powerProvider = provider; + } + + public IPowerProvider getPowerProvider() + { + return powerProvider; + } + + public void doWork() {} + + public int powerRequest() + { + return getPowerProvider().getMaxEnergyReceived(); + } + + public double getMaxJoules() + { + return MAX_ENERGY*UniversalElectricity.IC2_RATIO; + } + + public double getJoules(Object... data) + { + return energyStored*UniversalElectricity.IC2_RATIO; + } + + public int getMaxEnergyOutput() + { + return output; + } + + public boolean emitsEnergyTo(TileEntity receiver, Direction direction) + { + return direction.toForgeDirection() == ForgeDirection.getOrientation(facing); + } + + public int getStored() + { + return energyStored; + } + + public int getCapacity() + { + return MAX_ENERGY; + } + + public int getRate() + { + return output; + } + + public boolean canConnect(ForgeDirection side) + { + return side == ForgeDirection.getOrientation(facing); + } + + public void onReceive(TileEntity sender, double amps, double voltage, ForgeDirection side) {} + + public double wattRequest() + { + return 0; + } + + public boolean canReceiveFromSide(ForgeDirection side) + { + return false; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityHeatGenerator.java b/src/common/net/uberkat/obsidian/common/TileEntityHeatGenerator.java new file mode 100644 index 000000000..0ace0e1b3 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityHeatGenerator.java @@ -0,0 +1,18 @@ +package net.uberkat.obsidian.common; + +import com.google.common.io.ByteArrayDataInput; + +import net.minecraft.src.*; + +public class TileEntityHeatGenerator extends TileEntityGenerator +{ + public TileEntityHeatGenerator() + { + super("Heat Generator", 8000, 2000); + } + + public int getFuel(ItemStack itemstack) + { + return TileEntityFurnace.getItemBurnTime(itemstack); + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java b/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java index 4a3f7a9eb..bccb0ec85 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java @@ -42,38 +42,20 @@ import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; -public class TileEntityPowerUnit extends TileEntityDisableable implements IInventory, ISidedInventory, ITileNetwork, IWrenchable, IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral +public class TileEntityPowerUnit extends TileEntityElectricBlock implements IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral { - /** The inventory slot itemstacks used by this power unit. */ - public ItemStack[] inventory = new ItemStack[2]; - - /** Maximum amount of energy this unit can hold. */ - public int maxEnergy; - /** Output per tick this machine can transfer. */ public int output; - /** The amount of energy this unit is storing. */ - public int energyStored = 0; - - /** Direction this block is facing. */ - public int facing; - - /** A timer used to send packets to clients. */ - public int packetTick = 0; - /** BuildCraft power provider. */ public IPowerProvider powerProvider; - /** Whether or not this machine has initialized and registered with other mods. */ - public boolean initialized = false; - /** * A block used to store and transfer electricity. */ public TileEntityPowerUnit() { - this(500000, 256); + this("Power Unit", 500000, 256); } /** @@ -81,39 +63,20 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven * @param energy - maximum energy this block can hold. * @param i - output per tick this block can handle. */ - public TileEntityPowerUnit(int energy, int i) + public TileEntityPowerUnit(String name, int maxEnergy, int i) { - maxEnergy = energy; + super(name, maxEnergy); + inventory = new ItemStack[2]; output = i; if(PowerFramework.currentFramework != null) { powerProvider = PowerFramework.currentFramework.createPowerProvider(); - powerProvider.configure(5, 25, 25, 25, maxEnergy/10); + powerProvider.configure(0, 2, 2000, 1, MAX_ENERGY/10); } } - public void updateEntity() + public void onUpdate() { - if(!worldObj.isRemote) - { - if(packetTick == 5) - { - PacketHandler.sendPowerUnitPacket(this); - } - - packetTick++; - } - - if(!initialized) - { - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).addTileEntity(this); - } - - initialized = true; - } - if(powerProvider != null) { int received = (int)(powerProvider.useEnergy(25, 25, true)*10); @@ -142,7 +105,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven } } - if(inventory[1] != null && energyStored < maxEnergy) + if(inventory[1] != null && energyStored < MAX_ENERGY) { if(inventory[1].getItem() instanceof IEnergizedItem) { @@ -165,7 +128,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven IElectricItem item = (IElectricItem)inventory[1].getItem(); if(item.canProvideEnergy()) { - int gain = ElectricItem.discharge(inventory[1], maxEnergy - energyStored, 3, false, false); + int gain = ElectricItem.discharge(inventory[1], MAX_ENERGY - energyStored, 3, false, false); setEnergy(energyStored + gain); } } @@ -234,105 +197,16 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven } } } - - if(!worldObj.isRemote) - { - PacketHandler.sendPowerUnitPacketWithRange(this, 50); - } } + /** + * Set this block's energy to a new amount. + * @param energy - new amount of energy + */ public void setEnergy(int energy) { - energyStored = Math.max(Math.min(energy, maxEnergy), 0); + energyStored = Math.max(Math.min(energy, MAX_ENERGY), 0); } - - public int getStartInventorySide(ForgeDirection side) - { - return 1; - } - - public int getSizeInventorySide(ForgeDirection side) - { - return 1; - } - - public int getSizeInventory() - { - return inventory.length; - } - - public ItemStack getStackInSlot(int par1) - { - return inventory[par1]; - } - - public ItemStack decrStackSize(int par1, int par2) - { - if (inventory[par1] != null) - { - ItemStack var3; - - if (inventory[par1].stackSize <= par2) - { - var3 = inventory[par1]; - inventory[par1] = null; - return var3; - } - else - { - var3 = inventory[par1].splitStack(par2); - - if (inventory[par1].stackSize == 0) - { - inventory[par1] = null; - } - - return var3; - } - } - else - { - return null; - } - } - - public ItemStack getStackInSlotOnClosing(int par1) - { - if (inventory[par1] != null) - { - ItemStack var2 = inventory[par1]; - inventory[par1] = null; - return var2; - } - else - { - return null; - } - } - - public void setInventorySlotContents(int par1, ItemStack par2ItemStack) - { - inventory[par1] = par2ItemStack; - - if (par2ItemStack != null && par2ItemStack.stackSize > getInventoryStackLimit()) - { - par2ItemStack.stackSize = getInventoryStackLimit(); - } - } - - public String getInvName() - { - return output == 1024 ? "Advanced Power Unit" : "Power Unit"; - } - - public int getInventoryStackLimit() - { - return 64; - } - - public void openChest() {} - - public void closeChest() {} public void readFromNBT(NBTTagCompound nbtTags) { @@ -401,56 +275,11 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven } } - public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) - { - return facing != side; - } - - public short getFacing() - { - return (short)facing; - } - - public void setFacing(short direction) - { - if(initialized) - { - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).removeTileEntity(this); - } - } - - initialized = false; - facing = direction; - PacketHandler.sendPowerUnitPacket(this); - if(ObsidianIngots.hooks.IC2Loaded) - { - EnergyNet.getForWorld(worldObj).addTileEntity(this); - } - initialized = true; - } - - public boolean wrenchCanRemove(EntityPlayer entityPlayer) - { - return true; - } - - public float getWrenchDropRate() - { - return 1.0F; - } - public boolean acceptsEnergyFrom(TileEntity emitter, Direction direction) { return direction.toForgeDirection() != ForgeDirection.getOrientation(facing); } - public boolean isAddedToEnergyNet() - { - return initialized; - } - public int getStored() { return energyStored; @@ -458,7 +287,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven public int getCapacity() { - return maxEnergy; + return MAX_ENERGY; } public int getRate() @@ -468,13 +297,13 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven public boolean demandsEnergy() { - return energyStored < maxEnergy; + return energyStored < MAX_ENERGY; } public int injectEnergy(Direction direction, int i) { int rejects = 0; - int neededEnergy = maxEnergy-energyStored; + int neededEnergy = MAX_ENERGY-energyStored; if(i <= neededEnergy) { energyStored += i; @@ -510,7 +339,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven public double getMaxJoules() { - return maxEnergy*UniversalElectricity.IC2_RATIO; + return MAX_ENERGY*UniversalElectricity.IC2_RATIO; } public void setPowerProvider(IPowerProvider provider) @@ -542,14 +371,14 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven /** * Whether or not the declared Tile Entity is an instance of a BuildCraft power receptor. - * @param tileEntity - * @return + * @param tileEntity - tile entity to check + * @return if the tile entity is a power receptor */ public boolean isPowerReceptor(TileEntity tileEntity) { if(tileEntity instanceof IPowerReceptor) { - IPowerReceptor receptor = (IPowerReceptor) tileEntity; + IPowerReceptor receptor = (IPowerReceptor)tileEntity; IPowerProvider provider = receptor.getPowerProvider(); return provider != null && provider.getClass().getSuperclass().equals(PowerProvider.class); } @@ -563,7 +392,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven public double wattRequest() { - return ElectricInfo.getWatts(maxEnergy*UniversalElectricity.IC2_RATIO) - ElectricInfo.getWatts(energyStored*UniversalElectricity.IC2_RATIO); + return ElectricInfo.getWatts(MAX_ENERGY*UniversalElectricity.IC2_RATIO) - ElectricInfo.getWatts(energyStored*UniversalElectricity.IC2_RATIO); } public boolean canReceiveFromSide(ForgeDirection side) @@ -571,11 +400,6 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven return side != ForgeDirection.getOrientation(facing); } - public boolean isUseableByPlayer(EntityPlayer entityplayer) - { - return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : entityplayer.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; - } - public String getType() { return getInvName(); @@ -595,9 +419,9 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven case 1: return new Object[] {output}; case 2: - return new Object[] {maxEnergy}; + return new Object[] {MAX_ENERGY}; case 3: - return new Object[] {(maxEnergy-energyStored)}; + return new Object[] {(MAX_ENERGY-energyStored)}; default: System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID()); return null; @@ -616,7 +440,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven public int transferToAcceptor(int amount) { int rejects = 0; - int neededEnergy = maxEnergy-energyStored; + int neededEnergy = MAX_ENERGY-energyStored; if(amount <= neededEnergy) { energyStored += amount; @@ -634,4 +458,14 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven { return side != ForgeDirection.getOrientation(facing); } + + public void sendPacket() + { + PacketHandler.sendPowerUnitPacket(this); + } + + public void sendPacketWithRange() + { + PacketHandler.sendPowerUnitPacketWithRange(this, 50); + } } diff --git a/src/common/obsidian/api/IElectricMachine.java b/src/common/obsidian/api/IElectricMachine.java index 9c02d10a7..3675a6fc5 100644 --- a/src/common/obsidian/api/IElectricMachine.java +++ b/src/common/obsidian/api/IElectricMachine.java @@ -19,7 +19,7 @@ import net.minecraftforge.common.ISidedInventory; * @author AidanBrady * */ -public interface IElectricMachine extends IInventory, ISidedInventory, IWrenchable, ITileNetwork, IPowerReceptor, IEnergySink, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral +public interface IElectricMachine extends IPowerReceptor, IEnergySink, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral { /** * Update call for machines. Use instead of updateEntity() - it's called every tick. @@ -36,16 +36,6 @@ public interface IElectricMachine extends IInventory, ISidedInventory, IWrenchab * Runs this machine's operation -- or smelts the item. */ public void operate(); - - /** - * Sends a tile entity packet to the server. - */ - public void sendPacket(); - - /** - * Sends a tile entity packet to the server with a defined range. - */ - public void sendPacketWithRange(); /** * Gets the recipe vector from the machine tile entity. diff --git a/src/common/obsidian/api/IEnergizedItem.java b/src/common/obsidian/api/IEnergizedItem.java index 91f57e8ec..a9b662296 100644 --- a/src/common/obsidian/api/IEnergizedItem.java +++ b/src/common/obsidian/api/IEnergizedItem.java @@ -50,4 +50,10 @@ public interface IEnergizedItem * @return leftover energy */ public int discharge(ItemStack itemstack, int amount); + + /** + * Gets the divider that gets that returns the max damage as 100. + * @return divider + */ + public int getDivider(); } diff --git a/src/common/obsidian/api/ITileNetwork.java b/src/common/obsidian/api/ITileNetwork.java index c3fe09009..74a35f4ce 100644 --- a/src/common/obsidian/api/ITileNetwork.java +++ b/src/common/obsidian/api/ITileNetwork.java @@ -21,4 +21,14 @@ public interface ITileNetwork * @param dataStream */ public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream); + + /** + * Sends a tile entity packet to the server. + */ + public void sendPacket(); + + /** + * Sends a tile entity packet to the server with a defined range. + */ + public void sendPacketWithRange(); } diff --git a/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java b/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java index 5944211d8..87dd64d32 100644 --- a/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java +++ b/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java @@ -31,6 +31,7 @@ import net.uberkat.obsidian.common.ObsidianUtils; import net.uberkat.obsidian.common.TileEntityCombiner; import net.uberkat.obsidian.common.TileEntityCrusher; import net.uberkat.obsidian.common.TileEntityEnrichmentChamber; +import net.uberkat.obsidian.common.TileEntityGenerator; import net.uberkat.obsidian.common.TileEntityPlatinumCompressor; import net.uberkat.obsidian.common.TileEntityPowerUnit; import net.uberkat.obsidian.common.TileEntityTheoreticalElementizer; @@ -59,7 +60,6 @@ public class ClientProxy extends CommonProxy MinecraftForgeClient.preloadTexture("/textures/ElementizerFront.png"); MinecraftForgeClient.preloadTexture("/textures/ElementizerBack.png"); MinecraftForgeClient.preloadTexture("/textures/ElementizerSide.png"); - MinecraftForgeClient.preloadTexture("/texture/PlatinumCable.png"); //Register animated TextureFX for machines try { @@ -119,6 +119,9 @@ public class ClientProxy extends CommonProxy case 8: TileEntityPowerUnit tileentity5 = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); return new GuiPowerUnit(player.inventory, tileentity5); + case 9: + TileEntityGenerator tileentity6 = (TileEntityGenerator)world.getBlockTileEntity(x, y, z); + return new GuiGenerator(player.inventory, tileentity6); } return null; } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiAdvancedElectricMachine.java b/src/minecraft/net/uberkat/obsidian/client/GuiAdvancedElectricMachine.java index 74c799c56..4b9b0eabe 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiAdvancedElectricMachine.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiAdvancedElectricMachine.java @@ -18,7 +18,7 @@ public class GuiAdvancedElectricMachine extends GuiContainer /** * Draw the foreground layer for the GuiContainer (everythin in front of the items) */ - protected void drawGuiContainerForegroundLayer() + protected void drawGuiContainerForegroundLayer(int par1, int par2) { fontRenderer.drawString(tileEntity.fullName, 45, 6, 0x404040); fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040); diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiElectricMachine.java b/src/minecraft/net/uberkat/obsidian/client/GuiElectricMachine.java index 575a7dfeb..00359fcb3 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiElectricMachine.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiElectricMachine.java @@ -18,7 +18,7 @@ public class GuiElectricMachine extends GuiContainer /** * Draw the foreground layer for the GuiContainer (everythin in front of the items) */ - protected void drawGuiContainerForegroundLayer() + protected void drawGuiContainerForegroundLayer(int par1, int par2) { fontRenderer.drawString(tileEntity.fullName, 45, 6, 0x404040); fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040); diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiGenerator.java b/src/minecraft/net/uberkat/obsidian/client/GuiGenerator.java new file mode 100644 index 000000000..7c31b6be8 --- /dev/null +++ b/src/minecraft/net/uberkat/obsidian/client/GuiGenerator.java @@ -0,0 +1,47 @@ +package net.uberkat.obsidian.client; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.src.*; +import net.uberkat.obsidian.common.ContainerGenerator; +import net.uberkat.obsidian.common.TileEntityGenerator; + +public class GuiGenerator extends GuiContainer +{ + public TileEntityGenerator tileEntity; + + public GuiGenerator(InventoryPlayer inventory, TileEntityGenerator tentity) + { + super(new ContainerGenerator(inventory, tentity)); + tileEntity = tentity; + } + + /** + * Draw the foreground layer for the GuiContainer (everythin in front of the items) + */ + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + fontRenderer.drawString(tileEntity.fullName, 45, 6, 0x404040); + fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040); + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + int texture = mc.renderEngine.getTexture("/gui/GuiGenerator.png"); + 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.getScaledFuelLevel(52); + drawTexturedModalRect(guiWidth + 7, guiHeight + 17 + 52 - displayInt, 176, 52 + 52 - displayInt, 4, displayInt); + + displayInt = tileEntity.getScaledEnergyLevel(52); + drawTexturedModalRect(guiWidth + 165, guiHeight + 17 + 52 - displayInt, 176, 52 - displayInt, 4, displayInt); + } +} diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java b/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java index 91aa585bd..2d4428de3 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java @@ -20,9 +20,9 @@ public class GuiPowerUnit extends GuiContainer tileEntity = tentity; } - protected void drawGuiContainerForegroundLayer() + protected void drawGuiContainerForegroundLayer(int par1, int par2) { - String capacityInfo = "Stored: " + ObsidianUtils.getDisplayedEnergyNoColor(tileEntity.energyStored) + "/" + ObsidianUtils.getDisplayedEnergyNoColor(tileEntity.maxEnergy); + String capacityInfo = "Stored: " + ObsidianUtils.getDisplayedEnergyNoColor(tileEntity.energyStored) + "/" + ObsidianUtils.getDisplayedEnergyNoColor(tileEntity.MAX_ENERGY); String outputInfo = "Output: " + ObsidianUtils.getDisplayedEnergyNoColor(tileEntity.output) + "/t"; fontRenderer.drawString(tileEntity.getInvName(), 43, 6, 0x404040); fontRenderer.drawString(capacityInfo, 45, 42, 0x404040); @@ -39,7 +39,7 @@ public class GuiPowerUnit extends GuiContainer guiWidth = (width - xSize) / 2; guiHeight = (height - ySize) / 2; drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); - int scale = (int)(((double)tileEntity.energyStored / tileEntity.maxEnergy) * 72); + int scale = (int)(((double)tileEntity.energyStored / tileEntity.MAX_ENERGY) * 72); drawTexturedModalRect(guiWidth + 65, guiHeight + 17, 176, 0, scale, 20); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java b/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java index e777a4b8c..1694c002d 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java @@ -14,9 +14,9 @@ public class GuiTheoreticalElementizer extends GuiAdvancedElectricMachine super(inventory, tentity); } - protected void drawGuiContainerForegroundLayer() + protected void drawGuiContainerForegroundLayer(int par1, int par2) { - super.drawGuiContainerForegroundLayer(); + super.drawGuiContainerForegroundLayer(par1, par2); String displayText = ""; if(tileEntity.isActive) {