From 44bb93be1e536d46d9fcf00fedc57c748bd557e5 Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Tue, 2 Oct 2012 14:39:40 -0400 Subject: [PATCH] v4.2.0 Beta #1 Sorry, changelog is too big. To be precise, *ENERGY.* --- bin/minecraft/gui/GuiCombiner.png | Bin 4235 -> 5415 bytes bin/minecraft/gui/GuiCompressor.png | Bin 3961 -> 5131 bytes bin/minecraft/gui/GuiElementizer.png | Bin 3902 -> 5085 bytes bin/minecraft/gui/GuiPowerUnit.png | Bin 0 -> 4105 bytes bin/minecraft/obsidian/items.png | Bin 14060 -> 14546 bytes bin/minecraft/obsidian/terrain.png | Bin 15188 -> 15320 bytes .../obsidian/api/IElectricMachine.java | 67 +++ .../uberkat/obsidian/api/IEnergizedItem.java | 59 ++ .../{common => api}/INetworkedMachine.java | 2 +- .../uberkat/obsidian/common/BlockMachine.java | 28 +- .../uberkat/obsidian/common/BlockMulti.java | 4 +- .../net/uberkat/obsidian/common/BlockOre.java | 2 + .../obsidian/common/BlockPowerUnit.java | 214 +++++++ .../uberkat/obsidian/common/CommonProxy.java | 36 +- .../ContainerAdvancedElectricMachine.java | 121 ++++ .../obsidian/common/ContainerCombiner.java | 163 ----- .../obsidian/common/ContainerCrusher.java | 163 ----- .../common/ContainerElectricMachine.java | 105 ++++ .../common/ContainerEnrichmentChamber.java | 163 ----- .../common/ContainerPlatinumCompressor.java | 163 ----- .../obsidian/common/ContainerPowerUnit.java | 99 +++ .../ContainerTheoreticalElementizer.java | 163 ----- ...ItemMachine.java => ItemBlockMachine.java} | 4 +- .../{ItemMulti.java => ItemBlockMulti.java} | 4 +- .../{ItemOre.java => ItemBlockOre.java} | 4 +- .../obsidian/common/ItemBlockPowerUnit.java | 50 ++ .../obsidian/common/ItemEnergized.java | 186 ++++++ .../obsidian/common/ItemLightningRod.java | 2 +- .../uberkat/obsidian/common/ItemObsidian.java | 2 +- .../obsidian/common/ItemObsidianArmor.java | 2 +- .../obsidian/common/ItemObsidianBow.java | 2 +- .../obsidian/common/ItemObsidianHoe.java | 2 +- .../obsidian/common/ItemObsidianKnife.java | 2 +- .../obsidian/common/ItemObsidianPaxel.java | 2 +- .../obsidian/common/ItemObsidianPickaxe.java | 2 +- .../obsidian/common/ItemObsidianSpade.java | 2 +- .../obsidian/common/ItemObsidianSword.java | 2 +- .../obsidian/common/ItemStopwatch.java | 4 +- .../obsidian/common/ItemWeatherOrb.java | 4 +- .../obsidian/common/ObsidianHooks.java | 8 +- .../obsidian/common/ObsidianIngots.java | 129 ++-- .../obsidian/common/ObsidianUtils.java | 31 +- .../uberkat/obsidian/common/OreHandler.java | 2 +- .../obsidian/common/PacketHandler.java | 141 ++++- ...MachineRecipes.java => RecipeHandler.java} | 12 +- .../uberkat/obsidian/common/SlotEnergy.java | 19 + .../net/uberkat/obsidian/common/Sound.java | 17 - .../TileEntityAdvancedElectricMachine.java | 486 +++++++++++++++ .../common/TileEntityAdvancedPowerUnit.java | 9 + .../common/TileEntityBasicMachine.java | 142 +++++ .../obsidian/common/TileEntityCombiner.java | 161 +---- .../obsidian/common/TileEntityCrusher.java | 154 +---- .../common/TileEntityElectricMachine.java | 420 +++++++++++++ .../common/TileEntityEnrichmentChamber.java | 150 +---- .../obsidian/common/TileEntityMachine.java | 39 +- .../common/TileEntityPlatinumCompressor.java | 160 +---- .../obsidian/common/TileEntityPowerUnit.java | 563 ++++++++++++++++++ .../TileEntityTheoreticalElementizer.java | 135 +---- .../uberkat/obsidian/client/ClientProxy.java | 5 +- .../uberkat/obsidian/client/GuiCombiner.java | 25 +- .../uberkat/obsidian/client/GuiCredits.java | 16 +- .../uberkat/obsidian/client/GuiCrusher.java | 25 +- .../obsidian/client/GuiEnrichmentChamber.java | 23 +- .../client/GuiPlatinumCompressor.java | 15 +- .../uberkat/obsidian/client/GuiPowerUnit.java | 45 ++ .../client/GuiTheoreticalElementizer.java | 22 +- 66 files changed, 3038 insertions(+), 1744 deletions(-) create mode 100755 bin/minecraft/gui/GuiPowerUnit.png create mode 100644 src/common/net/uberkat/obsidian/api/IElectricMachine.java create mode 100644 src/common/net/uberkat/obsidian/api/IEnergizedItem.java rename src/common/net/uberkat/obsidian/{common => api}/INetworkedMachine.java (94%) create mode 100644 src/common/net/uberkat/obsidian/common/BlockPowerUnit.java create mode 100644 src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java delete mode 100644 src/common/net/uberkat/obsidian/common/ContainerCombiner.java delete mode 100644 src/common/net/uberkat/obsidian/common/ContainerCrusher.java create mode 100644 src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java delete mode 100644 src/common/net/uberkat/obsidian/common/ContainerEnrichmentChamber.java delete mode 100644 src/common/net/uberkat/obsidian/common/ContainerPlatinumCompressor.java create mode 100644 src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java delete mode 100644 src/common/net/uberkat/obsidian/common/ContainerTheoreticalElementizer.java rename src/common/net/uberkat/obsidian/common/{ItemMachine.java => ItemBlockMachine.java} (91%) rename src/common/net/uberkat/obsidian/common/{ItemMulti.java => ItemBlockMulti.java} (91%) rename src/common/net/uberkat/obsidian/common/{ItemOre.java => ItemBlockOre.java} (88%) create mode 100644 src/common/net/uberkat/obsidian/common/ItemBlockPowerUnit.java create mode 100644 src/common/net/uberkat/obsidian/common/ItemEnergized.java rename src/common/net/uberkat/obsidian/common/{MachineRecipes.java => RecipeHandler.java} (86%) create mode 100644 src/common/net/uberkat/obsidian/common/SlotEnergy.java delete mode 100644 src/common/net/uberkat/obsidian/common/Sound.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityElectricMachine.java create mode 100644 src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java create mode 100644 src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java diff --git a/bin/minecraft/gui/GuiCombiner.png b/bin/minecraft/gui/GuiCombiner.png index 4bba6646a3c96f6adbea2b219bb0016b587800b2..263b17a1dd1283c608f72fc2281d501b31ced3cd 100755 GIT binary patch literal 5415 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 diff --git a/bin/minecraft/gui/GuiCompressor.png b/bin/minecraft/gui/GuiCompressor.png index 2e94d61de8b87e7d25e3c3102dde2494b78291a6..6624809b8ebb7ce5205944baf902874ae00f9d42 100755 GIT binary patch literal 5131 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⋙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 a9(Gdbt;#1#4)8BNV1CZply=7br+)(B0ND)y literal 0 HcmV?d00001 diff --git a/bin/minecraft/obsidian/items.png b/bin/minecraft/obsidian/items.png index 5b69fb7e73e91c9a35cc004a9031702c5c6549cf..b9240e0860dd22e386fc5ec94b5a9c39189795b2 100644 GIT binary patch delta 13255 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 delta 12763 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 x@ZZ(-~+mGX9`BmuHsIdmC5v6W)cNkk(NY56n2 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 Qw=Ce|IqS29XI!5AFY^$ZhyVZp diff --git a/src/common/net/uberkat/obsidian/api/IElectricMachine.java b/src/common/net/uberkat/obsidian/api/IElectricMachine.java new file mode 100644 index 000000000..e20480321 --- /dev/null +++ b/src/common/net/uberkat/obsidian/api/IElectricMachine.java @@ -0,0 +1,67 @@ +package net.uberkat.obsidian.api; + +import java.util.List; + +import ic2.api.IWrenchable; +import net.minecraft.src.*; +import net.minecraftforge.common.ISidedInventory; + +/** + * A group of common methods used by all Obsidian Ingots machines. + * @author AidanBrady + * + */ +public interface IElectricMachine extends IInventory, ISidedInventory, IWrenchable, INetworkedMachine +{ + /** + * Update call for machines. Use instead of updateEntity() - it's called every tick. + */ + public void onUpdate(); + + /** + * Whether or not this machine can operate. + * @return can operate + */ + public boolean canOperate(); + + /** + * 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. + * @return recipes + */ + public List getRecipes(); + + /** + * Gets the scaled charge level for the GUI. + * @param i - control + * @return scaled charge level + */ + public int getScaledChargeLevel(int i); + + /** + * Gets the scaled progress for the GUI. + * @param i - control + * @return scaled progress + */ + public int getScaledProgress(int i); + + /** + * 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/net/uberkat/obsidian/api/IEnergizedItem.java b/src/common/net/uberkat/obsidian/api/IEnergizedItem.java new file mode 100644 index 000000000..092ed6a71 --- /dev/null +++ b/src/common/net/uberkat/obsidian/api/IEnergizedItem.java @@ -0,0 +1,59 @@ +package net.uberkat.obsidian.api; + +import net.minecraft.src.*; + +/** + * Implement this in your item class if it can store or transfer energy. + * @author AidanBrady + * + */ +public interface IEnergizedItem +{ + /** + * Gets the amount of energy the item has from NBT storage. + * @param itemstack + * @return amount of energy + */ + public int getEnergy(ItemStack itemstack); + + /** + * Sets the energy the item has with NBT. + * @param itemstack + * @param energy + */ + public void setEnergy(ItemStack itemstack, int energy); + + /** + * Gets the maximum amount of energy this item can hold. + * @return maximum energy + */ + public int getMaxEnergy(); + + /** + * Gets the rate of transfer this item can handle. + * @return + */ + public int getRate(); + + /** + * Charges the item with the defined amount of energy. + * @param itemstack + * @param amount + * @return leftover energy + */ + public int charge(ItemStack itemstack, int amount); + + /** + * Removes the defined amount of energy from the item. + * @param itemstack + * @param amount + * @return leftover energy + */ + public int discharge(ItemStack itemstack, int amount); + + /** + * Whether or not this item's energy can be used. + * @return if energy can be used + */ + public boolean canCharge(); +} diff --git a/src/common/net/uberkat/obsidian/common/INetworkedMachine.java b/src/common/net/uberkat/obsidian/api/INetworkedMachine.java similarity index 94% rename from src/common/net/uberkat/obsidian/common/INetworkedMachine.java rename to src/common/net/uberkat/obsidian/api/INetworkedMachine.java index 1cff04717..f016d1457 100644 --- a/src/common/net/uberkat/obsidian/common/INetworkedMachine.java +++ b/src/common/net/uberkat/obsidian/api/INetworkedMachine.java @@ -1,4 +1,4 @@ -package net.uberkat.obsidian.common; +package net.uberkat.obsidian.api; import net.minecraft.src.EntityPlayer; import net.minecraft.src.NetworkManager; diff --git a/src/common/net/uberkat/obsidian/common/BlockMachine.java b/src/common/net/uberkat/obsidian/common/BlockMachine.java index 903afa85e..86683f872 100644 --- a/src/common/net/uberkat/obsidian/common/BlockMachine.java +++ b/src/common/net/uberkat/obsidian/common/BlockMachine.java @@ -29,13 +29,13 @@ public class BlockMachine extends BlockContainer super(id, Material.iron); setHardness(3.5F); setResistance(8F); - setCreativeTab(CreativeTabs.tabDeco); + setCreativeTab(CreativeTabs.tabDecorations); setRequiresSelfNotify(); } public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entityliving) { - TileEntityMachine tileEntity = (TileEntityMachine)world.getBlockTileEntity(x, y, z); + TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); int side = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; int change = 3; @@ -53,7 +53,7 @@ public class BlockMachine extends BlockContainer @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random random) { - TileEntityMachine tileEntity = (TileEntityMachine)world.getBlockTileEntity(x, y, z); + TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); if (isActive(world, x, y, z)) { float var7 = (float)x + 0.5F; @@ -150,7 +150,7 @@ public class BlockMachine extends BlockContainer public int getBlockTexture(IBlockAccess world, int x, int y, int z, int side) { int metadata = world.getBlockMetadata(x, y, z); - TileEntityMachine tileEntity = (TileEntityMachine)world.getBlockTileEntity(x, y, z); + TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); if(metadata == 0) { @@ -242,7 +242,7 @@ public class BlockMachine extends BlockContainer */ public boolean isActive(IBlockAccess world, int x, int y, int z) { - TileEntityMachine tileEntity = (TileEntityMachine)world.getBlockTileEntity(x, y, z); + TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); if(tileEntity != null) { return tileEntity.isActive; @@ -252,7 +252,7 @@ public class BlockMachine extends BlockContainer public void breakBlock(World world, int par2, int par3, int par4, int i1, int i2) { - TileEntityMachine var5 = (TileEntityMachine)world.getBlockTileEntity(par2, par3, par4); + TileEntityBasicMachine var5 = (TileEntityBasicMachine)world.getBlockTileEntity(par2, par3, par4); if (var5 != null) { @@ -262,13 +262,13 @@ public class BlockMachine extends BlockContainer if (var7 != null) { - float var8 = this.machineRand.nextFloat() * 0.8F + 0.1F; - float var9 = this.machineRand.nextFloat() * 0.8F + 0.1F; - float var10 = this.machineRand.nextFloat() * 0.8F + 0.1F; + float var8 = machineRand.nextFloat() * 0.8F + 0.1F; + float var9 = machineRand.nextFloat() * 0.8F + 0.1F; + float var10 = machineRand.nextFloat() * 0.8F + 0.1F; while (var7.stackSize > 0) { - int var11 = this.machineRand.nextInt(21) + 10; + int var11 = machineRand.nextInt(21) + 10; if (var11 > var7.stackSize) { @@ -284,9 +284,9 @@ public class BlockMachine extends BlockContainer } float var13 = 0.05F; - var12.motionX = (double)((float)this.machineRand.nextGaussian() * var13); - var12.motionY = (double)((float)this.machineRand.nextGaussian() * var13 + 0.2F); - var12.motionZ = (double)((float)this.machineRand.nextGaussian() * var13); + var12.motionX = (double)((float)machineRand.nextGaussian() * var13); + var12.motionY = (double)((float)machineRand.nextGaussian() * var13 + 0.2F); + var12.motionZ = (double)((float)machineRand.nextGaussian() * var13); world.spawnEntityInWorld(var12); } } @@ -305,7 +305,7 @@ public class BlockMachine extends BlockContainer } else { - TileEntityMachine tileEntity = (TileEntityMachine)world.getBlockTileEntity(x, y, z); + TileEntityBasicMachine tileEntity = (TileEntityBasicMachine)world.getBlockTileEntity(x, y, z); int metadata = world.getBlockMetadata(x, y, z); if (tileEntity != null) diff --git a/src/common/net/uberkat/obsidian/common/BlockMulti.java b/src/common/net/uberkat/obsidian/common/BlockMulti.java index 5001ec757..0b68260fe 100644 --- a/src/common/net/uberkat/obsidian/common/BlockMulti.java +++ b/src/common/net/uberkat/obsidian/common/BlockMulti.java @@ -23,6 +23,8 @@ public class BlockMulti extends Block public BlockMulti(int i) { super(i, Material.iron); + setHardness(5F); + setResistance(10F); setCreativeTab(CreativeTabs.tabBlock); setRequiresSelfNotify(); } @@ -68,7 +70,7 @@ public class BlockMulti extends Block { if(entityplayer.isSneaking()) { - entityplayer.openGui(ObsidianIngots.instance, 19, world, x, y, z); + entityplayer.openGui(ObsidianIngots.instance, 1, world, x, y, z); return true; } } diff --git a/src/common/net/uberkat/obsidian/common/BlockOre.java b/src/common/net/uberkat/obsidian/common/BlockOre.java index 9fc186f20..ba5fbf44b 100644 --- a/src/common/net/uberkat/obsidian/common/BlockOre.java +++ b/src/common/net/uberkat/obsidian/common/BlockOre.java @@ -17,6 +17,8 @@ public class BlockOre extends Block public BlockOre(int i) { super(i, Material.rock); + setHardness(3F); + setResistance(5F); setCreativeTab(CreativeTabs.tabBlock); setRequiresSelfNotify(); } diff --git a/src/common/net/uberkat/obsidian/common/BlockPowerUnit.java b/src/common/net/uberkat/obsidian/common/BlockPowerUnit.java new file mode 100644 index 000000000..23b7e4a04 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/BlockPowerUnit.java @@ -0,0 +1,214 @@ +package net.uberkat.obsidian.common; + +import ic2.api.EnergyNet; + +import java.util.List; +import java.util.Random; + +import cpw.mods.fml.common.Side; +import cpw.mods.fml.common.asm.SideOnly; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; + +/** + * Block class for handling multiple ore block IDs. + * 0: Power Unit + * 1: Advanced Power Unit + * @author AidanBrady + * + */ +public class BlockPowerUnit extends BlockContainer +{ + private Random powerRand = new Random(); + + public BlockPowerUnit(int id) + { + super(id, Material.iron); + setHardness(2F); + setResistance(4F); + setCreativeTab(CreativeTabs.tabDecorations); + setRequiresSelfNotify(); + } + + public int getBlockTextureFromSideAndMetadata(int side, int meta) + { + if(meta == 0) + { + if(side == 3) + { + return 23; + } + else { + return 24; + } + } + else if(meta == 1) + { + if(side == 3) + { + return 21; + } + else { + return 22; + } + } + return 0; + } + + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entityliving) + { + TileEntityPowerUnit tileEntity = (TileEntityPowerUnit)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); + } + + public int damageDropped(int i) + { + return i; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(int i, CreativeTabs creativetabs, List list) + { + list.add(new ItemStack(i, 1, 0)); + list.add(new ItemStack(i, 1, 1)); + } + + @SideOnly(Side.CLIENT) + public int getBlockTexture(IBlockAccess world, int x, int y, int z, int side) + { + int metadata = world.getBlockMetadata(x, y, z); + TileEntityPowerUnit tileEntity = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); + + if(metadata == 0) + { + if(side == tileEntity.facing) + { + return 23; + } + else { + return 24; + } + } + else if(metadata == 1) + { + if(side == tileEntity.facing) + { + return 21; + } + else { + return 22; + } + } + return 0; + } + + public void breakBlock(World world, int par2, int par3, int par4, int i1, int i2) + { + TileEntityPowerUnit var5 = (TileEntityPowerUnit)world.getBlockTileEntity(par2, par3, par4); + + if (var5 != null) + { + for (int var6 = 0; var6 < var5.getSizeInventory(); ++var6) + { + ItemStack var7 = var5.getStackInSlot(var6); + + if (var7 != null) + { + float var8 = powerRand.nextFloat() * 0.8F + 0.1F; + float var9 = powerRand.nextFloat() * 0.8F + 0.1F; + float var10 = powerRand.nextFloat() * 0.8F + 0.1F; + + while (var7.stackSize > 0) + { + int var11 = powerRand.nextInt(21) + 10; + + if (var11 > var7.stackSize) + { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(world, (double)((float)par2 + var8), (double)((float)par3 + var9), (double)((float)par4 + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage())); + + if (var7.hasTagCompound()) + { + var12.item.setTagCompound((NBTTagCompound)var7.getTagCompound().copy()); + } + + float var13 = 0.05F; + var12.motionX = (double)((float)powerRand.nextGaussian() * var13); + var12.motionY = (double)((float)powerRand.nextGaussian() * var13 + 0.2F); + var12.motionZ = (double)((float)powerRand.nextGaussian() * var13); + world.spawnEntityInWorld(var12); + } + } + } + if(ObsidianIngots.hooks.IC2Loaded) + { + EnergyNet.getForWorld(var5.worldObj).removeTileEntity(var5); + } + var5.invalidate(); + } + + super.breakBlock(world, par2, par3, par4, i1, i2); + } + + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int i1, float f1, float f2, float f3) + { + if (world.isRemote) + { + return true; + } + else + { + TileEntityPowerUnit tileEntity = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); + int metadata = world.getBlockMetadata(x, y, z); + + if (tileEntity != null) + { + if(!entityplayer.isSneaking()) + { + entityplayer.openGui(ObsidianIngots.instance, 8, world, x, y, z); + } + else { + return false; + } + } + return true; + } + } + + public String getTextureFile() + { + return "/obsidian/terrain.png"; + } + + public TileEntity createNewTileEntity(World world, int metadata) + { + if(metadata == 0) + { + return new TileEntityPowerUnit(); + } + else if(metadata == 1) + { + return new TileEntityAdvancedPowerUnit(); + } + return null; + } + + public TileEntity createNewTileEntity(World world) + { + return null; + } +} diff --git a/src/common/net/uberkat/obsidian/common/CommonProxy.java b/src/common/net/uberkat/obsidian/common/CommonProxy.java index a521e4d88..6ed3e8972 100644 --- a/src/common/net/uberkat/obsidian/common/CommonProxy.java +++ b/src/common/net/uberkat/obsidian/common/CommonProxy.java @@ -50,12 +50,13 @@ public class CommonProxy public void loadConfiguration() { ObsidianIngots.configuration.load(); - ObsidianIngots.multiBlockID = ObsidianIngots.configuration.getOrCreateBlockIdProperty("MultiBlock", 3000).getInt(); - ObsidianIngots.machineBlockID = ObsidianIngots.configuration.getOrCreateBlockIdProperty("MachineBlock", 3001).getInt(); - ObsidianIngots.oreBlockID = ObsidianIngots.configuration.getOrCreateBlockIdProperty("OreBlock", 3002).getInt(); - ObsidianIngots.obsidianTNTID = ObsidianIngots.configuration.getOrCreateBlockIdProperty("ObsidianTNT", 3003).getInt(); - ObsidianIngots.extrasEnabled = ObsidianIngots.configuration.getOrCreateBooleanProperty("ExtrasEnabled", Configuration.CATEGORY_GENERAL, true).getBoolean(true); - ObsidianIngots.oreGenerationEnabled = ObsidianIngots.configuration.getOrCreateBooleanProperty("OreGenerationEnabled", Configuration.CATEGORY_GENERAL, true).getBoolean(true); + ObsidianIngots.multiBlockID = ObsidianIngots.configuration.getBlock("MultiBlock", 3000).getInt(); + ObsidianIngots.machineBlockID = ObsidianIngots.configuration.getBlock("MachineBlock", 3001).getInt(); + 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.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(); } @@ -99,20 +100,23 @@ public class CommonProxy switch(ID) { case 3: - TileEntityEnrichmentChamber tileentity = (TileEntityEnrichmentChamber)world.getBlockTileEntity(x, y, z); - return new ContainerEnrichmentChamber(player.inventory, tileentity); + TileEntityElectricMachine tileentity = (TileEntityElectricMachine)world.getBlockTileEntity(x, y, z); + return new ContainerElectricMachine(player.inventory, tileentity); case 4: - TileEntityPlatinumCompressor tileentity1 = (TileEntityPlatinumCompressor)world.getBlockTileEntity(x, y, z); - return new ContainerPlatinumCompressor(player.inventory, tileentity1); + TileEntityAdvancedElectricMachine tileentity1 = (TileEntityAdvancedElectricMachine)world.getBlockTileEntity(x, y, z); + return new ContainerAdvancedElectricMachine(player.inventory, tileentity1); case 5: - TileEntityCombiner tileentity2 = (TileEntityCombiner)world.getBlockTileEntity(x, y, z); - return new ContainerCombiner(player.inventory, tileentity2); + TileEntityAdvancedElectricMachine tileentity2 = (TileEntityAdvancedElectricMachine)world.getBlockTileEntity(x, y, z); + return new ContainerAdvancedElectricMachine(player.inventory, tileentity2); case 6: - TileEntityCrusher tileentity3 = (TileEntityCrusher)world.getBlockTileEntity(x, y, z); - return new ContainerCrusher(player.inventory, tileentity3); + TileEntityElectricMachine tileentity3 = (TileEntityElectricMachine)world.getBlockTileEntity(x, y, z); + return new ContainerElectricMachine(player.inventory, tileentity3); case 7: - TileEntityTheoreticalElementizer tileentity4 = (TileEntityTheoreticalElementizer)world.getBlockTileEntity(x, y, z); - return new ContainerTheoreticalElementizer(player.inventory, tileentity4); + TileEntityAdvancedElectricMachine tileentity4 = (TileEntityAdvancedElectricMachine)world.getBlockTileEntity(x, y, z); + return new ContainerAdvancedElectricMachine(player.inventory, tileentity4); + case 8: + TileEntityPowerUnit tileentity5 = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); + return new ContainerPowerUnit(player.inventory, tileentity5); } return null; } diff --git a/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java b/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java new file mode 100644 index 000000000..7766e3e19 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ContainerAdvancedElectricMachine.java @@ -0,0 +1,121 @@ +package net.uberkat.obsidian.common; + +import ic2.api.IElectricItem; +import universalelectricity.implement.IItemElectric; +import net.minecraft.src.*; +import net.uberkat.obsidian.api.IEnergizedItem; + +public class ContainerAdvancedElectricMachine extends Container +{ + private TileEntityAdvancedElectricMachine tileEntity; + + public ContainerAdvancedElectricMachine(InventoryPlayer par1InventoryPlayer, TileEntityAdvancedElectricMachine tentity) + { + tileEntity = tentity; + addSlotToContainer(new Slot(tentity, 0, 56, 17)); + addSlotToContainer(new Slot(tentity, 1, 56, 53)); + addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tentity, 2, 116, 35)); + addSlotToContainer(new SlotEnergy(tentity, 3, 31, 35)); + int var3; + + for (var3 = 0; var3 < 3; ++var3) + { + for (int var4 = 0; var4 < 9; ++var4) + { + addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); + } + } + + for (var3 = 0; var3 < 9; ++var3) + { + addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 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 transferStackInSlot(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 != 0 && slotID != 1 && slotID != 2 && slotID != 3) + { + if (!mergeItemStack(slotStack, 3, 4, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + } + else if(tileEntity.getFuelTicks(slotStack) > 0) + { + if(slotID != 0 && slotID != 1 && slotID != 2 && slotID != 3) + { + if (!mergeItemStack(slotStack, 1, 2, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 4, inventorySlots.size(), true)) + { + return null; + } + } + } + else if(RecipeHandler.getOutput(slotStack, false, tileEntity.getRecipes()) != null) + { + if(slotID != 0 && slotID != 1 && slotID != 2 && slotID != 3) + { + if (!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 4, 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(slotStack); + } + + return stack; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ContainerCombiner.java b/src/common/net/uberkat/obsidian/common/ContainerCombiner.java deleted file mode 100644 index 895071344..000000000 --- a/src/common/net/uberkat/obsidian/common/ContainerCombiner.java +++ /dev/null @@ -1,163 +0,0 @@ -package net.uberkat.obsidian.common; - -import net.minecraft.src.*; - -public class ContainerCombiner extends Container -{ - private TileEntityCombiner machine; - private int lastCookTime = 0; - private int lastBurnTime = 0; - private int lastItemBurnTime = 0; - - public ContainerCombiner(InventoryPlayer par1InventoryPlayer, TileEntityCombiner par2TileEntityCombiner) - { - this.machine = par2TileEntityCombiner; - this.addSlotToContainer(new Slot(par2TileEntityCombiner, 0, 56, 17)); - this.addSlotToContainer(new Slot(par2TileEntityCombiner, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityCombiner, 2, 116, 35)); - int var3; - - for (var3 = 0; var3 < 3; ++var3) - { - for (int var4 = 0; var4 < 9; ++var4) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); - } - } - - for (var3 = 0; var3 < 9; ++var3) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); - } - } - - /** - * Updates crafting matrix; called from onCraftMatrixChanged. Args: none - */ - public void updateCraftingResults() - { - super.updateCraftingResults(); - - for (int var1 = 0; var1 < this.crafters.size(); ++var1) - { - ICrafting var2 = (ICrafting)this.crafters.get(var1); - - if (this.lastCookTime != this.machine.machineCookTime) - { - var2.updateCraftingInventoryInfo(this, 0, this.machine.machineCookTime); - } - - if (this.lastBurnTime != this.machine.machineBurnTime) - { - var2.updateCraftingInventoryInfo(this, 1, this.machine.machineBurnTime); - } - - if (this.lastItemBurnTime != this.machine.currentItemBurnTime) - { - var2.updateCraftingInventoryInfo(this, 2, this.machine.currentItemBurnTime); - } - } - - this.lastCookTime = this.machine.machineCookTime; - this.lastBurnTime = this.machine.machineBurnTime; - this.lastItemBurnTime = this.machine.currentItemBurnTime; - } - - public void updateProgressBar(int par1, int par2) - { - if (par1 == 0) - { - this.machine.machineCookTime = par2; - } - - if (par1 == 1) - { - this.machine.machineBurnTime = par2; - } - - if (par1 == 2) - { - this.machine.currentItemBurnTime = par2; - } - } - - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - return this.machine.isUseableByPlayer(par1EntityPlayer); - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - public ItemStack transferStackInSlot(int par1) - { - ItemStack var2 = null; - Slot var3 = (Slot)this.inventorySlots.get(par1); - - if (var3 != null && var3.getHasStack()) - { - ItemStack var4 = var3.getStack(); - var2 = var4.copy(); - - if (par1 == 2) - { - if (!this.mergeItemStack(var4, 3, 39, true)) - { - return null; - } - - var3.onSlotChange(var4, var2); - } - else if (par1 != 1 && par1 != 0) - { - if (MachineRecipes.getOutput(var4, false, machine.recipes) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { - return null; - } - } - else if (TileEntityCombiner.isItemFuel(var4)) - { - if (!this.mergeItemStack(var4, 1, 2, false)) - { - return null; - } - } - else if (par1 >= 3 && par1 < 30) - { - if (!this.mergeItemStack(var4, 30, 39, false)) - { - return null; - } - } - else if (par1 >= 30 && par1 < 39 && !this.mergeItemStack(var4, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(var4, 3, 39, false)) - { - return null; - } - - if (var4.stackSize == 0) - { - var3.putStack((ItemStack)null); - } - else - { - var3.onSlotChanged(); - } - - if (var4.stackSize == var2.stackSize) - { - return null; - } - - var3.onPickupFromSlot(var4); - } - - return var2; - } -} diff --git a/src/common/net/uberkat/obsidian/common/ContainerCrusher.java b/src/common/net/uberkat/obsidian/common/ContainerCrusher.java deleted file mode 100644 index 60f1563be..000000000 --- a/src/common/net/uberkat/obsidian/common/ContainerCrusher.java +++ /dev/null @@ -1,163 +0,0 @@ -package net.uberkat.obsidian.common; - -import net.minecraft.src.*; - -public class ContainerCrusher extends Container -{ - private TileEntityCrusher machine; - private int lastCookTime = 0; - private int lastBurnTime = 0; - private int lastItemBurnTime = 0; - - public ContainerCrusher(InventoryPlayer par1InventoryPlayer, TileEntityCrusher par2TileEntityCrusher) - { - this.machine = par2TileEntityCrusher; - this.addSlotToContainer(new Slot(par2TileEntityCrusher, 0, 56, 17)); - this.addSlotToContainer(new Slot(par2TileEntityCrusher, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityCrusher, 2, 116, 35)); - int var3; - - for (var3 = 0; var3 < 3; ++var3) - { - for (int var4 = 0; var4 < 9; ++var4) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); - } - } - - for (var3 = 0; var3 < 9; ++var3) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); - } - } - - /** - * Updates crafting matrix; called from onCraftMatrixChanged. Args: none - */ - public void updateCraftingResults() - { - super.updateCraftingResults(); - - for (int var1 = 0; var1 < this.crafters.size(); ++var1) - { - ICrafting var2 = (ICrafting)this.crafters.get(var1); - - if (this.lastCookTime != this.machine.machineCookTime) - { - var2.updateCraftingInventoryInfo(this, 0, this.machine.machineCookTime); - } - - if (this.lastBurnTime != this.machine.machineBurnTime) - { - var2.updateCraftingInventoryInfo(this, 1, this.machine.machineBurnTime); - } - - if (this.lastItemBurnTime != this.machine.currentItemBurnTime) - { - var2.updateCraftingInventoryInfo(this, 2, this.machine.currentItemBurnTime); - } - } - - this.lastCookTime = this.machine.machineCookTime; - this.lastBurnTime = this.machine.machineBurnTime; - this.lastItemBurnTime = this.machine.currentItemBurnTime; - } - - public void updateProgressBar(int par1, int par2) - { - if (par1 == 0) - { - this.machine.machineCookTime = par2; - } - - if (par1 == 1) - { - this.machine.machineBurnTime = par2; - } - - if (par1 == 2) - { - this.machine.currentItemBurnTime = par2; - } - } - - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - return this.machine.isUseableByPlayer(par1EntityPlayer); - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - public ItemStack transferStackInSlot(int par1) - { - ItemStack var2 = null; - Slot var3 = (Slot)this.inventorySlots.get(par1); - - if (var3 != null && var3.getHasStack()) - { - ItemStack var4 = var3.getStack(); - var2 = var4.copy(); - - if (par1 == 2) - { - if (!this.mergeItemStack(var4, 3, 39, true)) - { - return null; - } - - var3.onSlotChange(var4, var2); - } - else if (par1 != 1 && par1 != 0) - { - if (MachineRecipes.getOutput(var4, false, machine.recipes) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { - return null; - } - } - else if (TileEntityCrusher.isItemFuel(var4)) - { - if (!this.mergeItemStack(var4, 1, 2, false)) - { - return null; - } - } - else if (par1 >= 3 && par1 < 30) - { - if (!this.mergeItemStack(var4, 30, 39, false)) - { - return null; - } - } - else if (par1 >= 30 && par1 < 39 && !this.mergeItemStack(var4, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(var4, 3, 39, false)) - { - return null; - } - - if (var4.stackSize == 0) - { - var3.putStack((ItemStack)null); - } - else - { - var3.onSlotChanged(); - } - - if (var4.stackSize == var2.stackSize) - { - return null; - } - - var3.onPickupFromSlot(var4); - } - - return var2; - } -} diff --git a/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java b/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java new file mode 100644 index 000000000..d968e9900 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ContainerElectricMachine.java @@ -0,0 +1,105 @@ +package net.uberkat.obsidian.common; + +import ic2.api.IElectricItem; +import universalelectricity.implement.IItemElectric; +import net.minecraft.src.*; +import net.uberkat.obsidian.api.IEnergizedItem; + +public class ContainerElectricMachine extends Container +{ + private TileEntityElectricMachine tileEntity; + + public ContainerElectricMachine(InventoryPlayer par1InventoryPlayer, TileEntityElectricMachine tentity) + { + this.tileEntity = tentity; + this.addSlotToContainer(new Slot(tentity, 0, 56, 17)); + this.addSlotToContainer(new SlotEnergy(tentity, 1, 56, 53)); + this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tentity, 2, 116, 35)); + int var3; + + for (var3 = 0; var3 < 3; ++var3) + { + for (int var4 = 0; var4 < 9; ++var4) + { + this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); + } + } + + for (var3 = 0; var3 < 9; ++var3) + { + this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); + } + } + + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + return this.tileEntity.isUseableByPlayer(par1EntityPlayer); + } + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + public ItemStack transferStackInSlot(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, 3, inventorySlots.size(), false)) + { + return null; + } + } + } + else if(RecipeHandler.getOutput(slotStack, false, tileEntity.getRecipes()) != null) + { + if(slotID != 0 && slotID != 1 && slotID != 2) + { + if (!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 3, 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(slotStack); + } + + return stack; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ContainerEnrichmentChamber.java b/src/common/net/uberkat/obsidian/common/ContainerEnrichmentChamber.java deleted file mode 100644 index 9fdaa0df1..000000000 --- a/src/common/net/uberkat/obsidian/common/ContainerEnrichmentChamber.java +++ /dev/null @@ -1,163 +0,0 @@ -package net.uberkat.obsidian.common; - -import net.minecraft.src.*; - -public class ContainerEnrichmentChamber extends Container -{ - private TileEntityEnrichmentChamber machine; - private int lastCookTime = 0; - private int lastBurnTime = 0; - private int lastItemBurnTime = 0; - - public ContainerEnrichmentChamber(InventoryPlayer par1InventoryPlayer, TileEntityEnrichmentChamber par2TileEntityEnrichmentChamber) - { - this.machine = par2TileEntityEnrichmentChamber; - this.addSlotToContainer(new Slot(par2TileEntityEnrichmentChamber, 0, 56, 17)); - this.addSlotToContainer(new Slot(par2TileEntityEnrichmentChamber, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityEnrichmentChamber, 2, 116, 35)); - int var3; - - for (var3 = 0; var3 < 3; ++var3) - { - for (int var4 = 0; var4 < 9; ++var4) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); - } - } - - for (var3 = 0; var3 < 9; ++var3) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); - } - } - - /** - * Updates crafting matrix; called from onCraftMatrixChanged. Args: none - */ - public void updateCraftingResults() - { - super.updateCraftingResults(); - - for (int var1 = 0; var1 < this.crafters.size(); ++var1) - { - ICrafting var2 = (ICrafting)this.crafters.get(var1); - - if (this.lastCookTime != this.machine.machineCookTime) - { - var2.updateCraftingInventoryInfo(this, 0, this.machine.machineCookTime); - } - - if (this.lastBurnTime != this.machine.machineBurnTime) - { - var2.updateCraftingInventoryInfo(this, 1, this.machine.machineBurnTime); - } - - if (this.lastItemBurnTime != this.machine.currentItemBurnTime) - { - var2.updateCraftingInventoryInfo(this, 2, this.machine.currentItemBurnTime); - } - } - - this.lastCookTime = this.machine.machineCookTime; - this.lastBurnTime = this.machine.machineBurnTime; - this.lastItemBurnTime = this.machine.currentItemBurnTime; - } - - public void updateProgressBar(int par1, int par2) - { - if (par1 == 0) - { - this.machine.machineCookTime = par2; - } - - if (par1 == 1) - { - this.machine.machineBurnTime = par2; - } - - if (par1 == 2) - { - this.machine.currentItemBurnTime = par2; - } - } - - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - return this.machine.isUseableByPlayer(par1EntityPlayer); - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - public ItemStack transferStackInSlot(int par1) - { - ItemStack var2 = null; - Slot var3 = (Slot)this.inventorySlots.get(par1); - - if (var3 != null && var3.getHasStack()) - { - ItemStack var4 = var3.getStack(); - var2 = var4.copy(); - - if (par1 == 2) - { - if (!this.mergeItemStack(var4, 3, 39, true)) - { - return null; - } - - var3.onSlotChange(var4, var2); - } - else if (par1 != 1 && par1 != 0) - { - if (MachineRecipes.getOutput(var4, false, machine.recipes) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { - return null; - } - } - else if (TileEntityEnrichmentChamber.isItemFuel(var4)) - { - if (!this.mergeItemStack(var4, 1, 2, false)) - { - return null; - } - } - else if (par1 >= 3 && par1 < 30) - { - if (!this.mergeItemStack(var4, 30, 39, false)) - { - return null; - } - } - else if (par1 >= 30 && par1 < 39 && !this.mergeItemStack(var4, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(var4, 3, 39, false)) - { - return null; - } - - if (var4.stackSize == 0) - { - var3.putStack((ItemStack)null); - } - else - { - var3.onSlotChanged(); - } - - if (var4.stackSize == var2.stackSize) - { - return null; - } - - var3.onPickupFromSlot(var4); - } - - return var2; - } -} diff --git a/src/common/net/uberkat/obsidian/common/ContainerPlatinumCompressor.java b/src/common/net/uberkat/obsidian/common/ContainerPlatinumCompressor.java deleted file mode 100644 index 455576b34..000000000 --- a/src/common/net/uberkat/obsidian/common/ContainerPlatinumCompressor.java +++ /dev/null @@ -1,163 +0,0 @@ -package net.uberkat.obsidian.common; - -import net.minecraft.src.*; - -public class ContainerPlatinumCompressor extends Container -{ - private TileEntityPlatinumCompressor machine; - private int lastCookTime = 0; - private int lastBurnTime = 0; - private int lastItemBurnTime = 0; - - public ContainerPlatinumCompressor(InventoryPlayer par1InventoryPlayer, TileEntityPlatinumCompressor par2TileEntityPlatinumCompressor) - { - this.machine = par2TileEntityPlatinumCompressor; - this.addSlotToContainer(new Slot(par2TileEntityPlatinumCompressor, 0, 56, 17)); - this.addSlotToContainer(new Slot(par2TileEntityPlatinumCompressor, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityPlatinumCompressor, 2, 116, 35)); - int var3; - - for (var3 = 0; var3 < 3; ++var3) - { - for (int var4 = 0; var4 < 9; ++var4) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); - } - } - - for (var3 = 0; var3 < 9; ++var3) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); - } - } - - /** - * Updates crafting matrix; called from onCraftMatrixChanged. Args: none - */ - public void updateCraftingResults() - { - super.updateCraftingResults(); - - for (int var1 = 0; var1 < this.crafters.size(); ++var1) - { - ICrafting var2 = (ICrafting)this.crafters.get(var1); - - if (this.lastCookTime != this.machine.machineCookTime) - { - var2.updateCraftingInventoryInfo(this, 0, this.machine.machineCookTime); - } - - if (this.lastBurnTime != this.machine.machineBurnTime) - { - var2.updateCraftingInventoryInfo(this, 1, this.machine.machineBurnTime); - } - - if (this.lastItemBurnTime != this.machine.currentItemBurnTime) - { - var2.updateCraftingInventoryInfo(this, 2, this.machine.currentItemBurnTime); - } - } - - this.lastCookTime = this.machine.machineCookTime; - this.lastBurnTime = this.machine.machineBurnTime; - this.lastItemBurnTime = this.machine.currentItemBurnTime; - } - - public void updateProgressBar(int par1, int par2) - { - if (par1 == 0) - { - this.machine.machineCookTime = par2; - } - - if (par1 == 1) - { - this.machine.machineBurnTime = par2; - } - - if (par1 == 2) - { - this.machine.currentItemBurnTime = par2; - } - } - - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - return this.machine.isUseableByPlayer(par1EntityPlayer); - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - public ItemStack transferStackInSlot(int par1) - { - ItemStack var2 = null; - Slot var3 = (Slot)this.inventorySlots.get(par1); - - if (var3 != null && var3.getHasStack()) - { - ItemStack var4 = var3.getStack(); - var2 = var4.copy(); - - if (par1 == 2) - { - if (!this.mergeItemStack(var4, 3, 39, true)) - { - return null; - } - - var3.onSlotChange(var4, var2); - } - else if (par1 != 1 && par1 != 0) - { - if (MachineRecipes.getOutput(var4, false, machine.recipes) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { - return null; - } - } - else if (TileEntityPlatinumCompressor.isItemFuel(var4)) - { - if (!this.mergeItemStack(var4, 1, 2, false)) - { - return null; - } - } - else if (par1 >= 3 && par1 < 30) - { - if (!this.mergeItemStack(var4, 30, 39, false)) - { - return null; - } - } - else if (par1 >= 30 && par1 < 39 && !this.mergeItemStack(var4, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(var4, 3, 39, false)) - { - return null; - } - - if (var4.stackSize == 0) - { - var3.putStack((ItemStack)null); - } - else - { - var3.onSlotChanged(); - } - - if (var4.stackSize == var2.stackSize) - { - return null; - } - - var3.onPickupFromSlot(var4); - } - - return var2; - } -} diff --git a/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java b/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java new file mode 100644 index 000000000..25fb25a96 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ContainerPowerUnit.java @@ -0,0 +1,99 @@ +package net.uberkat.obsidian.common; + +import ic2.api.IElectricItem; +import universalelectricity.implement.IItemElectric; +import net.uberkat.obsidian.api.*; +import net.minecraft.src.*; + +public class ContainerPowerUnit extends Container +{ + private TileEntityPowerUnit tileEntity; + + public ContainerPowerUnit(InventoryPlayer inventory, TileEntityPowerUnit unit) + { + tileEntity = unit; + addSlotToContainer(new SlotEnergy(unit, 0, 8, 8)); + addSlotToContainer(new SlotEnergy(unit, 1, 8, 40)); + + int var3; + + for (var3 = 0; var3 < 3; ++var3) + { + for (int var4 = 0; var4 < 9; ++var4) + { + addSlotToContainer(new Slot(inventory, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); + } + } + + for (var3 = 0; var3 < 9; ++var3) + { + addSlotToContainer(new Slot(inventory, var3, 8 + var3 * 18, 142)); + } + } + + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + return tileEntity.isUseableByPlayer(par1EntityPlayer); + } + + public ItemStack transferStackInSlot(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 != 0 && slotID != 1) + { + if (!mergeItemStack(slotStack, 1, 2, false)) + { + if (!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + } + else if(slotID == 1) + { + if(!mergeItemStack(slotStack, 0, 1, false)) + { + if(!mergeItemStack(slotStack, 2, inventorySlots.size(), false)) + { + return null; + } + } + } + else if(slotID == 0) + { + 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.onPickupFromSlot(slotStack); + } + + return stack; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ContainerTheoreticalElementizer.java b/src/common/net/uberkat/obsidian/common/ContainerTheoreticalElementizer.java deleted file mode 100644 index 280bd8a15..000000000 --- a/src/common/net/uberkat/obsidian/common/ContainerTheoreticalElementizer.java +++ /dev/null @@ -1,163 +0,0 @@ -package net.uberkat.obsidian.common; - -import net.minecraft.src.*; - -public class ContainerTheoreticalElementizer extends Container -{ - private TileEntityTheoreticalElementizer machine; - private int lastCookTime = 0; - private int lastBurnTime = 0; - private int lastItemBurnTime = 0; - - public ContainerTheoreticalElementizer(InventoryPlayer par1InventoryPlayer, TileEntityTheoreticalElementizer par2TileEntityTheoreticalElementizer) - { - this.machine = par2TileEntityTheoreticalElementizer; - this.addSlotToContainer(new Slot(par2TileEntityTheoreticalElementizer, 0, 56, 17)); - this.addSlotToContainer(new Slot(par2TileEntityTheoreticalElementizer, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, par2TileEntityTheoreticalElementizer, 2, 116, 35)); - int var3; - - for (var3 = 0; var3 < 3; ++var3) - { - for (int var4 = 0; var4 < 9; ++var4) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); - } - } - - for (var3 = 0; var3 < 9; ++var3) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); - } - } - - /** - * Updates crafting matrix; called from onCraftMatrixChanged. Args: none - */ - public void updateCraftingResults() - { - super.updateCraftingResults(); - - for (int var1 = 0; var1 < this.crafters.size(); ++var1) - { - ICrafting var2 = (ICrafting)this.crafters.get(var1); - - if (this.lastCookTime != this.machine.machineCookTime) - { - var2.updateCraftingInventoryInfo(this, 0, this.machine.machineCookTime); - } - - if (this.lastBurnTime != this.machine.machineBurnTime) - { - var2.updateCraftingInventoryInfo(this, 1, this.machine.machineBurnTime); - } - - if (this.lastItemBurnTime != this.machine.currentItemBurnTime) - { - var2.updateCraftingInventoryInfo(this, 2, this.machine.currentItemBurnTime); - } - } - - this.lastCookTime = this.machine.machineCookTime; - this.lastBurnTime = this.machine.machineBurnTime; - this.lastItemBurnTime = this.machine.currentItemBurnTime; - } - - public void updateProgressBar(int par1, int par2) - { - if (par1 == 0) - { - this.machine.machineCookTime = par2; - } - - if (par1 == 1) - { - this.machine.machineBurnTime = par2; - } - - if (par1 == 2) - { - this.machine.currentItemBurnTime = par2; - } - } - - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - return this.machine.isUseableByPlayer(par1EntityPlayer); - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - public ItemStack transferStackInSlot(int par1) - { - ItemStack var2 = null; - Slot var3 = (Slot)this.inventorySlots.get(par1); - - if (var3 != null && var3.getHasStack()) - { - ItemStack var4 = var3.getStack(); - var2 = var4.copy(); - - if (par1 == 2) - { - if (!this.mergeItemStack(var4, 3, 39, true)) - { - return null; - } - - var3.onSlotChange(var4, var2); - } - else if (par1 != 1 && par1 != 0) - { - if (var4.getItem().shiftedIndex == ObsidianIngots.EnrichedAlloy.shiftedIndex) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { - return null; - } - } - else if (TileEntityTheoreticalElementizer.isItemFuel(var4)) - { - if (!this.mergeItemStack(var4, 1, 2, false)) - { - return null; - } - } - else if (par1 >= 3 && par1 < 30) - { - if (!this.mergeItemStack(var4, 30, 39, false)) - { - return null; - } - } - else if (par1 >= 30 && par1 < 39 && !this.mergeItemStack(var4, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(var4, 3, 39, false)) - { - return null; - } - - if (var4.stackSize == 0) - { - var3.putStack((ItemStack)null); - } - else - { - var3.onSlotChanged(); - } - - if (var4.stackSize == var2.stackSize) - { - return null; - } - - var3.onPickupFromSlot(var4); - } - - return var2; - } -} diff --git a/src/common/net/uberkat/obsidian/common/ItemMachine.java b/src/common/net/uberkat/obsidian/common/ItemBlockMachine.java similarity index 91% rename from src/common/net/uberkat/obsidian/common/ItemMachine.java rename to src/common/net/uberkat/obsidian/common/ItemBlockMachine.java index 3e3c93a75..3bbf0d51b 100644 --- a/src/common/net/uberkat/obsidian/common/ItemMachine.java +++ b/src/common/net/uberkat/obsidian/common/ItemBlockMachine.java @@ -14,11 +14,11 @@ import net.minecraft.src.ItemStack; * @author AidanBrady * */ -public class ItemMachine extends ItemBlock +public class ItemBlockMachine extends ItemBlock { public Block metaBlock; - public ItemMachine(int id, Block block) + public ItemBlockMachine(int id, Block block) { super(id); metaBlock = block; diff --git a/src/common/net/uberkat/obsidian/common/ItemMulti.java b/src/common/net/uberkat/obsidian/common/ItemBlockMulti.java similarity index 91% rename from src/common/net/uberkat/obsidian/common/ItemMulti.java rename to src/common/net/uberkat/obsidian/common/ItemBlockMulti.java index a0f0c3c70..5114331f6 100644 --- a/src/common/net/uberkat/obsidian/common/ItemMulti.java +++ b/src/common/net/uberkat/obsidian/common/ItemBlockMulti.java @@ -12,11 +12,11 @@ import net.minecraft.src.*; * @author AidanBrady * */ -public class ItemMulti extends ItemBlock +public class ItemBlockMulti extends ItemBlock { public Block metaBlock; - public ItemMulti(int id, Block block) + public ItemBlockMulti(int id, Block block) { super(id); metaBlock = block; diff --git a/src/common/net/uberkat/obsidian/common/ItemOre.java b/src/common/net/uberkat/obsidian/common/ItemBlockOre.java similarity index 88% rename from src/common/net/uberkat/obsidian/common/ItemOre.java rename to src/common/net/uberkat/obsidian/common/ItemBlockOre.java index 8d87cb7be..91ee9313d 100644 --- a/src/common/net/uberkat/obsidian/common/ItemOre.java +++ b/src/common/net/uberkat/obsidian/common/ItemBlockOre.java @@ -8,11 +8,11 @@ import net.minecraft.src.*; * @author AidanBrady * */ -public class ItemOre extends ItemBlock +public class ItemBlockOre extends ItemBlock { public Block metaBlock; - public ItemOre(int id, Block block) + public ItemBlockOre(int id, Block block) { super(id); metaBlock = block; diff --git a/src/common/net/uberkat/obsidian/common/ItemBlockPowerUnit.java b/src/common/net/uberkat/obsidian/common/ItemBlockPowerUnit.java new file mode 100644 index 000000000..17ffabce4 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ItemBlockPowerUnit.java @@ -0,0 +1,50 @@ +package net.uberkat.obsidian.common; + +import net.minecraft.src.*; + +/** + * Item class for handling multiple power unit block IDs. + * 0: Power Unit + * 1: Advanced Power Unit + * @author AidanBrady + * + */ +public class ItemBlockPowerUnit extends ItemBlock +{ + public Block metaBlock; + + public ItemBlockPowerUnit(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 = "PowerUnit"; + break; + case 1: + name = "AdvancedPowerUnit"; + 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 new file mode 100644 index 000000000..507d47e6a --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/ItemEnergized.java @@ -0,0 +1,186 @@ +package net.uberkat.obsidian.common; + +import java.util.List; + +import universalelectricity.UniversalElectricity; +import universalelectricity.implement.IItemElectric; + +import ic2.api.IElectricItem; +import net.minecraft.src.*; +import net.uberkat.obsidian.api.IEnergizedItem; + +public class ItemEnergized extends Item implements IEnergizedItem, IItemElectric +{ + public int maxEnergy; + + public int transferRate; + + public ItemEnergized(int id, int energy, int rate) + { + super(id); + maxEnergy = energy; + transferRate = rate; + setMaxStackSize(1); + setMaxDamage(maxEnergy); + setNoRepair(); + setCreativeTab(CreativeTabs.tabRedstone); + } + + public void addInformation(ItemStack itemstack, List list) + { + int energy = getEnergy(itemstack); + + list.add("Stored Energy: " + ObsidianUtils.getDisplayedEnergy(energy)); + } + + public void onCreated(ItemStack itemstack, World world, EntityPlayer entityplayer) + { + itemstack = getUnchargedItem(); + } + + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + ItemEnergized item = ((ItemEnergized)par1ItemStack.getItem()); + item.setEnergy(par1ItemStack, item.getEnergy(par1ItemStack)); + } + + public int getEnergy(ItemStack itemstack) + { + if(itemstack.stackTagCompound == null) + { + return 0; + } + + int stored = 0; + + if(itemstack.stackTagCompound.getTag("energy") != null) + { + stored = itemstack.stackTagCompound.getInteger("energy"); + } + + itemstack.setItemDamage(maxEnergy - stored); + return stored; + } + + public void setEnergy(ItemStack itemstack, int energy) + { + if(itemstack.stackTagCompound == null) + { + itemstack.setTagCompound(new NBTTagCompound()); + } + + int stored = Math.max(Math.min(energy, maxEnergy), 0); + itemstack.stackTagCompound.setInteger("energy", stored); + itemstack.setItemDamage(maxEnergy - stored); + } + + public ItemStack getUnchargedItem() + { + ItemStack charged = new ItemStack(this); + charged.setItemDamage(maxEnergy); + return charged; + } + + public void getSubItems(int i, CreativeTabs tabs, List list) + { + ItemStack discharged = new ItemStack(this); + discharged.setItemDamage(maxEnergy); + list.add(discharged); + ItemStack charged = new ItemStack(this); + setEnergy(charged, ((IEnergizedItem)charged.getItem()).getMaxEnergy()); + list.add(charged); + } + + public int getMaxEnergy() + { + return maxEnergy; + } + + public int getRate() + { + return transferRate; + } + + public int charge(ItemStack itemstack, int amount) + { + int rejects = Math.max((getEnergy(itemstack) + amount) - maxEnergy, 0); + setEnergy(itemstack, getEnergy(itemstack) + amount - rejects); + return rejects; + } + + public int discharge(ItemStack itemstack, int amount) + { + int energyToUse = Math.min(getEnergy(itemstack), amount); + setEnergy(itemstack, getEnergy(itemstack) - energyToUse); + return energyToUse; + } + + public double getWattHours(Object... data) + { + if(data[0] instanceof ItemStack) + { + ItemStack itemstack = (ItemStack)data[0]; + return getEnergy(itemstack)*UniversalElectricity.IC2_RATIO; + } + return 0; + } + + public void setWattHours(double wattHours, Object... data) + { + if(data[0] instanceof ItemStack) + { + ItemStack itemstack = (ItemStack)data[0]; + + setEnergy(itemstack, (int)(wattHours*UniversalElectricity.Wh_IC2_RATIO)); + } + } + + public double getMaxWattHours() + { + return maxEnergy*UniversalElectricity.IC2_RATIO; + } + + public double getVoltage() + { + return 20; + } + + public double onReceiveElectricity(double wattHourReceive, ItemStack itemStack) + { + int rejects = (int)Math.max((getEnergy(itemStack) + wattHourReceive*UniversalElectricity.Wh_IC2_RATIO) - getMaxEnergy(), 0); + setEnergy(itemStack, (int)(getEnergy(itemStack) + wattHourReceive*UniversalElectricity.Wh_IC2_RATIO - rejects)); + return rejects*UniversalElectricity.IC2_RATIO; + } + + public double onUseElectricity(double wattHourRequest, ItemStack itemStack) + { + int energyRequest = (int)Math.min(getEnergy(itemStack), wattHourRequest*UniversalElectricity.Wh_IC2_RATIO); + setEnergy(itemStack, getEnergy(itemStack) - energyRequest); + return energyRequest*UniversalElectricity.IC2_RATIO; + } + + public boolean canReceiveElectricity() + { + return true; + } + + public boolean canProduceElectricity() + { + return true; + } + + public double getTransferRate() + { + return transferRate*UniversalElectricity.IC2_RATIO; + } + + public String getTextureFile() + { + return "/obsidian/items.png"; + } + + public boolean canCharge() + { + return true; + } +} diff --git a/src/common/net/uberkat/obsidian/common/ItemLightningRod.java b/src/common/net/uberkat/obsidian/common/ItemLightningRod.java index 118fa9f65..9323e2ba6 100644 --- a/src/common/net/uberkat/obsidian/common/ItemLightningRod.java +++ b/src/common/net/uberkat/obsidian/common/ItemLightningRod.java @@ -9,7 +9,7 @@ public class ItemLightningRod extends ItemObsidian super(i); setMaxStackSize(1); setMaxDamage(100); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } public boolean hasEffect(ItemStack par1ItemStack) diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidian.java b/src/common/net/uberkat/obsidian/common/ItemObsidian.java index f1f759f09..addc77879 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidian.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidian.java @@ -8,7 +8,7 @@ public class ItemObsidian extends Item { super(i); itemsList[256 + i] = this; - setTabToDisplayOn(CreativeTabs.tabAllSearch); + setCreativeTab(CreativeTabs.tabAllSearch); } public String getTextureFile() { diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianArmor.java b/src/common/net/uberkat/obsidian/common/ItemObsidianArmor.java index 2032d279c..ba014474d 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianArmor.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianArmor.java @@ -7,7 +7,7 @@ public class ItemObsidianArmor extends ItemArmor public ItemObsidianArmor(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4) { super(par1, par2EnumArmorMaterial, par3, par4); - setTabToDisplayOn(CreativeTabs.tabCombat); + setCreativeTab(CreativeTabs.tabCombat); } public String getTextureFile() { diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianBow.java b/src/common/net/uberkat/obsidian/common/ItemObsidianBow.java index 2b7342150..00887e3ed 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianBow.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianBow.java @@ -10,7 +10,7 @@ public class ItemObsidianBow extends ItemObsidian super(par1); maxStackSize = 1; setMaxDamage(750); - setTabToDisplayOn(CreativeTabs.tabCombat); + setCreativeTab(CreativeTabs.tabCombat); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianHoe.java b/src/common/net/uberkat/obsidian/common/ItemObsidianHoe.java index f8092e43a..d90509a79 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianHoe.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianHoe.java @@ -9,7 +9,7 @@ public class ItemObsidianHoe extends ItemObsidian super(par1); maxStackSize = 1; setMaxDamage(par2EnumToolMaterial.getMaxUses()); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianKnife.java b/src/common/net/uberkat/obsidian/common/ItemObsidianKnife.java index d95d0099f..85fdd48f0 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianKnife.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianKnife.java @@ -25,7 +25,7 @@ public class ItemObsidianKnife extends ItemObsidian entityDamage = 2; blockDamage = 2; enchantability = enumtoolmaterial.getEnchantability(); - setTabToDisplayOn(CreativeTabs.tabCombat); + setCreativeTab(CreativeTabs.tabCombat); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianPaxel.java b/src/common/net/uberkat/obsidian/common/ItemObsidianPaxel.java index 11c8d448b..e70296a3a 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianPaxel.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianPaxel.java @@ -13,7 +13,7 @@ public class ItemObsidianPaxel extends ItemObsidianTool public ItemObsidianPaxel(int i, EnumToolMaterial enumtoolmaterial) { super(i, 3, enumtoolmaterial, blocksEffectiveAgainst); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } public boolean canHarvestBlock(Block block) diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianPickaxe.java b/src/common/net/uberkat/obsidian/common/ItemObsidianPickaxe.java index c66fb8ee4..7e8f610a4 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianPickaxe.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianPickaxe.java @@ -13,7 +13,7 @@ public class ItemObsidianPickaxe extends ItemObsidianTool public ItemObsidianPickaxe(int par1, EnumToolMaterial par2EnumToolMaterial) { super(par1, 2, par2EnumToolMaterial, blocksEffectiveAgainst); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianSpade.java b/src/common/net/uberkat/obsidian/common/ItemObsidianSpade.java index 497641e5d..243f0539f 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianSpade.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianSpade.java @@ -11,7 +11,7 @@ public class ItemObsidianSpade extends ItemObsidianTool public ItemObsidianSpade(int par1, EnumToolMaterial par2EnumToolMaterial) { super(par1, 1, par2EnumToolMaterial, blocksEffectiveAgainst); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemObsidianSword.java b/src/common/net/uberkat/obsidian/common/ItemObsidianSword.java index fc4044d5a..de01c2719 100644 --- a/src/common/net/uberkat/obsidian/common/ItemObsidianSword.java +++ b/src/common/net/uberkat/obsidian/common/ItemObsidianSword.java @@ -23,7 +23,7 @@ public class ItemObsidianSword extends ItemObsidian maxStackSize = 1; setMaxDamage(par2EnumToolMaterial.getMaxUses()); weaponDamage = 4 + par2EnumToolMaterial.getDamageVsEntity(); - setTabToDisplayOn(CreativeTabs.tabCombat); + setCreativeTab(CreativeTabs.tabCombat); } /** diff --git a/src/common/net/uberkat/obsidian/common/ItemStopwatch.java b/src/common/net/uberkat/obsidian/common/ItemStopwatch.java index 0a260701a..debeaf45b 100644 --- a/src/common/net/uberkat/obsidian/common/ItemStopwatch.java +++ b/src/common/net/uberkat/obsidian/common/ItemStopwatch.java @@ -9,7 +9,7 @@ public class ItemStopwatch extends ItemObsidian { super(i); setMaxStackSize(1); setMaxDamage(5000); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } public boolean hasEffect(ItemStack itemstack) @@ -21,7 +21,7 @@ public class ItemStopwatch extends ItemObsidian { { if(itemstack.getItemDamage() == 0) { - entityplayer.openGui(ObsidianIngots.instance, 18, world, (int)entityplayer.posX, (int)entityplayer.posY, (int)entityplayer.posZ); + entityplayer.openGui(ObsidianIngots.instance, 0, world, (int)entityplayer.posX, (int)entityplayer.posY, (int)entityplayer.posZ); } return itemstack; } diff --git a/src/common/net/uberkat/obsidian/common/ItemWeatherOrb.java b/src/common/net/uberkat/obsidian/common/ItemWeatherOrb.java index 4ce72e7cd..98240dca8 100644 --- a/src/common/net/uberkat/obsidian/common/ItemWeatherOrb.java +++ b/src/common/net/uberkat/obsidian/common/ItemWeatherOrb.java @@ -9,7 +9,7 @@ public class ItemWeatherOrb extends ItemObsidian super(i); setMaxStackSize(1); setMaxDamage(5000); - setTabToDisplayOn(CreativeTabs.tabTools); + setCreativeTab(CreativeTabs.tabTools); } public boolean hasEffect(ItemStack itemstack) @@ -21,7 +21,7 @@ public class ItemWeatherOrb extends ItemObsidian { if(itemstack.getItemDamage() == 0) { - entityplayer.openGui(ObsidianIngots.instance, 20, world, (int)entityplayer.posX, (int)entityplayer.posY, (int)entityplayer.posZ); + entityplayer.openGui(ObsidianIngots.instance, 2, world, (int)entityplayer.posX, (int)entityplayer.posY, (int)entityplayer.posZ); } return itemstack; } diff --git a/src/common/net/uberkat/obsidian/common/ObsidianHooks.java b/src/common/net/uberkat/obsidian/common/ObsidianHooks.java index d5c81fe90..57dc4dc4f 100644 --- a/src/common/net/uberkat/obsidian/common/ObsidianHooks.java +++ b/src/common/net/uberkat/obsidian/common/ObsidianHooks.java @@ -34,12 +34,8 @@ public class ObsidianHooks IC2IronDust = getIC2Item("ironDust"); IC2GoldDust = getIC2Item("goldDust"); - Ic2Recipes.addMaceratorRecipe(new ItemStack(ObsidianIngots.MultiBlock, 1, 0), new ItemStack(ObsidianIngots.PlatinumDust, 2)); - if(!RailcraftLoaded) - { - Ic2Recipes.addMaceratorRecipe(new ItemStack(Block.obsidian), new ItemStack(ObsidianIngots.ObsidianDust)); - } - Ic2Recipes.addMatterAmplifier(ObsidianIngots.EnrichedAlloy, 100000); + Ic2Recipes.addMaceratorRecipe(new ItemStack(ObsidianIngots.OreBlock, 1, 0), new ItemStack(ObsidianIngots.PlatinumDust, 2)); + Ic2Recipes.addMatterAmplifier(ObsidianIngots.EnrichedAlloy, 80000); System.out.println("[ObsidianIngots] Hooked into IC2 successfully."); } diff --git a/src/common/net/uberkat/obsidian/common/ObsidianIngots.java b/src/common/net/uberkat/obsidian/common/ObsidianIngots.java index 4640cdcdf..e2bb4009d 100644 --- a/src/common/net/uberkat/obsidian/common/ObsidianIngots.java +++ b/src/common/net/uberkat/obsidian/common/ObsidianIngots.java @@ -1,5 +1,7 @@ package net.uberkat.obsidian.common; +import ic2.api.Ic2Recipes; + import java.io.*; import java.net.HttpURLConnection; import java.net.InetAddress; @@ -35,7 +37,7 @@ import cpw.mods.fml.common.registry.TickRegistry; * @author AidanBrady * */ -@Mod(modid = "ObsidianIngots", name = "Obsidian Ingots", version = "4.1.0") +@Mod(modid = "ObsidianIngots", name = "Obsidian Ingots", version = "4.2.0") @NetworkMod(channels = { "ObsidianIngots" }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class) public class ObsidianIngots { @@ -57,7 +59,7 @@ public class ObsidianIngots public static Configuration configuration; /** Obsidian Ingots version number */ - public static Version versionNumber = new Version(4, 1, 0); + public static Version versionNumber = new Version(4, 2, 0); /** The latest version number which is received from the Obsidian Ingots server */ public static String latestVersionNumber; @@ -95,6 +97,7 @@ public class ObsidianIngots public static int machineBlockID = 3001; public static int oreBlockID = 3002; public static int obsidianTNTID = 3003; + public static int powerUnitID = 3004; //Base Items public static Item WoodPaxel; @@ -188,12 +191,16 @@ public class ObsidianIngots public static Item Stopwatch; public static Item WeatherOrb; public static Item EnrichedAlloy; + public static ItemEnergized EnergyTablet; + public static ItemEnergized EnergyOrb; + public static ItemEnergized EnergyCube; //Extra Blocks public static Block MultiBlock; public static Block MachineBlock; public static Block OreBlock; public static Block ObsidianTNT; + public static Block PowerUnit; //Boolean Values public static boolean extrasEnabled = true; @@ -459,14 +466,29 @@ public class ObsidianIngots GameRegistry.addRecipe(new ItemStack(ObsidianBow, 1), new Object[] { " AB", "A B", " AB", Character.valueOf('A'), ObsidianIngot, Character.valueOf('B'), Item.silk }); + GameRegistry.addRecipe(EnergyCube.getUnchargedItem(), new Object[] { + "RAR", "APA", "RAR", Character.valueOf('R'), Item.redstone, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('P'), PlatinumDust + }); + GameRegistry.addRecipe(EnergyTablet.getUnchargedItem(), new Object[] { + "RCR", "ECE", "RCR", Character.valueOf('C'), EnergyCube.getUnchargedItem(), Character.valueOf('R'), Item.redstone, Character.valueOf('E'), EnrichedAlloy + }); + GameRegistry.addRecipe(EnergyOrb.getUnchargedItem(), new Object[] { + "ECE", "CCC", "ECE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('C'), EnergyCube.getUnchargedItem() + }); + GameRegistry.addRecipe(new ItemStack(PowerUnit, 1, 0), new Object[] { + "CEC", "EPE", "CEC", Character.valueOf('C'), EnergyCube.getUnchargedItem(), Character.valueOf('E'), EnrichedAlloy, Character.valueOf('P'), new ItemStack(MultiBlock, 1, 0) + }); + GameRegistry.addRecipe(new ItemStack(PowerUnit, 1, 1), new Object[] { + "ECE", "CPC", "ECE", Character.valueOf('E'), EnrichedAlloy, Character.valueOf('C'), EnergyCube.getUnchargedItem(), Character.valueOf('P'), new ItemStack(PowerUnit, 1, 0) + }); GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 0), new Object[] { "***", "*R*", "***", Character.valueOf('*'), PlatinumIngot, Character.valueOf('R'), Item.redstone }); GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 1), new Object[] { - "***", "*P*", "***", Character.valueOf('*'), Item.redstone, Character.valueOf('P'), new ItemStack(MultiBlock, 1, 1) + "***", "*P*", "***", Character.valueOf('*'), Item.redstone, Character.valueOf('P'), new ItemStack(MultiBlock, 1, 0) }); GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 2), new Object[] { - "***", "*P*", "***", Character.valueOf('*'), Block.cobblestone, Character.valueOf('P'), new ItemStack(MultiBlock, 1, 1) + "***", "*P*", "***", Character.valueOf('*'), Block.cobblestone, Character.valueOf('P'), new ItemStack(MultiBlock, 1, 0) }); GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 3), new Object[] { "***", "*L*", "***", Character.valueOf('*'), PlatinumIngot, Character.valueOf('L'), Item.bucketLava @@ -475,7 +497,7 @@ public class ObsidianIngots if(extrasEnabled) { GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 4), new Object[] { - "SGS", "GDG", "SGS", Character.valueOf('S'), Block.stone, Character.valueOf('G'), Block.glass, Character.valueOf('D'), Block.blockDiamond + "SGS", "GDG", "SGS", Character.valueOf('S'), EnrichedAlloy, Character.valueOf('G'), Block.glass, Character.valueOf('D'), Block.blockDiamond }); } @@ -484,24 +506,27 @@ public class ObsidianIngots GameRegistry.addSmelting(PlatinumDust.shiftedIndex, new ItemStack(PlatinumIngot, 1), 1.0F); //Enrichment Chamber Recipes - MachineRecipes.addEnrichmentChamberRecipe(new ItemStack(OreBlock, 1, 0), new ItemStack(PlatinumDust, 2)); - MachineRecipes.addEnrichmentChamberRecipe(new ItemStack(Block.oreRedstone), new ItemStack(Item.redstone, 2)); + RecipeHandler.addEnrichmentChamberRecipe(new ItemStack(OreBlock, 1, 0), new ItemStack(PlatinumDust, 2)); + RecipeHandler.addEnrichmentChamberRecipe(new ItemStack(Block.oreRedstone), new ItemStack(Item.redstone, 2)); //Platinum Compressor Recipes - MachineRecipes.addPlatinumCompressorRecipe(new ItemStack(Item.redstone), new ItemStack(RedstoneIngot)); - MachineRecipes.addPlatinumCompressorRecipe(new ItemStack(Item.lightStoneDust), new ItemStack(GlowstoneIngot)); + RecipeHandler.addPlatinumCompressorRecipe(new ItemStack(Item.redstone), new ItemStack(RedstoneIngot)); + RecipeHandler.addPlatinumCompressorRecipe(new ItemStack(Item.lightStoneDust), new ItemStack(GlowstoneIngot)); //Combiner Recipes - MachineRecipes.addCombinerRecipe(new ItemStack(Item.redstone, 4), new ItemStack(Block.oreRedstone)); - MachineRecipes.addCombinerRecipe(new ItemStack(Item.redstone), new ItemStack(RedstoneIngot)); - MachineRecipes.addCombinerRecipe(new ItemStack(PlatinumDust, 2), new ItemStack(OreBlock, 1, 0)); - MachineRecipes.addCombinerRecipe(new ItemStack(Item.diamond), new ItemStack(Block.oreDiamond)); - MachineRecipes.addCombinerRecipe(new ItemStack(Item.dyePowder, 4, 4), new ItemStack(Block.oreLapis)); + RecipeHandler.addCombinerRecipe(new ItemStack(Item.redstone, 4), new ItemStack(Block.oreRedstone)); + RecipeHandler.addCombinerRecipe(new ItemStack(Item.redstone), new ItemStack(RedstoneIngot)); + RecipeHandler.addCombinerRecipe(new ItemStack(PlatinumDust, 2), new ItemStack(OreBlock, 1, 0)); + RecipeHandler.addCombinerRecipe(new ItemStack(Item.diamond), new ItemStack(Block.oreDiamond)); + RecipeHandler.addCombinerRecipe(new ItemStack(Item.dyePowder, 4, 4), new ItemStack(Block.oreLapis)); //Crusher Recipes - MachineRecipes.addCrusherRecipe(new ItemStack(RedstoneIngot), new ItemStack(Item.redstone)); - MachineRecipes.addCrusherRecipe(new ItemStack(PlatinumIngot), new ItemStack(PlatinumDust)); - MachineRecipes.addCrusherRecipe(new ItemStack(GlowstoneIngot), new ItemStack(Item.lightStoneDust)); + RecipeHandler.addCrusherRecipe(new ItemStack(RedstoneIngot), new ItemStack(Item.redstone)); + RecipeHandler.addCrusherRecipe(new ItemStack(PlatinumIngot), new ItemStack(PlatinumDust)); + RecipeHandler.addCrusherRecipe(new ItemStack(GlowstoneIngot), new ItemStack(Item.lightStoneDust)); + + //Theoretical Elementizer Recipes + RecipeHandler.addTheoreticalElementizerRecipe(new ItemStack(EnrichedAlloy), new ItemStack(TileEntityTheoreticalElementizer.getRandomMagicItem())); } /** @@ -604,6 +629,10 @@ public class ObsidianIngots LanguageRegistry.addName(EnrichedAlloy, "Enriched Alloy"); } + LanguageRegistry.addName(EnergyTablet, "Energy Tablet"); + LanguageRegistry.addName(EnergyOrb, "Energy Orb"); + LanguageRegistry.addName(EnergyCube, "Energy Cube"); + //Localization for MultiBlock LanguageRegistry.instance().addStringLocalization("tile.MultiBlock.PlatinumBlock.name", "Platinum Block"); LanguageRegistry.instance().addStringLocalization("tile.MultiBlock.RedstoneBlock.name", "Redstone Block"); @@ -620,6 +649,10 @@ public class ObsidianIngots //Localization for OreBlock LanguageRegistry.instance().addStringLocalization("tile.OreBlock.PlatinumOre.name", "Platinum Ore"); + //Localization for PowerUnit + LanguageRegistry.instance().addStringLocalization("tile.PowerUnit.PowerUnit.name", "Power Unit"); + LanguageRegistry.instance().addStringLocalization("tile.PowerUnit.AdvancedPowerUnit.name", "Advanced Power Unit"); + if(extrasEnabled == true) { LanguageRegistry.instance().addStringLocalization("tile.MachineBlock.TheoreticalElementizer.name", "Theoretical Elementizer"); @@ -725,6 +758,10 @@ public class ObsidianIngots WeatherOrb.setIconIndex(226); EnrichedAlloy.setIconIndex(227); } + + EnergyTablet.setIconIndex(228); + EnergyOrb.setIconIndex(229); + EnergyCube.setIconIndex(230); } /** @@ -736,7 +773,7 @@ public class ObsidianIngots RedstoneBody = (new ItemObsidianArmor(11236, armorREDSTONE, proxy.getArmorIndex("redstone"), 1)).setItemName("RedstoneBody"); RedstoneLegs = (new ItemObsidianArmor(11237, armorREDSTONE, proxy.getArmorIndex("redstone"), 2)).setItemName("RedstoneLegs"); RedstoneBoots = (new ItemObsidianArmor(11238, armorREDSTONE, proxy.getArmorIndex("redstone"), 3)).setItemName("RedstoneBoots"); - RedstoneIngot = new ItemObsidian(11239).setItemName("RedstoneIngot").setTabToDisplayOn(CreativeTabs.tabMaterials); + RedstoneIngot = new ItemObsidian(11239).setItemName("RedstoneIngot").setCreativeTab(CreativeTabs.tabMaterials); RedstonePaxel = new ItemObsidianPaxel(11240, toolREDSTONE2).setItemName("RedstonePaxel"); RedstonePickaxe = new ItemObsidianPickaxe(11241, toolREDSTONE).setItemName("RedstonePickaxe"); RedstoneAxe = new ItemObsidianAxe(11242, toolREDSTONE).setItemName("RedstoneAxe"); @@ -747,7 +784,7 @@ public class ObsidianIngots PlatinumBody = (new ItemObsidianArmor(11247, EnumArmorMaterial.DIAMOND, proxy.getArmorIndex("platinum"), 1)).setItemName("PlatinumBody"); PlatinumLegs = (new ItemObsidianArmor(11248, EnumArmorMaterial.DIAMOND, proxy.getArmorIndex("platinum"), 2)).setItemName("PlatinumLegs"); PlatinumBoots = (new ItemObsidianArmor(11249, EnumArmorMaterial.DIAMOND, proxy.getArmorIndex("platinum"), 3)).setItemName("PlatinumBoots"); - PlatinumIngot = new ItemObsidian(11250).setItemName("PlatinumIngot").setTabToDisplayOn(CreativeTabs.tabMaterials); + PlatinumIngot = new ItemObsidian(11250).setItemName("PlatinumIngot").setCreativeTab(CreativeTabs.tabMaterials); PlatinumPaxel = new ItemObsidianPaxel(11251, toolPLATINUM2).setItemName("PlatinumPaxel"); PlatinumPickaxe = new ItemObsidianPickaxe(11252, toolPLATINUM).setItemName("PlatinumPickaxe"); PlatinumAxe = new ItemObsidianAxe(11253, toolPLATINUM).setItemName("PlatinumAxe"); @@ -758,7 +795,7 @@ public class ObsidianIngots ObsidianBody = (new ItemObsidianArmor(11258, armorOBSIDIAN, proxy.getArmorIndex("obsidian"), 1)).setItemName("ObsidianBody"); ObsidianLegs = (new ItemObsidianArmor(11259, armorOBSIDIAN, proxy.getArmorIndex("obsidian"), 2)).setItemName("ObsidianLegs"); ObsidianBoots = (new ItemObsidianArmor(11260, armorOBSIDIAN, proxy.getArmorIndex("obsidian"), 3)).setItemName("ObsidianBoots"); - ObsidianIngot = new ItemObsidian(11261).setItemName("ObsidianIngot").setTabToDisplayOn(CreativeTabs.tabMaterials); + ObsidianIngot = new ItemObsidian(11261).setItemName("ObsidianIngot").setCreativeTab(CreativeTabs.tabMaterials); ObsidianPaxel = new ItemObsidianPaxel(11262, toolOBSIDIAN2).setItemName("ObsidianPaxel"); ObsidianPickaxe = new ItemObsidianPickaxe(11263, toolOBSIDIAN).setItemName("ObsidianPickaxe"); ObsidianAxe = new ItemObsidianAxe(11264, toolOBSIDIAN).setItemName("ObsidianAxe"); @@ -775,14 +812,14 @@ public class ObsidianIngots LazuliBody = (new ItemObsidianArmor(11275, armorLAZULI, proxy.getArmorIndex("lazuli"), 1)).setItemName("LazuliBody"); LazuliLegs = (new ItemObsidianArmor(11276, armorLAZULI, proxy.getArmorIndex("lazuli"), 2)).setItemName("LazuliLegs"); LazuliBoots = (new ItemObsidianArmor(11277, armorLAZULI, proxy.getArmorIndex("lazuli"), 3)).setItemName("LazuliBoots"); - ObsidianArrow = new ItemObsidian(11278).setItemName("ObsidianArrow").setTabToDisplayOn(CreativeTabs.tabCombat); + ObsidianArrow = new ItemObsidian(11278).setItemName("ObsidianArrow").setCreativeTab(CreativeTabs.tabCombat); ObsidianBow = new ItemObsidianBow(11279).setItemName("ObsidianBow"); if(extrasEnabled == true) { LightningRod = new ItemLightningRod(11280).setItemName("LightningRod"); Stopwatch = new ItemStopwatch(11281).setItemName("Stopwatch"); WeatherOrb = new ItemWeatherOrb(11282).setItemName("WeatherOrb"); - EnrichedAlloy = new ItemObsidian(11313).setItemName("EnrichedAlloy").setTabToDisplayOn(CreativeTabs.tabMaterials); + EnrichedAlloy = new ItemObsidian(11313).setItemName("EnrichedAlloy").setCreativeTab(CreativeTabs.tabMaterials); } WoodPaxel = new ItemObsidianPaxel(11283, EnumToolMaterial.WOOD).setItemName("WoodPaxel"); StonePaxel = new ItemObsidianPaxel(11284, EnumToolMaterial.STONE).setItemName("StonePaxel"); @@ -798,8 +835,8 @@ public class ObsidianIngots LazuliKnife = new ItemObsidianKnife(11294, toolLAZULI).setItemName("LazuliKnife"); PlatinumKnife = new ItemObsidianKnife(11295, toolPLATINUM).setItemName("PlatinumKnife"); RedstoneKnife = new ItemObsidianKnife(11296, toolREDSTONE).setItemName("RedstoneKnife"); - PlatinumDust = new ItemObsidian(11300).setItemName("PlatinumDust").setTabToDisplayOn(CreativeTabs.tabMaterials); - GlowstoneIngot = new ItemObsidian(11301).setItemName("GlowstoneIngot").setTabToDisplayOn(CreativeTabs.tabMaterials); + PlatinumDust = new ItemObsidian(11300).setItemName("PlatinumDust").setCreativeTab(CreativeTabs.tabMaterials); + GlowstoneIngot = new ItemObsidian(11301).setItemName("GlowstoneIngot").setCreativeTab(CreativeTabs.tabMaterials); GlowstonePaxel = new ItemObsidianPaxel(11302, toolGLOWSTONE2).setItemName("GlowstonePaxel"); GlowstonePickaxe = new ItemObsidianPickaxe(11303, toolGLOWSTONE).setItemName("GlowstonePickaxe"); GlowstoneAxe = new ItemObsidianAxe(11304, toolGLOWSTONE).setItemName("GlowstoneAxe"); @@ -811,6 +848,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"); } /** @@ -822,15 +862,17 @@ public class ObsidianIngots MultiBlock = new BlockMulti(multiBlockID).setBlockName("MultiBlock"); MachineBlock = new BlockMachine(machineBlockID).setBlockName("MachineBlock"); OreBlock = new BlockOre(oreBlockID).setBlockName("OreBlock"); + PowerUnit = new BlockPowerUnit(powerUnitID).setBlockName("PowerUnit"); ObsidianTNT = new BlockObsidianTNT(obsidianTNTID).setBlockName("ObsidianTNT").setCreativeTab(CreativeTabs.tabRedstone); //Registrations GameRegistry.registerBlock(ObsidianTNT); //Add block items into itemsList for blocks with multiple IDs. - Item.itemsList[multiBlockID] = new ItemMulti(multiBlockID - 256, MultiBlock).setItemName("MultiBlock"); - Item.itemsList[machineBlockID] = new ItemMachine(machineBlockID - 256, MachineBlock).setItemName("MachineBlock"); - Item.itemsList[oreBlockID] = new ItemOre(oreBlockID - 256, OreBlock).setItemName("OreBlock"); + Item.itemsList[multiBlockID] = new ItemBlockMulti(multiBlockID - 256, MultiBlock).setItemName("MultiBlock"); + 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"); } /** @@ -844,8 +886,8 @@ public class ObsidianIngots GoldDust = hooks.IC2GoldDust.getItem(); } else { - IronDust = new ItemObsidian(11298).setItemName("IronDust").setTabToDisplayOn(CreativeTabs.tabMaterials); - GoldDust = new ItemObsidian(11299).setItemName("GoldDust").setTabToDisplayOn(CreativeTabs.tabMaterials); + IronDust = new ItemObsidian(11298).setItemName("IronDust").setCreativeTab(CreativeTabs.tabMaterials); + GoldDust = new ItemObsidian(11299).setItemName("GoldDust").setCreativeTab(CreativeTabs.tabMaterials); IronDust.setIconIndex(248); GoldDust.setIconIndex(250); LanguageRegistry.addName(IronDust, "Iron Dust"); @@ -857,21 +899,26 @@ public class ObsidianIngots ObsidianDust = hooks.RailcraftObsidianDust.getItem(); } else { - ObsidianDust = new ItemObsidian(11297).setItemName("ObsidianDust").setTabToDisplayOn(CreativeTabs.tabMaterials); + ObsidianDust = new ItemObsidian(11297).setItemName("ObsidianDust").setCreativeTab(CreativeTabs.tabMaterials); ObsidianDust.setIconIndex(241); LanguageRegistry.addName(ObsidianDust, "Obsidian Dust"); } - MachineRecipes.addEnrichmentChamberRecipe(new ItemStack(Block.obsidian), new ItemStack(ObsidianDust)); - MachineRecipes.addEnrichmentChamberRecipe(new ItemStack(Block.oreIron), new ItemStack(IronDust, 2)); - MachineRecipes.addEnrichmentChamberRecipe(new ItemStack(Block.oreGold), new ItemStack(GoldDust, 2)); - MachineRecipes.addPlatinumCompressorRecipe(new ItemStack(ObsidianDust), new ItemStack(ObsidianIngot)); - MachineRecipes.addCombinerRecipe(new ItemStack(ObsidianDust), new ItemStack(Block.obsidian)); - MachineRecipes.addCombinerRecipe(new ItemStack(IronDust, 2), new ItemStack(Block.oreIron)); - MachineRecipes.addCombinerRecipe(new ItemStack(GoldDust, 2), new ItemStack(Block.oreGold)); - MachineRecipes.addCrusherRecipe(new ItemStack(ObsidianIngot), new ItemStack(ObsidianDust)); - MachineRecipes.addCrusherRecipe(new ItemStack(Item.ingotIron), new ItemStack(IronDust)); - MachineRecipes.addCrusherRecipe(new ItemStack(Item.ingotGold), new ItemStack(GoldDust)); + if(!hooks.RailcraftLoaded && hooks.IC2Loaded) + { + Ic2Recipes.addMaceratorRecipe(new ItemStack(Block.obsidian), new ItemStack(ObsidianIngots.ObsidianDust)); + } + + RecipeHandler.addEnrichmentChamberRecipe(new ItemStack(Block.obsidian), new ItemStack(ObsidianDust)); + RecipeHandler.addEnrichmentChamberRecipe(new ItemStack(Block.oreIron), new ItemStack(IronDust, 2)); + RecipeHandler.addEnrichmentChamberRecipe(new ItemStack(Block.oreGold), new ItemStack(GoldDust, 2)); + RecipeHandler.addPlatinumCompressorRecipe(new ItemStack(ObsidianDust), new ItemStack(ObsidianIngot)); + RecipeHandler.addCombinerRecipe(new ItemStack(ObsidianDust), new ItemStack(Block.obsidian)); + RecipeHandler.addCombinerRecipe(new ItemStack(IronDust, 2), new ItemStack(Block.oreIron)); + RecipeHandler.addCombinerRecipe(new ItemStack(GoldDust, 2), new ItemStack(Block.oreGold)); + RecipeHandler.addCrusherRecipe(new ItemStack(ObsidianIngot), new ItemStack(ObsidianDust)); + RecipeHandler.addCrusherRecipe(new ItemStack(Item.ingotIron), new ItemStack(IronDust)); + RecipeHandler.addCrusherRecipe(new ItemStack(Item.ingotGold), new ItemStack(GoldDust)); GameRegistry.addShapelessRecipe(new ItemStack(EnrichedAlloy, 1), new Object[] { Item.redstone, Item.lightStoneDust, IronDust, GoldDust, ObsidianDust, PlatinumDust @@ -899,6 +946,8 @@ public class ObsidianIngots GameRegistry.registerTileEntity(TileEntityCombiner.class, "Combiner"); GameRegistry.registerTileEntity(TileEntityCrusher.class, "Crusher"); GameRegistry.registerTileEntity(TileEntityTheoreticalElementizer.class, "TheoreticalElementizer"); + GameRegistry.registerTileEntity(TileEntityPowerUnit.class, "PowerUnit"); + GameRegistry.registerTileEntity(TileEntityAdvancedPowerUnit.class, "AdvancedPowerUnit"); } @PostInit diff --git a/src/common/net/uberkat/obsidian/common/ObsidianUtils.java b/src/common/net/uberkat/obsidian/common/ObsidianUtils.java index fa50b896f..a2c3aa528 100644 --- a/src/common/net/uberkat/obsidian/common/ObsidianUtils.java +++ b/src/common/net/uberkat/obsidian/common/ObsidianUtils.java @@ -33,7 +33,7 @@ public class ObsidianUtils { if(!(ObsidianIngots.latestVersionNumber.equals("Error retrieving data.")) && !(ObsidianIngots.latestVersionNumber.equals(ObsidianIngots.versionNumber.toString()))) { - entityplayer.addChatMessage("Your version of ¤1Obsidian Ingots ¤7(¤8" + ObsidianIngots.versionNumber.toString() + "¤7) is outdated. Please update to version ¤8" + ObsidianIngots.latestVersionNumber); + entityplayer.addChatMessage("Your version of Obsidian Ingots (" + ObsidianIngots.versionNumber.toString() + ") is outdated. Please update to version " + ObsidianIngots.latestVersionNumber); } else if(ObsidianIngots.latestVersionNumber.equals("Error retrieving data.")) { @@ -41,6 +41,33 @@ public class ObsidianUtils } } + public static String getDisplayedEnergy(int energy) + { + if(energy < 1000) + { + return energy + " u"; + } + else if(energy >= 1000 && energy < 10000) + { + return energy/10 + " kU"; + } + else if(energy >= 10000 && energy < 100000) + { + return energy/100 + " mU"; + } + else if(energy >= 100000 && energy < 1000000) + { + return energy/1000 + " gU"; + } + else if(energy >= 1000000) + { + return energy/100000 + " tU"; + } + else { + return null; + } + } + /** * Gets the latest version using getHTML and returns it as a string. * @return latest version @@ -104,7 +131,7 @@ public class ObsidianUtils Packet3Chat chatPacket = new Packet3Chat(msg); if(player != null) { - ((EntityPlayerMP)player).serverForThisPlayer.sendPacketToPlayer(chatPacket); + ((EntityPlayerMP)player).playerNetServerHandler.sendPacketToPlayer(chatPacket); } } diff --git a/src/common/net/uberkat/obsidian/common/OreHandler.java b/src/common/net/uberkat/obsidian/common/OreHandler.java index 75c3eed8f..8731fcce4 100644 --- a/src/common/net/uberkat/obsidian/common/OreHandler.java +++ b/src/common/net/uberkat/obsidian/common/OreHandler.java @@ -12,7 +12,7 @@ public class OreHandler implements IWorldGenerator { public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - switch(world.provider.worldType) + switch(world.provider.dimensionId) { case 0: generateSurface(world, random, chunkX*16, chunkZ*16); diff --git a/src/common/net/uberkat/obsidian/common/PacketHandler.java b/src/common/net/uberkat/obsidian/common/PacketHandler.java index 97355f996..59d9e1f76 100644 --- a/src/common/net/uberkat/obsidian/common/PacketHandler.java +++ b/src/common/net/uberkat/obsidian/common/PacketHandler.java @@ -16,6 +16,7 @@ import net.minecraft.src.Packet; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.TileEntity; import net.minecraft.src.World; +import net.uberkat.obsidian.api.INetworkedMachine; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.IPacketHandler; @@ -77,9 +78,9 @@ public class PacketHandler implements IPacketHandler World world = ((EntityPlayer)player).worldObj; TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - if(tileEntity instanceof TileEntityMachine) + if(tileEntity instanceof INetworkedMachine) { - ((TileEntityMachine)tileEntity).handlePacketData(manager, packet, ((EntityPlayer)player), dataStream); + ((INetworkedMachine)tileEntity).handlePacketData(manager, packet, ((EntityPlayer)player), dataStream); } } catch (Exception e) { @@ -101,21 +102,20 @@ public class PacketHandler implements IPacketHandler * x, y, and z coordinates, along with it's active state, burn time, cook time, and item burn time. * @param sender - tile entity who is sending the packet */ - public static void sendMachinePacket(TileEntityMachine sender) + public static void sendElectricMachinePacket(TileEntityElectricMachine sender) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(bytes); try { - output.writeInt(2); + output.writeInt(EnumPacketType.TILE_ENTITY.id); output.writeInt(sender.xCoord); output.writeInt(sender.yCoord); output.writeInt(sender.zCoord); output.writeInt(sender.facing); output.writeByte(sender.isActive ? 1 : 0); - output.writeInt(sender.machineBurnTime); - output.writeInt(sender.machineCookTime); - output.writeInt(sender.currentItemBurnTime); + output.writeInt(sender.operatingTicks); + output.writeInt(sender.energyStored); } catch (IOException e) { System.err.println("[ObsidianIngots] Error while writing tile entity packet."); @@ -133,21 +133,20 @@ public class PacketHandler implements IPacketHandler } } - public static void sendMachinePacketWithRange(TileEntityMachine sender, double distance) + public static void sendElectricMachinePacketWithRange(TileEntityElectricMachine sender, double distance) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(bytes); try { - output.writeInt(2); + output.writeInt(EnumPacketType.TILE_ENTITY.id); output.writeInt(sender.xCoord); output.writeInt(sender.yCoord); output.writeInt(sender.zCoord); output.writeInt(sender.facing); output.writeByte(sender.isActive ? 1 : 0); - output.writeInt(sender.machineBurnTime); - output.writeInt(sender.machineCookTime); - output.writeInt(sender.currentItemBurnTime); + output.writeInt(sender.operatingTicks); + output.writeInt(sender.energyStored); } catch (IOException e) { System.err.println("[ObsidianIngots] Error while writing tile entity packet."); @@ -159,7 +158,123 @@ public class PacketHandler implements IPacketHandler packet.data = bytes.toByteArray(); packet.length = packet.data.length; - PacketDispatcher.sendPacketToAllAround(sender.xCoord, sender.yCoord, sender.zCoord, distance, sender.worldObj.provider.worldType, packet); + PacketDispatcher.sendPacketToAllAround(sender.xCoord, sender.yCoord, sender.zCoord, distance, sender.worldObj.provider.dimensionId, packet); + } + + public static void sendAdvancedElectricMachinePacket(TileEntityAdvancedElectricMachine 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.writeByte(sender.isActive ? 1 : 0); + output.writeInt(sender.operatingTicks); + output.writeInt(sender.energyStored); + output.writeInt(sender.secondaryEnergyStored); + } 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); + } + } + + public static void sendAdvancedElectricMachinePacketWithRange(TileEntityAdvancedElectricMachine 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.writeByte(sender.isActive ? 1 : 0); + output.writeInt(sender.operatingTicks); + output.writeInt(sender.energyStored); + output.writeInt(sender.secondaryEnergyStored); + } 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); + } + + public static void sendPowerUnitPacket(TileEntityPowerUnit 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); + } 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); + } + } + + public static void sendPowerUnitPacketWithRange(TileEntityPowerUnit 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); + } 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); } /** diff --git a/src/common/net/uberkat/obsidian/common/MachineRecipes.java b/src/common/net/uberkat/obsidian/common/RecipeHandler.java similarity index 86% rename from src/common/net/uberkat/obsidian/common/MachineRecipes.java rename to src/common/net/uberkat/obsidian/common/RecipeHandler.java index 0bc732a42..97d52bf39 100644 --- a/src/common/net/uberkat/obsidian/common/MachineRecipes.java +++ b/src/common/net/uberkat/obsidian/common/RecipeHandler.java @@ -8,7 +8,7 @@ import net.minecraft.src.*; * @author AidanBrady * */ -public final class MachineRecipes +public final class RecipeHandler { /** * Add an Enrichment Chamber recipe. @@ -50,6 +50,16 @@ public final class MachineRecipes TileEntityCrusher.recipes.add(new AbstractMap.SimpleEntry(input, output)); } + /** + * Add a Theoretical Elementizer recipe. + * @param input - input ItemStack + * @param output - output ItemStack + */ + public static void addTheoreticalElementizerRecipe(ItemStack input, ItemStack output) + { + TileEntityTheoreticalElementizer.recipes.add(new AbstractMap.SimpleEntry(input, output)); + } + /** * Gets the output ItemStack of the ItemStack in the parameters. * @param itemstack - input ItemStack diff --git a/src/common/net/uberkat/obsidian/common/SlotEnergy.java b/src/common/net/uberkat/obsidian/common/SlotEnergy.java new file mode 100644 index 000000000..52c683ac6 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/SlotEnergy.java @@ -0,0 +1,19 @@ +package net.uberkat.obsidian.common; + +import universalelectricity.implement.IItemElectric; +import ic2.api.IElectricItem; +import net.minecraft.src.*; +import net.uberkat.obsidian.api.IEnergizedItem; + +public class SlotEnergy extends Slot +{ + public SlotEnergy(IInventory inventory, int x, int y, int z) + { + super(inventory, x, y, z); + } + + public boolean isItemValid(ItemStack itemstack) + { + return itemstack.getItem() instanceof IEnergizedItem || itemstack.getItem() instanceof IElectricItem || itemstack.getItem() instanceof IItemElectric || itemstack.itemID == Item.redstone.shiftedIndex; + } +} diff --git a/src/common/net/uberkat/obsidian/common/Sound.java b/src/common/net/uberkat/obsidian/common/Sound.java deleted file mode 100644 index 4d4aed79f..000000000 --- a/src/common/net/uberkat/obsidian/common/Sound.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.uberkat.obsidian.common; - -public class Sound -{ - public String name; - public int x; - public int y; - public int z; - - public Sound(String s, int i, int j, int k) - { - name = s; - x = i; - y = j; - z = k; - } -} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java new file mode 100644 index 000000000..8c9e1a103 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedElectricMachine.java @@ -0,0 +1,486 @@ +package net.uberkat.obsidian.common; + +import java.util.List; + +import universalelectricity.UniversalElectricity; +import universalelectricity.implement.IItemElectric; + +import com.google.common.io.ByteArrayDataInput; + +import ic2.api.ElectricItem; +import ic2.api.EnergyNet; +import ic2.api.IElectricItem; +import ic2.api.IWrenchable; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.ISidedInventory; +import net.uberkat.obsidian.api.IEnergizedItem; + +public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicMachine +{ + /** The inventory slot itemstacks used by this machine. */ + public ItemStack[] inventory = new ItemStack[4]; + + /** The full name of this machine. */ + public String fullName; + + /** How much energy this machine uses per tick. */ + public int ENERGY_PER_TICK; + + /** How much secondary energy (fuel) this machine uses per tick. */ + public int SECONDARY_ENERGY_PER_TICK; + + /** Ticks required to operate -- or smelt an item. */ + public int TICKS_REQUIRED; + + /** Maximum amount of energy this machine can hold. */ + public int MAX_ENERGY; + + /** Maximum amount of secondary energy (fuel) this machine can hold. */ + public int MAX_SECONDARY_ENERGY; + + /** How many ticks this machine has operated for. */ + public int operatingTicks = 0; + + /** How much energy is stored in this machine. */ + public int energyStored = 0; + + /** How much secondary energy (fuel) is stored in this machine. */ + public int secondaryEnergyStored = 0; + + /** + * Advanced Electric Machine -- a machine like this has a total of 4 slots. Input slot (0), fuel slot (1), output slot (2), + * and the energy slot (3). The machine will not run if it does not have enough electricity, or if it doesn't have enough + * fuel ticks. + * + * @param name - display name of the machine. + * @param perTick - how much energy this machine uses per tick. + * @param secondaryPerTick - how much secondary energy (fuel) this machine uses per tick. + * @param ticksRequired - how many ticks it takes to smelt an item. + * @param maxEnergy - maximum amount of energy this machine can hold. + * @param maxSecondaryEnergy - maximum amount of secondary energy (fuel) this machine can hold. + */ + public TileEntityAdvancedElectricMachine(String name, int perTick, int secondaryPerTick, int ticksRequired, int maxEnergy, int maxSecondaryEnergy) + { + fullName = name; + ENERGY_PER_TICK = perTick; + SECONDARY_ENERGY_PER_TICK = secondaryPerTick; + TICKS_REQUIRED = ticksRequired; + MAX_ENERGY = maxEnergy; + MAX_SECONDARY_ENERGY = maxSecondaryEnergy; + } + + /** + * Gets the amount of ticks the declared itemstack can fuel this machine. + * @param itemstack - itemstack to check with + * @return fuel ticks + */ + public abstract int getFuelTicks(ItemStack itemstack); + + public void onUpdate() + { + boolean testActive = operatingTicks > 0; + + if(inventory[3] != null) + { + if(energyStored < MAX_ENERGY) + { + if(inventory[3].getItem() instanceof IEnergizedItem) + { + int received = 0; + int energyNeeded = MAX_ENERGY - energyStored; + IEnergizedItem item = (IEnergizedItem)inventory[3].getItem(); + if(item.getRate() <= energyNeeded) + { + received = item.discharge(inventory[3], item.getRate()); + } + else if(item.getRate() > energyNeeded) + { + item.setEnergy(inventory[3], (item.getEnergy(inventory[3]) - energyNeeded)); + received = energyNeeded; + } + + setEnergy(energyStored + received); + } + else if(inventory[3].getItem() instanceof IItemElectric) + { + int received = 0; + int energyNeeded = MAX_ENERGY - energyStored; + IItemElectric item = (IItemElectric)inventory[3].getItem(); + if((item.getTransferRate()*UniversalElectricity.Wh_IC2_RATIO) <= energyNeeded) + { + received = (int)(item.onUseElectricity(item.getTransferRate(), inventory[3])*UniversalElectricity.Wh_IC2_RATIO); + } + else if(item.getTransferRate() > energyNeeded) + { + item.setWattHours((item.getWattHours(inventory[3]) - (energyNeeded*UniversalElectricity.IC2_RATIO)), inventory[3]); + } + } + else if(inventory[3].getItem() instanceof IElectricItem) + { + IElectricItem item = (IElectricItem)inventory[3].getItem(); + if(item.canProvideEnergy()) + { + int gain = ElectricItem.discharge(inventory[3], energyStored, 3, false, false); + setEnergy(energyStored + gain); + } + } + } + if(inventory[3].itemID == Item.redstone.shiftedIndex && energyStored <= (MAX_ENERGY-1000)) + { + setEnergy(energyStored + 1000); + --inventory[3].stackSize; + + if (inventory[3].stackSize <= 0) + { + inventory[3] = null; + } + } + } + + if(canOperate() && inventory[1] != null && secondaryEnergyStored == 0) + { + int fuelTicks = getFuelTicks(inventory[1]); + if(fuelTicks > 0) + { + int energyNeeded = MAX_SECONDARY_ENERGY - secondaryEnergyStored; + if(fuelTicks <= energyNeeded) + { + setSecondaryEnergy(secondaryEnergyStored + fuelTicks); + } + else if(fuelTicks > energyNeeded) + { + setSecondaryEnergy(secondaryEnergyStored + energyNeeded); + } + --inventory[1].stackSize; + + if(inventory[1].stackSize == 0) + { + inventory[1] = null; + } + } + } + + if(canOperate() && (operatingTicks+1) < TICKS_REQUIRED && secondaryEnergyStored >= SECONDARY_ENERGY_PER_TICK) + { + ++operatingTicks; + secondaryEnergyStored -= SECONDARY_ENERGY_PER_TICK; + energyStored -= ENERGY_PER_TICK; + } + else if((operatingTicks+1) == TICKS_REQUIRED) + { + if(!worldObj.isRemote) + { + operate(); + } + operatingTicks = 0; + secondaryEnergyStored -= SECONDARY_ENERGY_PER_TICK; + energyStored -= ENERGY_PER_TICK; + } + + if(energyStored < 0) + { + energyStored = 0; + } + + if(secondaryEnergyStored < 0) + { + secondaryEnergyStored = 0; + } + + if(energyStored > MAX_ENERGY) + { + energyStored = MAX_ENERGY; + } + + if(secondaryEnergyStored > MAX_SECONDARY_ENERGY) + { + secondaryEnergyStored = MAX_SECONDARY_ENERGY; + } + + if(!canOperate()) + { + operatingTicks = 0; + } + + if(!worldObj.isRemote) + { + if(testActive != operatingTicks > 0) + { + if(operatingTicks > 0) + { + setActive(true); + } + else if(!canOperate()) + { + setActive(false); + } + } + } + } + + public void operate() + { + if (!canOperate()) + { + 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(); + } + + if (inventory[0].stackSize <= 0) + { + inventory[0] = null; + } + + if (inventory[2] == null) + { + inventory[2] = itemstack; + } + else + { + inventory[2].stackSize += itemstack.stackSize; + } + } + + public boolean canOperate() + { + if (inventory[0] == null) + { + return false; + } + + if(energyStored < ENERGY_PER_TICK) + { + return false; + } + + ItemStack itemstack = RecipeHandler.getOutput(inventory[0], false, getRecipes()); + + if (itemstack == null) + { + return false; + } + + if (inventory[2] == null) + { + return true; + } + + if (!inventory[2].isItemEqual(itemstack)) + { + return false; + } + else + { + return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); + } + } + + public void sendPacket() + { + PacketHandler.sendAdvancedElectricMachinePacket(this); + } + + public void sendPacketWithRange() + { + PacketHandler.sendAdvancedElectricMachinePacketWithRange(this, 50); + } + + public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try { + facing = dataStream.readInt(); + isActive = dataStream.readByte() != 0; + operatingTicks = dataStream.readInt(); + energyStored = dataStream.readInt(); + secondaryEnergyStored = dataStream.readInt(); + worldObj.markBlockAsNeedsUpdate(xCoord, yCoord, zCoord); + } catch (Exception e) + { + System.out.println("[ObsidianIngots] Error while handling tile entity packet."); + e.printStackTrace(); + } + } + + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList var2 = par1NBTTagCompound.getTagList("Items"); + inventory = new ItemStack[getSizeInventory()]; + + for (int var3 = 0; var3 < var2.tagCount(); ++var3) + { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + byte var5 = var4.getByte("Slot"); + + if (var5 >= 0 && var5 < inventory.length) + { + inventory[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + + operatingTicks = par1NBTTagCompound.getInteger("operatingTicks"); + energyStored = par1NBTTagCompound.getInteger("energyStored"); + secondaryEnergyStored = par1NBTTagCompound.getInteger("secondaryEnergyStored"); + prevActive = isActive = par1NBTTagCompound.getBoolean("isActive"); + facing = par1NBTTagCompound.getInteger("facing"); + } + + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("operatingTicks", operatingTicks); + par1NBTTagCompound.setInteger("energyStored", energyStored); + par1NBTTagCompound.setInteger("secondaryEnergyStored", secondaryEnergyStored); + par1NBTTagCompound.setBoolean("isActive", isActive); + par1NBTTagCompound.setInteger("facing", facing); + NBTTagList var2 = new NBTTagList(); + + for (int var3 = 0; var3 < inventory.length; ++var3) + { + if (inventory[var3] != null) + { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + inventory[var3].writeToNBT(var4); + var2.appendTag(var4); + } + } + + par1NBTTagCompound.setTag("Items", var2); + } + + 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 var1) + { + return inventory[var1]; + } + + 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 fullName; + } + + public int getInventoryStackLimit() + { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer var1) + { + return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : var1.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; + } + + public void openChest() {} + + public void closeChest() {} + + /** + * Sets the energy to a new amount. + * @param energy - amount to store + */ + public void setEnergy(int energy) + { + energyStored = Math.max(Math.min(energy, MAX_ENERGY), 0); + } + + /** + * Sets the secondary energy to a new amount + * @param energy - amount to store + */ + public void setSecondaryEnergy(int energy) + { + secondaryEnergyStored = Math.max(Math.min(energy, getFuelTicks(inventory[1])), 0); + } + + public int getScaledChargeLevel(int i) + { + return secondaryEnergyStored*i / MAX_SECONDARY_ENERGY; + } + + public int getScaledProgress(int i) + { + return operatingTicks*i / TICKS_REQUIRED; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java new file mode 100644 index 000000000..e66ca4375 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityAdvancedPowerUnit.java @@ -0,0 +1,9 @@ +package net.uberkat.obsidian.common; + +public class TileEntityAdvancedPowerUnit extends TileEntityPowerUnit +{ + public TileEntityAdvancedPowerUnit() + { + super(50000000, 1024); + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java new file mode 100644 index 000000000..bb7ed2262 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityBasicMachine.java @@ -0,0 +1,142 @@ +package net.uberkat.obsidian.common; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.Side; +import cpw.mods.fml.common.asm.SideOnly; + +import ic2.api.EnergyNet; +import ic2.api.IWrenchable; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.ISidedInventory; +import net.uberkat.obsidian.api.IElectricMachine; + +public abstract class TileEntityBasicMachine extends TileEntity implements IElectricMachine +{ + /** The direction this block is facing. */ + public int facing; + + /** A timer used to update the block's texture. */ + public int textureTick = 0; + + /** An integer that cycles between 0-15, used to update the block's texture. */ + public int textureIndex = 0; + + /** 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 most basic of machines - a simple tile entity with a facing, active state, initialized state, and animated texture. + */ + public TileEntityBasicMachine() + { + isActive = false; + } + + public void updateEntity() + { + if(!initialized) + { + if(ObsidianIngots.hooks.IC2Loaded) + { + EnergyNet.getForWorld(worldObj).addTileEntity(this); + } + + initialized = true; + } + + onUpdate(); + + if(worldObj.isRemote) + { + updateTexture(); + } + + if(!worldObj.isRemote) + { + if(packetTick == 5) + { + sendPacket(); + } + + if(packetTick % 100 == 0) + { + sendPacketWithRange(); + } + packetTick++; + } + } + + @SideOnly(Side.CLIENT) + public void updateTexture() + { + if(textureTick % 5 == 0) + { + textureIndex = (++textureIndex)%15; + worldObj.markBlockNeedsUpdate(xCoord, yCoord, zCoord); + } + textureTick++; + } + + 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 setActive(boolean active) + { + isActive = active; + + if(prevActive != active) + { + sendPacket(); + } + + prevActive = active; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityCombiner.java b/src/common/net/uberkat/obsidian/common/TileEntityCombiner.java index d7fa4b17e..d0e5b68ba 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityCombiner.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityCombiner.java @@ -7,155 +7,26 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; import net.minecraft.src.*; -public class TileEntityCombiner extends TileEntityMachine +public class TileEntityCombiner extends TileEntityAdvancedElectricMachine { public static List recipes = new Vector(); public TileEntityCombiner() { - super(200, "Combiner"); + super("Combiner", 5, 1, 200, 1000, 200); + } + + public List getRecipes() + { + return recipes; + } + + public int getFuelTicks(ItemStack itemstack) + { + if(itemstack.getItem() instanceof ItemBlock && itemstack.itemID == Block.cobblestone.blockID) + { + return 200; + } + return 0; } - - public void onUpdate() - { - boolean var1 = machineBurnTime > 0; - boolean var2 = false; - - if (machineBurnTime > 0) - { - --machineBurnTime; - } - - if (!worldObj.isRemote) - { - if (machineBurnTime == 0 && canSmelt()) - { - currentItemBurnTime = machineBurnTime = getItemBurnTime(inventory[1]); - - if (machineBurnTime > 0) - { - var2 = true; - - if (inventory[1] != null) - { - --inventory[1].stackSize; - - if (inventory[1].stackSize == 0) - { - inventory[1] = null; - } - } - } - } - - if (isBurning() && canSmelt()) - { - ++machineCookTime; - - if (machineCookTime == maxBurnTime) - { - machineCookTime = 0; - smeltItem(); - var2 = true; - } - } - else - { - machineCookTime = 0; - } - - if (var1 != machineBurnTime > 0) - { - var2 = true; - setActive(isBurning()); - } - } - - if (var2) - { - onInventoryChanged(); - } - } - - public boolean canSmelt() - { - if (inventory[0] == null) - { - return false; - } - - ItemStack itemstack = MachineRecipes.getOutput(inventory[0], false, recipes); - - if (itemstack == null) - { - return false; - } - - if (inventory[2] == null) - { - return true; - } - - if (!inventory[2].isItemEqual(itemstack)) - { - return false; - } - else - { - return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); - } - } - - public void smeltItem() - { - if (!canSmelt()) - { - return; - } - - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = MachineRecipes.getOutput(inventory[0], false, recipes).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = MachineRecipes.getOutput(inventory[0], true, recipes).copy(); - } - - if (inventory[0].stackSize <= 0) - { - inventory[0] = null; - } - - if (inventory[2] == null) - { - inventory[2] = itemstack; - } - else - { - inventory[2].stackSize += itemstack.stackSize; - } - } - - public static int getItemBurnTime(ItemStack par1ItemStack) - { - if (par1ItemStack == null) - { - return 0; - } - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; - if (par1ItemStack.getItem() instanceof ItemBlock && var1 == Block.cobblestone.blockID) return 200; - } - return 0; - } - - public static boolean isItemFuel(ItemStack par0ItemStack) - { - return getItemBurnTime(par0ItemStack) > 0; - } } diff --git a/src/common/net/uberkat/obsidian/common/TileEntityCrusher.java b/src/common/net/uberkat/obsidian/common/TileEntityCrusher.java index 5b375f978..9bfc6c0cc 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityCrusher.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityCrusher.java @@ -7,157 +7,17 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; import net.minecraft.src.*; -public class TileEntityCrusher extends TileEntityMachine +public class TileEntityCrusher extends TileEntityElectricMachine { public static List recipes = new Vector(); public TileEntityCrusher() { - super(200, "Crusher"); + super("Crusher", 5, 200, 1000); + } + + public List getRecipes() + { + return recipes; } - - public void onUpdate() - { - boolean var1 = machineBurnTime > 0; - boolean var2 = false; - - if (machineBurnTime > 0) - { - --machineBurnTime; - } - - if (!worldObj.isRemote) - { - if (machineBurnTime == 0 && canSmelt()) - { - currentItemBurnTime = machineBurnTime = getItemBurnTime(inventory[1]); - - if (machineBurnTime > 0) - { - var2 = true; - - if (inventory[1] != null) - { - --inventory[1].stackSize; - - if (inventory[1].stackSize == 0) - { - inventory[1] = null; - } - } - } - } - - if (isBurning() && canSmelt()) - { - ++machineCookTime; - - if (machineCookTime == maxBurnTime) - { - machineCookTime = 0; - smeltItem(); - var2 = true; - } - } - else - { - machineCookTime = 0; - } - - if (var1 != machineBurnTime > 0) - { - var2 = true; - setActive(isBurning()); - } - } - - if (var2) - { - onInventoryChanged(); - } - } - - public boolean canSmelt() - { - if (inventory[0] == null) - { - return false; - } - - ItemStack itemstack = MachineRecipes.getOutput(inventory[0], false, recipes); - - if (itemstack == null) - { - return false; - } - - if (inventory[2] == null) - { - return true; - } - - if (!inventory[2].isItemEqual(itemstack)) - { - return false; - } - else - { - return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); - } - } - - public void smeltItem() - { - if (!canSmelt()) - { - return; - } - - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = MachineRecipes.getOutput(inventory[0], false, recipes).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = MachineRecipes.getOutput(inventory[0], true, recipes).copy(); - } - - if (inventory[0].stackSize <= 0) - { - inventory[0] = null; - } - - if (inventory[2] == null) - { - inventory[2] = itemstack; - } - else - { - inventory[2].stackSize += itemstack.stackSize; - } - } - - public static int getItemBurnTime(ItemStack par1ItemStack) - { - if (par1ItemStack == null) - { - return 0; - } - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; - if (var1 == Item.redstone.shiftedIndex) return 600; - if (var1 == ObsidianIngots.RedstoneIngot.shiftedIndex) - if (var1 == new ItemStack(ObsidianIngots.MultiBlock, 1, 2).itemID) return 5400; - } - return 0; - } - - public static boolean isItemFuel(ItemStack par0ItemStack) - { - return getItemBurnTime(par0ItemStack) > 0; - } } diff --git a/src/common/net/uberkat/obsidian/common/TileEntityElectricMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityElectricMachine.java new file mode 100644 index 000000000..9ca460469 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityElectricMachine.java @@ -0,0 +1,420 @@ +package net.uberkat.obsidian.common; + +import java.util.List; + +import universalelectricity.UniversalElectricity; +import universalelectricity.implement.IItemElectric; + +import com.google.common.io.ByteArrayDataInput; + +import ic2.api.ElectricItem; +import ic2.api.EnergyNet; +import ic2.api.IElectricItem; +import ic2.api.IWrenchable; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.ISidedInventory; +import net.uberkat.obsidian.api.IEnergizedItem; + +public abstract class TileEntityElectricMachine extends TileEntityBasicMachine +{ + /** The inventory slot itemstacks used by this machine. */ + public ItemStack[] inventory = new ItemStack[3]; + + /** The full name of this machine. */ + public String fullName; + + /** How much energy this machine uses per tick. */ + public int ENERGY_PER_TICK; + + /** Ticks required to operate -- or smelt an item. */ + public int TICKS_REQUIRED; + + /** Maximum amount of energy this machine can hold. */ + public int MAX_ENERGY; + + /** How many ticks this machine has operated for. */ + public int operatingTicks = 0; + + /** How much energy is stored in this machine. */ + public int energyStored = 0; + + /** + * A simple electrical machine. This has 3 slots - the input slot (0), the energy slot (1), + * and the output slot (2). It will not run if it does not have enough energy. + * + * @param name - full name of the machine. + * @param perTick - energy used per tick. + * @param ticksRequired - ticks required to operate -- or smelt an item. + * @param maxEnergy - maximum energy this machine can hold. + */ + public TileEntityElectricMachine(String name, int perTick, int ticksRequired, int maxEnergy) + { + fullName = name; + ENERGY_PER_TICK = perTick; + TICKS_REQUIRED = ticksRequired; + MAX_ENERGY = maxEnergy; + } + + public void onUpdate() + { + boolean testActive = operatingTicks > 0; + + if(inventory[1] != null) + { + if(energyStored < MAX_ENERGY) + { + if(inventory[1].getItem() instanceof IEnergizedItem) + { + int received = 0; + int energyNeeded = MAX_ENERGY - energyStored; + IEnergizedItem item = (IEnergizedItem)inventory[1].getItem(); + if(item.getRate() <= energyNeeded) + { + received = item.discharge(inventory[1], item.getRate()); + } + else if(item.getRate() > energyNeeded) + { + item.setEnergy(inventory[1], (item.getEnergy(inventory[1]) - energyNeeded)); + received = energyNeeded; + } + + setEnergy(energyStored + received); + } + else if(inventory[1].getItem() instanceof IItemElectric) + { + int received = 0; + int energyNeeded = MAX_ENERGY - energyStored; + IItemElectric item = (IItemElectric)inventory[1].getItem(); + if((item.getTransferRate()*UniversalElectricity.Wh_IC2_RATIO) <= energyNeeded) + { + received = (int)(item.onUseElectricity(item.getTransferRate(), inventory[1])*UniversalElectricity.Wh_IC2_RATIO); + } + else if(item.getTransferRate() > energyNeeded) + { + item.setWattHours((item.getWattHours(inventory[1]) - (energyNeeded*UniversalElectricity.IC2_RATIO)), inventory[1]); + } + } + else if(inventory[1].getItem() instanceof IElectricItem) + { + IElectricItem item = (IElectricItem)inventory[1].getItem(); + if(item.canProvideEnergy()) + { + int gain = ElectricItem.discharge(inventory[1], energyStored, 3, false, false); + setEnergy(energyStored + gain); + } + } + } + if(inventory[1].itemID == Item.redstone.shiftedIndex && energyStored <= (MAX_ENERGY-1000)) + { + setEnergy(energyStored + 1000); + --inventory[1].stackSize; + + if (inventory[1].stackSize <= 0) + { + inventory[1] = null; + } + } + } + + if(canOperate() && (operatingTicks+1) < TICKS_REQUIRED) + { + ++operatingTicks; + energyStored -= ENERGY_PER_TICK; + } + else if(canOperate() && (operatingTicks+1) == TICKS_REQUIRED) + { + if(!worldObj.isRemote) + { + operate(); + } + operatingTicks = 0; + energyStored -= ENERGY_PER_TICK; + } + + if(energyStored < 0) + { + energyStored = 0; + } + + if(energyStored > MAX_ENERGY) + { + energyStored = MAX_ENERGY; + } + + if(!canOperate()) + { + operatingTicks = 0; + } + + if(!worldObj.isRemote) + { + if(testActive != operatingTicks > 0) + { + if(operatingTicks > 0) + { + setActive(true); + } + else if(!canOperate()) + { + setActive(false); + } + } + } + } + + public void operate() + { + if (!canOperate()) + { + 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(); + } + + if (inventory[0].stackSize <= 0) + { + inventory[0] = null; + } + + if (inventory[2] == null) + { + inventory[2] = itemstack; + } + else + { + inventory[2].stackSize += itemstack.stackSize; + } + } + + public boolean canOperate() + { + if (inventory[0] == null) + { + return false; + } + + if(energyStored < ENERGY_PER_TICK) + { + return false; + } + + ItemStack itemstack = RecipeHandler.getOutput(inventory[0], false, getRecipes()); + + if (itemstack == null) + { + return false; + } + + if (inventory[2] == null) + { + return true; + } + + if (!inventory[2].isItemEqual(itemstack)) + { + return false; + } + else + { + return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); + } + } + + public abstract List getRecipes(); + + public void sendPacket() + { + PacketHandler.sendElectricMachinePacket(this); + } + + public void sendPacketWithRange() + { + PacketHandler.sendElectricMachinePacketWithRange(this, 50); + } + + public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try { + facing = dataStream.readInt(); + isActive = dataStream.readByte() != 0; + operatingTicks = dataStream.readInt(); + energyStored = dataStream.readInt(); + worldObj.markBlockAsNeedsUpdate(xCoord, yCoord, zCoord); + } catch (Exception e) + { + System.out.println("[ObsidianIngots] Error while handling tile entity packet."); + e.printStackTrace(); + } + } + + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList var2 = par1NBTTagCompound.getTagList("Items"); + inventory = new ItemStack[getSizeInventory()]; + + for (int var3 = 0; var3 < var2.tagCount(); ++var3) + { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + byte var5 = var4.getByte("Slot"); + + if (var5 >= 0 && var5 < inventory.length) + { + inventory[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + + operatingTicks = par1NBTTagCompound.getInteger("operatingTicks"); + energyStored = par1NBTTagCompound.getInteger("energyStored"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + facing = par1NBTTagCompound.getInteger("facing"); + } + + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("operatingTicks", operatingTicks); + par1NBTTagCompound.setInteger("energyStored", energyStored); + par1NBTTagCompound.setBoolean("isActive", isActive); + par1NBTTagCompound.setInteger("facing", facing); + NBTTagList var2 = new NBTTagList(); + + for (int var3 = 0; var3 < inventory.length; ++var3) + { + if (inventory[var3] != null) + { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + inventory[var3].writeToNBT(var4); + var2.appendTag(var4); + } + } + + par1NBTTagCompound.setTag("Items", var2); + } + + 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 var1) + { + return inventory[var1]; + } + + 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 fullName; + } + + public int getInventoryStackLimit() + { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer var1) + { + return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : var1.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; + } + + public void openChest() {} + + public void closeChest() {} + + /** + * Sets the energy to a new amount. + * @param energy - amount to store + */ + public void setEnergy(int energy) + { + energyStored = Math.max(Math.min(energy, MAX_ENERGY), 0); + } + + public int getScaledChargeLevel(int i) + { + return energyStored*i / MAX_ENERGY; + } + + public int getScaledProgress(int i) + { + return operatingTicks*i / TICKS_REQUIRED; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityEnrichmentChamber.java b/src/common/net/uberkat/obsidian/common/TileEntityEnrichmentChamber.java index bdf804576..ba15963ad 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityEnrichmentChamber.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityEnrichmentChamber.java @@ -9,155 +9,17 @@ import net.minecraftforge.common.ISidedInventory; import net.minecraftforge.common.ForgeDirection; import net.minecraft.src.*; -public class TileEntityEnrichmentChamber extends TileEntityMachine +public class TileEntityEnrichmentChamber extends TileEntityElectricMachine { public static List recipes = new Vector(); public TileEntityEnrichmentChamber() { - super(200, "Enrichment Chamber"); + super("Enrichment Chamber", 5, 200, 1000); } - public void onUpdate() - { - boolean var1 = machineBurnTime > 0; - boolean var2 = false; - - if (machineBurnTime > 0) - { - --machineBurnTime; - } - - if (!worldObj.isRemote) - { - if (machineBurnTime == 0 && canSmelt()) - { - currentItemBurnTime = machineBurnTime = getItemBurnTime(inventory[1]); - - if (machineBurnTime > 0) - { - var2 = true; - - if (inventory[1] != null) - { - --inventory[1].stackSize; - - if (inventory[1].stackSize == 0) - { - inventory[1] = null; - } - } - } - } - - if (isBurning() && canSmelt()) - { - ++machineCookTime; - - if (machineCookTime == maxBurnTime) - { - machineCookTime = 0; - smeltItem(); - var2 = true; - } - } - else - { - machineCookTime = 0; - } - - if (var1 != machineBurnTime > 0) - { - var2 = true; - setActive(isBurning()); - } - } - - if (var2) - { - onInventoryChanged(); - } - } - - public boolean canSmelt() - { - if (inventory[0] == null) - { - return false; - } - - ItemStack itemstack = MachineRecipes.getOutput(inventory[0], false, recipes); - - if (itemstack == null) - { - return false; - } - - if (inventory[2] == null) - { - return true; - } - - if (!inventory[2].isItemEqual(itemstack)) - { - return false; - } - else - { - return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); - } - } - - public void smeltItem() - { - if (!canSmelt()) - { - return; - } - - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = MachineRecipes.getOutput(inventory[0], false, recipes).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = MachineRecipes.getOutput(inventory[0], true, recipes).copy(); - } - - if (inventory[0].stackSize <= 0) - { - inventory[0] = null; - } - - if (inventory[2] == null) - { - inventory[2] = itemstack; - } - else - { - inventory[2].stackSize += itemstack.stackSize; - } - } - - public static int getItemBurnTime(ItemStack par1ItemStack) - { - if (par1ItemStack == null) - { - return 0; - } - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; - if (var1 == Item.redstone.shiftedIndex) return 600; - } - return 0; - } - - public static boolean isItemFuel(ItemStack par0ItemStack) - { - return getItemBurnTime(par0ItemStack) > 0; - } + public List getRecipes() + { + return recipes; + } } diff --git a/src/common/net/uberkat/obsidian/common/TileEntityMachine.java b/src/common/net/uberkat/obsidian/common/TileEntityMachine.java index 1bd9635d6..d8f4154c4 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityMachine.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityMachine.java @@ -12,13 +12,14 @@ import cpw.mods.fml.server.FMLServerHandler; import net.minecraft.src.*; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; +import net.uberkat.obsidian.api.INetworkedMachine; public abstract class TileEntityMachine extends TileEntity implements IInventory, ISidedInventory, INetworkedMachine, IWrenchable { /** The ItemStacks that hold the items currently being used in the furnace */ protected ItemStack[] inventory = new ItemStack[3]; - /** The number of ticks that the furnace will keep burning */ + /** The number of ticks that this machine will keep running */ public int machineBurnTime = 0; /** The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for */ @@ -46,7 +47,7 @@ public abstract class TileEntityMachine extends TileEntity implements IInventory public int textureTick = 0; /** The amount of update ticks have passed since the game started */ - public byte updateTicks = 0; + public boolean hasInitialized; /** An integer that constantly cycles from 0 to 15. Used for animated textures. */ public int textureIndex = 0; @@ -91,13 +92,22 @@ public abstract class TileEntityMachine extends TileEntity implements IInventory public void updateEntity() { onUpdate(); - if(FMLCommonHandler.instance().getSidedDelegate().getSide().isClient()) + + if(worldObj.isRemote) { updateTextureTick(); } - updateTick(); - updatePacketTick(); + if(!worldObj.isRemote) + { + if(!hasInitialized) + { + //PacketHandler.sendMachinePacket(this); + hasInitialized = true; + } + + updatePacketTick(); + } if(machineCookTime == 0 || machineCookTime == maxBurnTime && currentItemBurnTime != 0) { @@ -110,25 +120,12 @@ public abstract class TileEntityMachine extends TileEntity implements IInventory */ public abstract void onUpdate(); - /** - * Synchronizes the client with the server on startup by sending two packets. - * Not exactly sure why it needs 5 packets, but it wouldn't work with only 4! - */ - public void updateTick() - { - if(updateTicks < 5) - { - PacketHandler.sendMachinePacket(this); - updateTicks++; - } - } - public void updatePacketTick() { if(packetTick % 100 == 0) { + //PacketHandler.sendMachinePacketWithRange(this, 50); packetTick++; - PacketHandler.sendMachinePacketWithRange(this, 50); } else { packetTick++; @@ -247,7 +244,7 @@ public abstract class TileEntityMachine extends TileEntity implements IInventory if(prevActive != active) { - PacketHandler.sendMachinePacket(this); + //PacketHandler.sendMachinePacket(this); } prevActive = active; @@ -257,7 +254,7 @@ public abstract class TileEntityMachine extends TileEntity implements IInventory { facing = direction; - PacketHandler.sendMachinePacket(this); + //PacketHandler.sendMachinePacket(this); } public void updateTexture(World world, int x, int y, int z) diff --git a/src/common/net/uberkat/obsidian/common/TileEntityPlatinumCompressor.java b/src/common/net/uberkat/obsidian/common/TileEntityPlatinumCompressor.java index 9b2d6d40f..2cabe971d 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityPlatinumCompressor.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityPlatinumCompressor.java @@ -11,161 +11,23 @@ import net.minecraft.src.*; import net.minecraftforge.common.ISidedInventory; import net.minecraftforge.common.ForgeDirection; -public class TileEntityPlatinumCompressor extends TileEntityMachine +public class TileEntityPlatinumCompressor extends TileEntityAdvancedElectricMachine { public static List recipes = new Vector(); public TileEntityPlatinumCompressor() { - super(200, "Platinum Compressor"); + super("Platinum Compressor", 5, 1, 200, 1000, 200); } - public void onUpdate() - { - boolean var1 = machineBurnTime > 0; - boolean var2 = false; + public List getRecipes() + { + return recipes; + } - if (machineBurnTime > 0) - { - --machineBurnTime; - } - - if (!worldObj.isRemote) - { - if (machineBurnTime == 0 && canSmelt()) - { - currentItemBurnTime = machineBurnTime = getItemBurnTime(inventory[1]); - - if (machineBurnTime > 0) - { - var2 = true; - - if (inventory[1] != null) - { - --inventory[1].stackSize; - - if (inventory[1].stackSize == 0) - { - inventory[1] = null; - } - } - } - } - - if (isBurning() && canSmelt()) - { - ++machineCookTime; - - if (machineCookTime == maxBurnTime) - { - machineCookTime = 0; - smeltItem(); - var2 = true; - } - } - else - { - machineCookTime = 0; - } - - if (var1 != machineBurnTime > 0) - { - var2 = true; - setActive(isBurning()); - } - } - - if (var2) - { - onInventoryChanged(); - } - } - - public boolean canSmelt() - { - if (inventory[0] == null) - { - return false; - } - - ItemStack itemstack = MachineRecipes.getOutput(inventory[0], false, recipes); - - if (itemstack == null) - { - return false; - } - - if (inventory[2] == null) - { - return true; - } - - if (!inventory[2].isItemEqual(itemstack)) - { - return false; - } - else - { - return inventory[2].stackSize + itemstack.stackSize <= inventory[2].getMaxStackSize(); - } - } - - public void smeltItem() - { - if (!canSmelt()) - { - return; - } - - ItemStack itemstack; - - if (inventory[0].getItem().hasContainerItem()) - { - itemstack = MachineRecipes.getOutput(inventory[0], false, recipes).copy(); - inventory[0] = new ItemStack(inventory[0].getItem().getContainerItem()); - } - else - { - itemstack = MachineRecipes.getOutput(inventory[0], true, recipes).copy(); - } - - if (inventory[0].stackSize <= 0) - { - inventory[0] = null; - } - - if (inventory[2] == null) - { - inventory[2] = itemstack; - } - else - { - inventory[2].stackSize += itemstack.stackSize; - } - } - - public static int getItemBurnTime(ItemStack par1ItemStack) - { - if (par1ItemStack == null) - { - return 0; - } - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; - if (var1 == ObsidianIngots.PlatinumIngot.shiftedIndex) return 200; - if (var1 == new ItemStack(ObsidianIngots.MultiBlock, 1, 1).itemID) return 1800; - } - return 0; - } - - public void getBurnTime() - { - currentItemBurnTime = getItemBurnTime(inventory[1]); - } - - public static boolean isItemFuel(ItemStack par0ItemStack) - { - return getItemBurnTime(par0ItemStack) > 0; - } + public int getFuelTicks(ItemStack itemstack) + { + if (itemstack.itemID == ObsidianIngots.PlatinumIngot.shiftedIndex) return 200; + return 0; + } } diff --git a/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java b/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java new file mode 100644 index 000000000..70678b232 --- /dev/null +++ b/src/common/net/uberkat/obsidian/common/TileEntityPowerUnit.java @@ -0,0 +1,563 @@ +package net.uberkat.obsidian.common; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import universalelectricity.UniversalElectricity; +import universalelectricity.electricity.ElectricInfo; +import universalelectricity.electricity.ElectricityManager; +import universalelectricity.implement.IConductor; +import universalelectricity.implement.IElectricityReceiver; +import universalelectricity.implement.IElectricityStorage; +import universalelectricity.implement.IItemElectric; +import universalelectricity.network.ConnectionHandler; +import universalelectricity.network.ConnectionHandler.ConnectionType; +import universalelectricity.network.ISimpleConnectionHandler; +import universalelectricity.prefab.TileEntityConductor; +import universalelectricity.prefab.TileEntityDisableable; +import universalelectricity.prefab.Vector3; + +import buildcraft.api.power.IPowerProvider; +import buildcraft.api.power.IPowerReceptor; +import buildcraft.api.power.PowerFramework; +import buildcraft.api.power.PowerProvider; +import buildcraft.api.core.Orientations; + +import com.google.common.io.ByteArrayDataInput; + +import ic2.api.Direction; +import ic2.api.ElectricItem; +import ic2.api.EnergyNet; +import ic2.api.IEnergySink; +import ic2.api.IEnergySource; +import ic2.api.IEnergyStorage; +import ic2.api.IWrenchable; +import ic2.api.IElectricItem; +import net.minecraft.src.*; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.ISidedInventory; +import net.uberkat.obsidian.api.IEnergizedItem; +import net.uberkat.obsidian.api.INetworkedMachine; + +public class TileEntityPowerUnit extends TileEntityDisableable implements IInventory, ISidedInventory, INetworkedMachine, IWrenchable, IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IElectricityStorage, IElectricityReceiver +{ + 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); + } + + /** + * A block used to store and transfer electricity. + * @param energy - maximum energy this block can hold. + * @param i - output per tick this block can handle. + */ + public TileEntityPowerUnit(int energy, int i) + { + ElectricityManager.instance.registerElectricUnit(this); + maxEnergy = energy; + output = i; + if(PowerFramework.currentFramework != null) + { + powerProvider = PowerFramework.currentFramework.createPowerProvider(); + powerProvider.configure(20, 25, 25, 25, maxEnergy/10); + } + } + + public Packet getDescriptionPacket() + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream output = new DataOutputStream(bytes); + + try { + output.writeInt(EnumPacketType.TILE_ENTITY.id); + output.writeInt(xCoord); + output.writeInt(yCoord); + output.writeInt(zCoord); + output.writeInt(facing); + output.writeInt(energyStored); + } 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; + + return packet; + } + + public void updateEntity() + { + if(!worldObj.isRemote) + { + if(packetTick == 5) + { + PacketHandler.sendPowerUnitPacket(this); + } + + if(packetTick % 100 == 0) + { + PacketHandler.sendPowerUnitPacketWithRange(this, 50); + packetTick++; + } + else { + 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)*100); + setEnergy(energyStored + received); + } + + if(inventory[0] != null && energyStored > 0) + { + if(inventory[0].getItem() instanceof IEnergizedItem) + { + IEnergizedItem item = (IEnergizedItem)inventory[0].getItem(); + int rejects = item.charge(inventory[0], item.getRate()); + setEnergy(energyStored - (item.getRate() - rejects)); + } + else if(inventory[0].getItem() instanceof IItemElectric) + { + IItemElectric item = (IItemElectric)inventory[0].getItem(); + int rejects = (int)(item.onReceiveElectricity(item.getTransferRate(), inventory[0])*UniversalElectricity.Wh_IC2_RATIO); + setEnergy(energyStored - ((int)(item.getTransferRate()*UniversalElectricity.Wh_IC2_RATIO) - rejects)); + } + else if(inventory[0].getItem() instanceof IElectricItem) + { + int sent = ElectricItem.charge(inventory[0], energyStored, 3, false, false); + setEnergy(energyStored - sent); + } + } + + if(inventory[1] != null && energyStored < maxEnergy) + { + if(inventory[1].getItem() instanceof IEnergizedItem) + { + IEnergizedItem item = (IEnergizedItem)inventory[1].getItem(); + int received = item.discharge(inventory[1], item.getRate()); + setEnergy(energyStored + received); + } + else if(inventory[1].getItem() instanceof IItemElectric) + { + IItemElectric item = (IItemElectric)inventory[1].getItem(); + int received = (int)(item.onUseElectricity(item.getTransferRate(), inventory[1])*UniversalElectricity.Wh_IC2_RATIO); + setEnergy(energyStored + received); + } + else if(inventory[1].getItem() instanceof IElectricItem) + { + IElectricItem item = (IElectricItem)inventory[1].getItem(); + if(item.canProvideEnergy()) + { + int gain = ElectricItem.discharge(inventory[1], energyStored, 3, false, false); + setEnergy(energyStored + gain); + } + } + else if(inventory[1].itemID == Item.redstone.shiftedIndex) + { + setEnergy(energyStored + 1000); + --inventory[1].stackSize; + + if (inventory[1].stackSize <= 0) + { + inventory[1] = null; + } + } + } + + 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(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); + } + + TileEntity connector = Vector3.getConnectorFromSide(worldObj, Vector3.get(this), ForgeDirection.getOrientation(facing)); + + if(connector != null && connector instanceof TileEntityConductor) + { + double wattsNeeded = ElectricityManager.instance.getElectricityRequired(((IConductor)connector).getConnectionID()); + double transferAmps = Math.max(Math.min(Math.min(ElectricInfo.getAmps(wattsNeeded, getVoltage()), ElectricInfo.getAmpsFromWattHours(energyStored*UniversalElectricity.IC2_RATIO, getVoltage()) ), 15), 0); + ElectricityManager.instance.produceElectricity(this, (IConductor)connector, transferAmps, getVoltage()); + setEnergy(energyStored - (int)(ElectricInfo.getWattHours(transferAmps, getVoltage())*UniversalElectricity.Wh_IC2_RATIO)); + } + } + worldObj.markBlockNeedsUpdate(xCoord, yCoord, zCoord); + } + + public void setEnergy(int energy) + { + energyStored = Math.max(Math.min(energy, maxEnergy), 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 par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + PowerFramework.currentFramework.loadPowerProvider(this, par1NBTTagCompound); + NBTTagList var2 = par1NBTTagCompound.getTagList("Items"); + inventory = new ItemStack[getSizeInventory()]; + + for (int var3 = 0; var3 < var2.tagCount(); ++var3) + { + NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3); + byte var5 = var4.getByte("Slot"); + + if (var5 >= 0 && var5 < inventory.length) + { + inventory[var5] = ItemStack.loadItemStackFromNBT(var4); + } + } + + energyStored = par1NBTTagCompound.getInteger("energyStored"); + facing = par1NBTTagCompound.getInteger("facing"); + } + + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + if(PowerFramework.currentFramework != null) + { + PowerFramework.currentFramework.savePowerProvider(this, par1NBTTagCompound); + } + par1NBTTagCompound.setInteger("energyStored", energyStored); + par1NBTTagCompound.setInteger("facing", facing); + NBTTagList var2 = new NBTTagList(); + + for (int var3 = 0; var3 < inventory.length; ++var3) + { + if (inventory[var3] != null) + { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + inventory[var3].writeToNBT(var4); + var2.appendTag(var4); + } + } + + par1NBTTagCompound.setTag("Items", var2); + } + + public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try { + facing = dataStream.readInt(); + energyStored = dataStream.readInt(); + worldObj.markBlockAsNeedsUpdate(xCoord, yCoord, zCoord); + } catch (Exception e) + { + System.out.println("[ObsidianIngots] Error while handling tile entity packet."); + e.printStackTrace(); + } + } + + 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; + } + + public int getCapacity() + { + return maxEnergy; + } + + public int getOutput() + { + return output; + } + + public boolean demandsEnergy() + { + return energyStored < maxEnergy; + } + + public int injectEnergy(Direction direction, int i) + { + int j = i; + + if (energyStored + i >= maxEnergy + output) + { + j = (maxEnergy + output) - energyStored - 1; + } + + energyStored += j; + return i - j; + } + + public boolean emitsEnergyTo(TileEntity receiver, Direction direction) + { + return direction.toForgeDirection() == ForgeDirection.getOrientation(facing); + } + + public int getMaxEnergyOutput() + { + return output; + } + + public double getWattHours(Object... data) + { + return energyStored*UniversalElectricity.IC2_RATIO; + } + + public void setWattHours(double wattHours, Object... data) + { + setEnergy((int)(wattHours*UniversalElectricity.Wh_IC2_RATIO)); + } + + public double getMaxWattHours() + { + return maxEnergy*UniversalElectricity.IC2_RATIO; + } + + public void setPowerProvider(IPowerProvider provider) + { + powerProvider = provider; + } + + public IPowerProvider getPowerProvider() + { + return powerProvider; + } + + public void doWork() {} + + public int powerRequest() + { + return getPowerProvider().getMaxEnergyReceived(); + } + + public boolean canConnect(ForgeDirection side) + { + return true; + } + + public double getVoltage() + { + return 120; + } + + 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; + } + + public void onReceive(TileEntity sender, double amps, double voltage, ForgeDirection side) + { + System.out.println("Received " + amps + " " + voltage); + setEnergy(energyStored + (int)(ElectricInfo.getWattHours(amps, voltage)*UniversalElectricity.Wh_IC2_RATIO)); + } + + public double wattRequest() + { + return ElectricInfo.getWatts(maxEnergy*UniversalElectricity.IC2_RATIO) - ElectricInfo.getWatts(energyStored*UniversalElectricity.IC2_RATIO); + } + + public boolean canReceiveFromSide(ForgeDirection side) + { + return side != ForgeDirection.getOrientation(facing); + } + + public boolean isUseableByPlayer(EntityPlayer var1) + { + return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : var1.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D; + } +} diff --git a/src/common/net/uberkat/obsidian/common/TileEntityTheoreticalElementizer.java b/src/common/net/uberkat/obsidian/common/TileEntityTheoreticalElementizer.java index 5da35acb7..2a294b5c5 100644 --- a/src/common/net/uberkat/obsidian/common/TileEntityTheoreticalElementizer.java +++ b/src/common/net/uberkat/obsidian/common/TileEntityTheoreticalElementizer.java @@ -11,132 +11,27 @@ import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly; import net.minecraft.src.*; -public class TileEntityTheoreticalElementizer extends TileEntityMachine +public class TileEntityTheoreticalElementizer extends TileEntityAdvancedElectricMachine { + public static List recipes = new Vector(); + public TileEntityTheoreticalElementizer() { - super(1000, "Theoretical Elementizer"); + super("Theoretical Elementizer", 50, 1, 1000, 10000, 1000); } - public void onUpdate() - { - boolean var1 = machineBurnTime > 0; - boolean var2 = false; + public List getRecipes() + { + return recipes; + } - if (machineBurnTime > 0) - { - --machineBurnTime; - } - - if (!worldObj.isRemote) - { - if (machineBurnTime == 0 && canSmelt()) - { - currentItemBurnTime = machineBurnTime = getItemBurnTime(inventory[1]); - - if (machineBurnTime > 0) - { - var2 = true; - - if (inventory[1] != null) - { - --inventory[1].stackSize; - - if (inventory[1].stackSize == 0) - { - inventory[1] = null; - } - } - } - } - - if (isBurning() && canSmelt()) - { - ++machineCookTime; - - if (machineCookTime == maxBurnTime) - { - machineCookTime = 0; - smeltItem(); - var2 = true; - } - } - else - { - machineCookTime = 0; - } - - if (var1 != machineBurnTime > 0) - { - var2 = true; - setActive(isBurning()); - } - } - - if (var2) - { - onInventoryChanged(); - } - } - - public boolean canSmelt() - { - if (inventory[0] == null) - { - return false; - } - else if(inventory[2] != null) - { - return false; - } - else - { - if (inventory[0].getItem().shiftedIndex != ObsidianIngots.EnrichedAlloy.shiftedIndex) return false; - if (inventory[2] == null) return true; - } - return false; - } - - public void smeltItem() - { - if (canSmelt()) - { - ItemStack itemstack = new ItemStack(getRandomMagicItem(), 1); - - if (inventory[2] == null) - { - inventory[2] = itemstack.copy(); - } - - --inventory[0].stackSize; - - if (inventory[0].stackSize <= 0) - { - inventory[0] = null; - } - } - } - - public static int getItemBurnTime(ItemStack par1ItemStack) - { - if (par1ItemStack == null) - { - return 0; - } - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; - if (var1 == Item.diamond.shiftedIndex) return 1000; - } - return 0; - } - - public static boolean isItemFuel(ItemStack par0ItemStack) - { - return getItemBurnTime(par0ItemStack) > 0; - } - - public Item getRandomMagicItem() + public int getFuelTicks(ItemStack itemstack) + { + if (itemstack.itemID == Item.diamond.shiftedIndex) return 1000; + return 0; + } + + public static Item getRandomMagicItem() { Random rand = new Random(); int random = rand.nextInt(3); diff --git a/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java b/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java index 5a44bd44e..da5b95b9d 100644 --- a/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java +++ b/src/minecraft/net/uberkat/obsidian/client/ClientProxy.java @@ -22,7 +22,6 @@ import net.minecraft.src.RenderBlocks; import net.minecraft.src.World; import net.minecraftforge.client.MinecraftForgeClient; import net.uberkat.obsidian.common.CommonProxy; -import net.uberkat.obsidian.common.ContainerTheoreticalElementizer; import net.uberkat.obsidian.common.EntityKnife; import net.uberkat.obsidian.common.EntityObsidianArrow; import net.uberkat.obsidian.common.EntityObsidianTNT; @@ -32,6 +31,7 @@ import net.uberkat.obsidian.common.TileEntityCombiner; import net.uberkat.obsidian.common.TileEntityCrusher; import net.uberkat.obsidian.common.TileEntityEnrichmentChamber; import net.uberkat.obsidian.common.TileEntityPlatinumCompressor; +import net.uberkat.obsidian.common.TileEntityPowerUnit; import net.uberkat.obsidian.common.TileEntityTheoreticalElementizer; /** @@ -100,6 +100,9 @@ public class ClientProxy extends CommonProxy case 7: TileEntityTheoreticalElementizer tileentity4 = (TileEntityTheoreticalElementizer)world.getBlockTileEntity(x, y, z); return new GuiTheoreticalElementizer(player.inventory, tileentity4); + case 8: + TileEntityPowerUnit tileentity5 = (TileEntityPowerUnit)world.getBlockTileEntity(x, y, z); + return new GuiPowerUnit(player.inventory, tileentity5); } return null; } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiCombiner.java b/src/minecraft/net/uberkat/obsidian/client/GuiCombiner.java index 8a6efeff6..d8051ce13 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiCombiner.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiCombiner.java @@ -2,7 +2,7 @@ package net.uberkat.obsidian.client; import org.lwjgl.opengl.GL11; import net.minecraft.src.*; -import net.uberkat.obsidian.common.ContainerCombiner; +import net.uberkat.obsidian.common.ContainerAdvancedElectricMachine; import net.uberkat.obsidian.common.TileEntityCombiner; public class GuiCombiner extends GuiContainer @@ -11,7 +11,7 @@ public class GuiCombiner extends GuiContainer public GuiCombiner(InventoryPlayer par1InventoryPlayer, TileEntityCombiner par2TileEntityCombiner) { - super(new ContainerCombiner(par1InventoryPlayer, par2TileEntityCombiner)); + super(new ContainerAdvancedElectricMachine(par1InventoryPlayer, par2TileEntityCombiner)); machineInventory = par2TileEntityCombiner; } @@ -29,21 +29,18 @@ public class GuiCombiner extends GuiContainer */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { - int var4 = this.mc.renderEngine.getTexture("/gui/GuiCombiner.png"); + int var4 = mc.renderEngine.getTexture("/gui/GuiCombiner.png"); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture(var4); - int var5 = (this.width - this.xSize) / 2; - int var6 = (this.height - this.ySize) / 2; - drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); + int var5 = (width - xSize) / 2; + int var6 = (height - ySize) / 2; + drawTexturedModalRect(var5, var6, 0, 0, xSize, ySize); int var7; + + var7 = machineInventory.getScaledChargeLevel(12); + drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - if (this.machineInventory.isBurning()) - { - var7 = this.machineInventory.getBurnTimeRemainingScaled(12); - this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - } - - var7 = this.machineInventory.getCookProgressScaled(24); - this.drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); + var7 = machineInventory.getScaledProgress(24); + drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiCredits.java b/src/minecraft/net/uberkat/obsidian/client/GuiCredits.java index 0baa26271..f00811653 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiCredits.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiCredits.java @@ -32,7 +32,7 @@ public class GuiCredits extends GuiScreen { public static void onErrorDownloading() { - updateProgress = "¤4Error updating."; + updateProgress = "Error updating."; } protected void actionPerformed(GuiButton guibutton) @@ -67,13 +67,13 @@ public class GuiCredits extends GuiScreen { public void drawScreen(int i, int j, float f) { drawDefaultBackground(); - drawCenteredString(fontRenderer, "¤1Obsidian Ingots ¤7by aidancbrady", width / 2, (height / 4 - 60) + 20, 0xffffff); - writeText("¤7Your version: " + (ObsidianUtils.isClientLatestVersion() ? ObsidianIngots.versionNumber.toString() : "¤4" + ObsidianIngots.versionNumber.toString()) + "¤7 -- OUTDATED", 36); - writeText("¤7Newest version: " + ObsidianIngots.latestVersionNumber, 45); - writeText("¤7*Developed on Mac OS X 10.8 Mountain Lion", 63); - writeText("¤7*Code, textures, and ideas by aidancbrady", 72); - writeText("¤7Recent news: ¤1" + ObsidianIngots.recentNews, 81); - writeText("¤7" + updateProgress, 99); + drawCenteredString(fontRenderer, "Obsidian Ingots by aidancbrady", width / 2, (height / 4 - 60) + 20, 0xffffff); + writeText("Your version: " + (ObsidianUtils.isClientLatestVersion() ? ObsidianIngots.versionNumber.toString() : ObsidianIngots.versionNumber.toString()) + " -- OUTDATED", 36); + writeText("Newest version: " + ObsidianIngots.latestVersionNumber, 45); + writeText("*Developed on Mac OS X 10.8 Mountain Lion", 63); + writeText("*Code, textures, and ideas by aidancbrady", 72); + writeText("Recent news: " + ObsidianIngots.recentNews, 81); + writeText(updateProgress, 99); super.drawScreen(i, j, f); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiCrusher.java b/src/minecraft/net/uberkat/obsidian/client/GuiCrusher.java index 585d963d6..7d79d7ff7 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiCrusher.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiCrusher.java @@ -2,7 +2,7 @@ package net.uberkat.obsidian.client; import org.lwjgl.opengl.GL11; import net.minecraft.src.*; -import net.uberkat.obsidian.common.ContainerCrusher; +import net.uberkat.obsidian.common.ContainerElectricMachine; import net.uberkat.obsidian.common.TileEntityCrusher; public class GuiCrusher extends GuiContainer @@ -11,7 +11,7 @@ public class GuiCrusher extends GuiContainer public GuiCrusher(InventoryPlayer par1InventoryPlayer, TileEntityCrusher par2TileEntityCrusher) { - super(new ContainerCrusher(par1InventoryPlayer, par2TileEntityCrusher)); + super(new ContainerElectricMachine(par1InventoryPlayer, par2TileEntityCrusher)); machineInventory = par2TileEntityCrusher; } @@ -29,21 +29,18 @@ public class GuiCrusher extends GuiContainer */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { - int var4 = this.mc.renderEngine.getTexture("/gui/GuiCrusher.png"); + int var4 = mc.renderEngine.getTexture("/gui/GuiCrusher.png"); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture(var4); - int var5 = (this.width - this.xSize) / 2; - int var6 = (this.height - this.ySize) / 2; - drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); + int var5 = (width - xSize) / 2; + int var6 = (height - ySize) / 2; + drawTexturedModalRect(var5, var6, 0, 0, xSize, ySize); int var7; + + var7 = machineInventory.getScaledChargeLevel(12); + drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - if (this.machineInventory.isBurning()) - { - var7 = this.machineInventory.getBurnTimeRemainingScaled(12); - this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - } - - var7 = this.machineInventory.getCookProgressScaled(24); - this.drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); + var7 = machineInventory.getScaledProgress(24); + drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiEnrichmentChamber.java b/src/minecraft/net/uberkat/obsidian/client/GuiEnrichmentChamber.java index 21ed1260b..5e6407e5a 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiEnrichmentChamber.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiEnrichmentChamber.java @@ -2,7 +2,7 @@ package net.uberkat.obsidian.client; import org.lwjgl.opengl.GL11; import net.minecraft.src.*; -import net.uberkat.obsidian.common.ContainerEnrichmentChamber; +import net.uberkat.obsidian.common.ContainerElectricMachine; import net.uberkat.obsidian.common.TileEntityEnrichmentChamber; public class GuiEnrichmentChamber extends GuiContainer @@ -11,7 +11,7 @@ public class GuiEnrichmentChamber extends GuiContainer public GuiEnrichmentChamber(InventoryPlayer par1InventoryPlayer, TileEntityEnrichmentChamber par2TileEntityEnrichmentChamber) { - super(new ContainerEnrichmentChamber(par1InventoryPlayer, par2TileEntityEnrichmentChamber)); + super(new ContainerElectricMachine(par1InventoryPlayer, par2TileEntityEnrichmentChamber)); machineInventory = par2TileEntityEnrichmentChamber; } @@ -29,21 +29,18 @@ public class GuiEnrichmentChamber extends GuiContainer */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { - int var4 = this.mc.renderEngine.getTexture("/gui/GuiChamber.png"); + int var4 = mc.renderEngine.getTexture("/gui/GuiChamber.png"); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.renderEngine.bindTexture(var4); - int var5 = (this.width - this.xSize) / 2; - int var6 = (this.height - this.ySize) / 2; - drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); + int var5 = (width - xSize) / 2; + int var6 = (height - ySize) / 2; + drawTexturedModalRect(var5, var6, 0, 0, xSize, ySize); int var7; - if (this.machineInventory.isBurning()) - { - var7 = this.machineInventory.getBurnTimeRemainingScaled(12); - this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - } + var7 = machineInventory.getScaledChargeLevel(12); + drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - var7 = this.machineInventory.getCookProgressScaled(24); - this.drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); + var7 = machineInventory.getScaledProgress(24); + drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiPlatinumCompressor.java b/src/minecraft/net/uberkat/obsidian/client/GuiPlatinumCompressor.java index 9b20b8b2a..ba20782e8 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiPlatinumCompressor.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiPlatinumCompressor.java @@ -2,7 +2,7 @@ package net.uberkat.obsidian.client; import org.lwjgl.opengl.GL11; import net.minecraft.src.*; -import net.uberkat.obsidian.common.ContainerPlatinumCompressor; +import net.uberkat.obsidian.common.ContainerAdvancedElectricMachine; import net.uberkat.obsidian.common.TileEntityPlatinumCompressor; public class GuiPlatinumCompressor extends GuiContainer @@ -11,7 +11,7 @@ public class GuiPlatinumCompressor extends GuiContainer public GuiPlatinumCompressor(InventoryPlayer par1InventoryPlayer, TileEntityPlatinumCompressor par2TileEntityPlatinumCompressor) { - super(new ContainerPlatinumCompressor(par1InventoryPlayer, par2TileEntityPlatinumCompressor)); + super(new ContainerAdvancedElectricMachine(par1InventoryPlayer, par2TileEntityPlatinumCompressor)); machineInventory = par2TileEntityPlatinumCompressor; } @@ -36,14 +36,11 @@ public class GuiPlatinumCompressor extends GuiContainer int var6 = (this.height - this.ySize) / 2; drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); int var7; + + var7 = this.machineInventory.getScaledChargeLevel(12); + this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - if (this.machineInventory.isBurning()) - { - var7 = this.machineInventory.getBurnTimeRemainingScaled(12); - this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - } - - var7 = this.machineInventory.getCookProgressScaled(24); + var7 = this.machineInventory.getScaledProgress(24); this.drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); } } diff --git a/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java b/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java new file mode 100644 index 000000000..4178379c2 --- /dev/null +++ b/src/minecraft/net/uberkat/obsidian/client/GuiPowerUnit.java @@ -0,0 +1,45 @@ +package net.uberkat.obsidian.client; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.src.*; +import net.uberkat.obsidian.common.ContainerPowerUnit; +import net.uberkat.obsidian.common.ObsidianUtils; +import net.uberkat.obsidian.common.TileEntityPowerUnit; + +public class GuiPowerUnit extends GuiContainer +{ + private TileEntityPowerUnit tileEntity; + + private int guiWidth; + private int guiHeight; + + public GuiPowerUnit(InventoryPlayer inventory, TileEntityPowerUnit unit) + { + super(new ContainerPowerUnit(inventory, unit)); + tileEntity = unit; + } + + protected void drawGuiContainerForegroundLayer() + { + String capacityInfo = "Stored: " + ObsidianUtils.getDisplayedEnergy(tileEntity.energyStored) + "/" + ObsidianUtils.getDisplayedEnergy(tileEntity.maxEnergy); + String outputInfo = "Output: " + ObsidianUtils.getDisplayedEnergy(tileEntity.output) + "/t"; + fontRenderer.drawString(tileEntity.getInvName(), 43, 6, 0x404040); + fontRenderer.drawString(capacityInfo, 45, 42, 0x404040); + fontRenderer.drawString(outputInfo, 45, 52, 0x404040); + fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 0x404040); + } + + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + int var4 = mc.renderEngine.getTexture("/gui/GuiPowerUnit.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.renderEngine.bindTexture(var4); + + guiWidth = (width - xSize) / 2; + guiHeight = (height - ySize) / 2; + drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + int scale = (int)(((double)tileEntity.energyStored / tileEntity.maxEnergy) * 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 6d82c687a..683ac0d06 100644 --- a/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java +++ b/src/minecraft/net/uberkat/obsidian/client/GuiTheoreticalElementizer.java @@ -2,7 +2,8 @@ package net.uberkat.obsidian.client; import org.lwjgl.opengl.GL11; import net.minecraft.src.*; -import net.uberkat.obsidian.common.ContainerTheoreticalElementizer; +import net.uberkat.obsidian.common.ContainerAdvancedElectricMachine; +import net.uberkat.obsidian.common.ObsidianUtils; import net.uberkat.obsidian.common.TileEntityTheoreticalElementizer; public class GuiTheoreticalElementizer extends GuiContainer @@ -11,7 +12,7 @@ public class GuiTheoreticalElementizer extends GuiContainer public GuiTheoreticalElementizer(InventoryPlayer par1InventoryPlayer, TileEntityTheoreticalElementizer par2TileEntityTheoreticalElementizer) { - super(new ContainerTheoreticalElementizer(par1InventoryPlayer, par2TileEntityTheoreticalElementizer)); + super(new ContainerAdvancedElectricMachine(par1InventoryPlayer, par2TileEntityTheoreticalElementizer)); machineInventory = par2TileEntityTheoreticalElementizer; } @@ -23,12 +24,12 @@ public class GuiTheoreticalElementizer extends GuiContainer String displayText = ""; fontRenderer.drawString("Theoretical Elementizer", 32, 6, 0x404040); fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040); - if(machineInventory.machineBurnTime > 0) + if(machineInventory.isActive) { - displayText = "Status: " + Integer.toString(machineInventory.machineCookTime/10) + "%"; + displayText = "Status: " + Integer.toString(machineInventory.operatingTicks/10) + "%"; } else { - displayText = "Status: ¤4Off"; + displayText = "Status: Off"; } fontRenderer.drawString(displayText, 80, 60, 0x404040); } @@ -45,14 +46,11 @@ public class GuiTheoreticalElementizer extends GuiContainer int var6 = (this.height - this.ySize) / 2; drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); int var7; + + var7 = this.machineInventory.getScaledChargeLevel(12); + this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - if (this.machineInventory.isBurning()) - { - var7 = this.machineInventory.getBurnTimeRemainingScaled(12); - this.drawTexturedModalRect(var5 + 56, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2); - } - - var7 = this.machineInventory.getCookProgressScaled(24); + var7 = this.machineInventory.getScaledProgress(24); this.drawTexturedModalRect(var5 + 79, var6 + 34, 176, 14, var7 + 1, 16); } }