diff --git a/modversion.txt b/modversion.txt index 7693c96bf..446ba66e7 100644 --- a/modversion.txt +++ b/modversion.txt @@ -1 +1 @@ -0.1.3 \ No newline at end of file +0.1.4 \ No newline at end of file diff --git a/publish.bat b/publish.bat index 678c54778..5c9ceaa8b 100644 --- a/publish.bat +++ b/publish.bat @@ -39,6 +39,7 @@ echo open www.calclavia.com>ftpscript.txt echo al@calclavia.com>>ftpscript.txt echo VkE4laBa84R9>>ftpscript.txt echo binary>>ftpscript.txt +echo put "modversion.txt">>ftpscript.txt echo put "builds\%FILE_NAME%">>ftpscript.txt echo put "builds\%API_NAME%">>ftpscript.txt echo put info.txt>>ftpscript.txt diff --git a/resources/mcmod.info b/resources/mcmod.info index 0d038da52..1c6eea5b8 100644 --- a/resources/mcmod.info +++ b/resources/mcmod.info @@ -2,7 +2,7 @@ { "modid" : "AssemblyLine", "name" : "Assembly Line", - "version" : "0.1.3", + "version" : "0.1.4", "url" : "http://calclavia.com/universalelectricity/?m=18", "credits" : "", "authors": [ diff --git a/src/common/assemblyline/AssemblyLine.java b/src/common/assemblyline/AssemblyLine.java index e43bce560..494f7e949 100644 --- a/src/common/assemblyline/AssemblyLine.java +++ b/src/common/assemblyline/AssemblyLine.java @@ -8,9 +8,9 @@ import net.minecraft.src.ItemStack; import net.minecraftforge.common.Configuration; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; -import universalelectricity.core.UEConfig; import universalelectricity.core.UniversalElectricity; import universalelectricity.prefab.UETab; +import universalelectricity.prefab.UpdateNotifier; import universalelectricity.prefab.network.PacketManager; import assemblyline.machine.BlockArchitectTable; import assemblyline.machine.BlockMulti; @@ -33,18 +33,19 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; -@Mod(modid = "AssemblyLine", name = "Assembly Line", version = AssemblyLine.VERSION, dependencies = "after:BasicComponents") -@NetworkMod(channels = -{ AssemblyLine.CHANNEL }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketManager.class) +@Mod(modid = AssemblyLine.CHANNEL, name = AssemblyLine.NAME, version = AssemblyLine.VERSION, dependencies = "after:BasicComponents") +@NetworkMod(channels = { AssemblyLine.CHANNEL }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketManager.class) public class AssemblyLine { @SidedProxy(clientSide = "assemblyline.ALClientProxy", serverSide = "assemblyline.ALCommonProxy") public static ALCommonProxy proxy; - @Instance("AssemblyLine") + @Instance(AssemblyLine.CHANNEL) public static AssemblyLine instance; - public static final String VERSION = "0.1.3"; + public static final String NAME = "Assembly Line"; + + public static final String VERSION = "0.1.4"; public static final String CHANNEL = "AssemblyLine"; @@ -52,20 +53,30 @@ public class AssemblyLine public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "UniversalElectricity/AssemblyLine.cfg")); - public static final int BLOCK_ID_PREFIX = 3020; - public static final Block blockConveyorBelt = new BlockConveyorBelt(UEConfig.getBlockConfigID(CONFIGURATION, "Conveyor Belt", BLOCK_ID_PREFIX)); - public static final Block blockInteraction = new BlockMulti(UEConfig.getBlockConfigID(CONFIGURATION, "Machine", BLOCK_ID_PREFIX + 1)); - public static final Block blockArchitectTable = new BlockArchitectTable(UEConfig.getBlockConfigID(CONFIGURATION, "Architect's Table", BLOCK_ID_PREFIX + 2)); + public static final int BLOCK_ID_PREFIX = 3030; + public static Block blockConveyorBelt; + public static Block blockInteraction; + public static Block blockArchitectTable; @PreInit public void preInit(FMLPreInitializationEvent event) { UniversalElectricity.register(this, 1, 1, 3, false); instance = this; + + CONFIGURATION.load(); + blockConveyorBelt = new BlockConveyorBelt(CONFIGURATION.getBlock("Conveyor Belt", BLOCK_ID_PREFIX).getInt()); + blockInteraction = new BlockMulti(CONFIGURATION.getBlock("Machine", BLOCK_ID_PREFIX + 1).getInt()); + blockArchitectTable = new BlockArchitectTable(CONFIGURATION.getBlock("Architect's Table", BLOCK_ID_PREFIX + 2).getInt()); + CONFIGURATION.save(); + NetworkRegistry.instance().registerGuiHandler(this, this.proxy); GameRegistry.registerBlock(blockConveyorBelt); GameRegistry.registerBlock(blockArchitectTable); GameRegistry.registerBlock(blockInteraction, ItemBlockMulti.class); + + UpdateNotifier.INSTANCE.checkUpdate(NAME, VERSION, "http://calclavia.com/downloads/al/modversion.txt"); + proxy.preInit(); } @@ -74,6 +85,8 @@ public class AssemblyLine { proxy.init(); + //TODO Load language files and use those for block naming + GameRegistry.registerTileEntity(TileEntityConveyorBelt.class, "ConveyorBelt"); GameRegistry.registerTileEntity(TileEntityRejector.class, "Sorter"); GameRegistry.registerTileEntity(TileEntityManipulator.class, "Manipulator"); @@ -88,16 +101,13 @@ public class AssemblyLine } // Conveyor Belt - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockConveyorBelt, 2), new Object[] - { "III", "WMW", 'I', "ingotSteel", 'W', Block.wood, 'M', "motor" })); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockConveyorBelt, 2), new Object[] { "III", "WMW", 'I', "ingotSteel", 'W', Block.wood, 'M', "motor" })); // Rejector - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockInteraction, 1, MachineType.SORTER.metadata), new Object[] - { "WPW", "@R@", '@', "plateSteel", 'R', Item.redstone, 'P', Block.pistonBase, 'C', "basicCircuit", 'W', "copperWire" })); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockInteraction, 1, MachineType.SORTER.metadata), new Object[] { "WPW", "@R@", '@', "plateSteel", 'R', Item.redstone, 'P', Block.pistonBase, 'C', "basicCircuit", 'W', "copperWire" })); // Retriever - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(blockInteraction, 1, MachineType.MANIPULATOR.metadata), new Object[] - { Block.dispenser, "basicCircuit" })); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(blockInteraction, 1, MachineType.MANIPULATOR.metadata), new Object[] { Block.dispenser, "basicCircuit" })); UETab.setItemStack(new ItemStack(blockConveyorBelt)); } diff --git a/src/common/assemblyline/ai/TaskManager.java b/src/common/assemblyline/ai/TaskManager.java index fa43020f6..af5c7add2 100644 --- a/src/common/assemblyline/ai/TaskManager.java +++ b/src/common/assemblyline/ai/TaskManager.java @@ -51,4 +51,9 @@ public class TaskManager task.onTaskStart(); tasks.add(task); } + + public boolean hasTask() + { + return this.tasks.size() > 0; + } } diff --git a/src/common/assemblyline/machine/BlockMulti.java b/src/common/assemblyline/machine/BlockMulti.java index 7077f12ba..de921eb1b 100644 --- a/src/common/assemblyline/machine/BlockMulti.java +++ b/src/common/assemblyline/machine/BlockMulti.java @@ -64,8 +64,7 @@ public class BlockMulti extends BlockMachine } /** - * @param currentDirection - * - An integer from 0 to 4. + * @param currentDirection - An integer from 0 to 4. * @return The metadata this block should change into. */ public int getNextDirectionMeta(int currentDirection) @@ -110,7 +109,7 @@ public class BlockMulti extends BlockMachine } @Override - public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { if (!par1World.isRemote) { @@ -149,7 +148,7 @@ public class BlockMulti extends BlockMachine } @Override - public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { int metadata = par1World.getBlockMetadata(x, y, z); MachineType machineType = MachineType.get(metadata); @@ -158,7 +157,7 @@ public class BlockMulti extends BlockMachine } @Override - public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { int metadata = par1World.getBlockMetadata(x, y, z); @@ -175,7 +174,7 @@ public class BlockMulti extends BlockMachine } else { - return this.onUseWrench(par1World, x, y, z, par5EntityPlayer); + return this.onUseWrench(par1World, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } } diff --git a/src/common/assemblyline/machine/TileEntityManipulator.java b/src/common/assemblyline/machine/TileEntityManipulator.java index a189b730a..68aeced19 100644 --- a/src/common/assemblyline/machine/TileEntityManipulator.java +++ b/src/common/assemblyline/machine/TileEntityManipulator.java @@ -16,6 +16,7 @@ import net.minecraft.src.TileEntityChest; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ISidedInventory; import universalelectricity.core.electricity.ElectricInfo; +import universalelectricity.core.implement.IConductor; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.implement.IRedstoneReceptor; import universalelectricity.prefab.network.IPacketReceiver; @@ -32,7 +33,7 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme /** * Joules required to run this thing. */ - public static final int JOULES_REQUIRED = 15; + public static final int WATT_REQUEST = 15; /** * The amount of watts received. @@ -46,12 +47,6 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme private boolean isPowered = false; - @Override - public double wattRequest() - { - return JOULES_REQUIRED; - } - @Override public void updateEntity() { @@ -59,7 +54,34 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme if (!this.worldObj.isRemote) { - if (!this.isDisabled() && this.wattsReceived >= this.JOULES_REQUIRED) + for (int i = 0; i < 6; i++) + { + ForgeDirection inputDirection = ForgeDirection.getOrientation(i); + + TileEntity inputTile = Vector3.getTileEntityFromSide(this.worldObj, Vector3.get(this), inputDirection); + + if (inputTile != null) + { + if (inputTile instanceof IConductor) + { + if (this.wattsReceived >= this.WATT_REQUEST) + { + ((IConductor) inputTile).getNetwork().stopRequesting(this); + } + else + { + ((IConductor) inputTile).getNetwork().startRequesting(this, this.WATT_REQUEST / this.getVoltage(), this.getVoltage()); + this.wattsReceived += ((IConductor) inputTile).getNetwork().consumeElectricity(this).getWatts(); + } + } + } + + } + } + + if (!this.worldObj.isRemote) + { + if (!this.isDisabled() && this.wattsReceived >= this.WATT_REQUEST) { if (!this.isOutput) { @@ -186,8 +208,7 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme */ if (tileEntity instanceof TileEntityChest) { - TileEntityChest[] chests = - { (TileEntityChest) tileEntity, null }; + TileEntityChest[] chests = { (TileEntityChest) tileEntity, null }; /** * Try to find a double chest. @@ -290,8 +311,7 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme */ if (tileEntity instanceof TileEntityChest) { - TileEntityChest[] chests = - { (TileEntityChest) tileEntity, null }; + TileEntityChest[] chests = { (TileEntityChest) tileEntity, null }; /** * Try to find a double chest. @@ -378,18 +398,6 @@ public class TileEntityManipulator extends TileEntityElectricityReceiver impleme return PacketManager.getPacket(AssemblyLine.CHANNEL, this, this.isOutput); } - @Override - public boolean canReceiveFromSide(ForgeDirection side) - { - return true; - } - - @Override - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side) - { - this.wattsReceived += ElectricInfo.getWatts(amps, voltage); - } - @Override public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/common/assemblyline/machine/TileEntityRejector.java b/src/common/assemblyline/machine/TileEntityRejector.java index dd2bf0fe5..bb04918f5 100644 --- a/src/common/assemblyline/machine/TileEntityRejector.java +++ b/src/common/assemblyline/machine/TileEntityRejector.java @@ -1,5 +1,6 @@ package assemblyline.machine; +import java.util.EnumSet; import java.util.List; import net.minecraft.src.AxisAlignedBB; @@ -15,6 +16,8 @@ import net.minecraft.src.Packet; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.TileEntity; import net.minecraftforge.common.ForgeDirection; +import universalelectricity.core.electricity.ElectricityConnections; +import universalelectricity.core.implement.IConductor; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.network.IPacketReceiver; import universalelectricity.prefab.network.PacketManager; @@ -44,7 +47,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements /** * Joules required per tick. */ - public static final int JOULES_REQUIRED = 10; + public static final int WATT_REQUEST = 10; /** * Stored energy @@ -57,8 +60,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements /** * on/off value for the GUI buttons */ - public boolean[] guiButtons = new boolean[] - { true, true, true, true, true }; + public boolean[] guiButtons = new boolean[] { true, true, true, true, true }; /** * the belt found in the search area */ @@ -71,6 +73,33 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements { super.updateEntity(); + if (!this.worldObj.isRemote) + { + for (int i = 0; i < 6; i++) + { + ForgeDirection inputDirection = ForgeDirection.getOrientation(i); + + TileEntity inputTile = Vector3.getTileEntityFromSide(this.worldObj, Vector3.get(this), inputDirection); + + if (inputTile != null) + { + if (inputTile instanceof IConductor) + { + if (this.wattsReceived >= this.WATT_REQUEST) + { + ((IConductor) inputTile).getNetwork().stopRequesting(this); + } + else + { + ((IConductor) inputTile).getNetwork().startRequesting(this, this.WATT_REQUEST / this.getVoltage(), this.getVoltage()); + this.wattsReceived += ((IConductor) inputTile).getNetwork().consumeElectricity(this).getWatts(); + } + } + } + + } + } + /** * Has to update a bit faster than a conveyer belt */ @@ -104,7 +133,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements boolean flag = false; - if (itemsBehind.size() > 0 && this.wattsReceived > this.JOULES_REQUIRED) + if (itemsBehind.size() > 0 && this.wattsReceived > this.WATT_REQUEST) { // for every item found check // if can be thrown then throw @@ -143,10 +172,8 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements /** * Used to move after it has been rejected * - * @param side - * - used to do the offset - * @param entity - * - Entity being thrown + * @param side - used to do the offset + * @param entity - Entity being thrown */ public void throwItem(ForgeDirection side, Entity entity) { @@ -159,12 +186,12 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements entity.motionX = (double) side.offsetX * 0.15; entity.motionY += 0.10000000298023224D; entity.motionZ = (double) side.offsetZ * 0.15; - this.wattsReceived -= this.JOULES_REQUIRED; + this.wattsReceived -= this.WATT_REQUEST; } public boolean canItemBeThrow(Entity entity) { - // TODO add other things than items + // TODO Add other things than items if (entity instanceof EntityItem) { EntityItem itemE = (EntityItem) entity; @@ -172,7 +199,6 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements if (this.guiButtons[4]) { - // reject matching items for (int i = 0; i < this.containingItems.length; i++) { @@ -217,12 +243,6 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements return 0; } - @Override - public boolean canReceiveFromSide(ForgeDirection side) - { - return side == ForgeDirection.DOWN; - } - /** * Used to change any one of the boolean value of on/off array After changing the value if it * was changed client side it will send a packet server side with the changes @@ -240,8 +260,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements { this.guiButtons[i] = true; } - Packet packet = PacketManager.getPacket("asmLine", this, new Object[] - { PacketTypes.SETTINGON.ordinal(), i }); + Packet packet = PacketManager.getPacket("asmLine", this, new Object[] { PacketTypes.SETTINGON.ordinal(), i }); if (worldObj.isRemote) { PacketDispatcher.sendPacketToServer(packet); @@ -254,8 +273,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements public Object[] data(PacketTypes id) { - if (id == PacketTypes.ANIMATION) { return new Object[] - { id.ordinal(), this.firePiston }; } + if (id == PacketTypes.ANIMATION) { return new Object[] { id.ordinal(), this.firePiston }; } if (id == PacketTypes.GUI) { Object[] da = new Object[this.guiButtons.length]; @@ -266,8 +284,7 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements } return da; } - return new Object[] - { id.ordinal() }; + return new Object[] { id.ordinal() }; } @Override @@ -317,12 +334,6 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements return 4; } - @Override - public boolean canConnect(ForgeDirection side) - { - return true; - } - /** * UE methods */ @@ -332,19 +343,6 @@ public class TileEntityRejector extends TileEntityElectricityReceiver implements return 120; } - @Override - public double wattRequest() - { - return JOULES_REQUIRED; - } - - @Override - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side) - { - this.wattsReceived += (amps * voltage); - - } - /** * Inventory functions. */ diff --git a/src/common/assemblyline/machine/TileEntityRoboticSorter.java b/src/common/assemblyline/machine/TileEntityRoboticSorter.java index cacabac9d..e4b92562e 100644 --- a/src/common/assemblyline/machine/TileEntityRoboticSorter.java +++ b/src/common/assemblyline/machine/TileEntityRoboticSorter.java @@ -7,7 +7,6 @@ import net.minecraft.src.ItemStack; import net.minecraft.src.NBTTagCompound; import net.minecraft.src.NBTTagList; import net.minecraft.src.Packet250CustomPayload; -import net.minecraftforge.common.ForgeDirection; import universalelectricity.prefab.network.IPacketReceiver; import universalelectricity.prefab.tile.TileEntityElectricityReceiver; import assemblyline.machine.belt.TileEntityConveyorBelt; @@ -32,7 +31,7 @@ public class TileEntityRoboticSorter extends TileEntityElectricityReceiver imple /** * Joules required per tick. */ - public static final int JOULES_REQUIRED = 10; + public static final int WATT_REQUEST = 10; /** * Stored energy @@ -41,8 +40,7 @@ public class TileEntityRoboticSorter extends TileEntityElectricityReceiver imple /** * on/off value for the GUI buttons */ - public boolean[] guiButtons = new boolean[] - { true, true, true, true, true }; + public boolean[] guiButtons = new boolean[] { true, true, true, true, true }; /** * the belt found in the search area */ @@ -62,34 +60,12 @@ public class TileEntityRoboticSorter extends TileEntityElectricityReceiver imple return 4; } - @Override - public boolean canConnect(ForgeDirection side) - { - return true; - } - - /** - * UE methods - */ @Override public double getVoltage() { return 120; } - @Override - public double wattRequest() - { - return JOULES_REQUIRED; - } - - @Override - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side) - { - this.wattsReceived += (amps * voltage); - - } - /** * Inventory functions. */ @@ -241,12 +217,4 @@ public class TileEntityRoboticSorter extends TileEntityElectricityReceiver imple { return 1; } - - @Override - public boolean canReceiveFromSide(ForgeDirection side) - { - // TODO Auto-generated method stub - return false; - } - } diff --git a/src/common/assemblyline/machine/belt/BlockConveyorBelt.java b/src/common/assemblyline/machine/belt/BlockConveyorBelt.java index ed6cccbcf..fa32fd957 100644 --- a/src/common/assemblyline/machine/belt/BlockConveyorBelt.java +++ b/src/common/assemblyline/machine/belt/BlockConveyorBelt.java @@ -33,7 +33,7 @@ public class BlockConveyorBelt extends BlockMachine } @Override - public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { int metadata = par1World.getBlockMetadata(x, y, z); diff --git a/src/common/assemblyline/machine/belt/TileEntityConveyorBelt.java b/src/common/assemblyline/machine/belt/TileEntityConveyorBelt.java index df248f62a..99dcdde1d 100644 --- a/src/common/assemblyline/machine/belt/TileEntityConveyorBelt.java +++ b/src/common/assemblyline/machine/belt/TileEntityConveyorBelt.java @@ -28,7 +28,7 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem /** * Joules required to run this thing. */ - public static final int JOULES_REQUIRED = 5; + public static final int WATT_REQUEST = 5; /** * The amount of watts received. @@ -40,8 +40,7 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem public boolean running = false; public boolean textureFlip = false; public boolean slantedBelt = false; - public TileEntityConveyorBelt[] adjBelts = - { null, null, null, null }; + public TileEntityConveyorBelt[] adjBelts = { null, null, null, null }; public int clearCount = 0; public int powerTransferRange = 0; @@ -83,7 +82,7 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem } this.powerTransferRange = rr - 1; - + return false; } @@ -92,6 +91,33 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem { super.updateEntity(); + if (!this.worldObj.isRemote) + { + for (int i = 0; i < 6; i++) + { + ForgeDirection inputDirection = ForgeDirection.getOrientation(i); + + TileEntity inputTile = Vector3.getTileEntityFromSide(this.worldObj, Vector3.get(this), inputDirection); + + if (inputTile != null) + { + if (inputTile instanceof IConductor) + { + if (this.wattsReceived >= this.WATT_REQUEST) + { + ((IConductor) inputTile).getNetwork().stopRequesting(this); + } + else + { + ((IConductor) inputTile).getNetwork().startRequesting(this, this.WATT_REQUEST / this.getVoltage(), this.getVoltage()); + this.wattsReceived += ((IConductor) inputTile).getNetwork().consumeElectricity(this).getWatts(); + } + } + } + + } + } + if (this.ticks % 10 == 0) { if (!worldObj.isRemote) @@ -99,7 +125,7 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem PacketManager.sendPacketToClients(this.getDescriptionPacket(), this.worldObj, Vector3.get(this), 15); } - if (this.wattsReceived >= JOULES_REQUIRED) + if (this.wattsReceived >= WATT_REQUEST) { this.wattsReceived = 0; this.powerTransferRange = 20; @@ -144,10 +170,8 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem /** * Causes all items to be moved above the belt * - * @param extendLife - * - increases the items life - * @param preventPickUp - * - prevent a player from picking the item up + * @param extendLife - increases the items life + * @param preventPickUp - prevent a player from picking the item up */ public void conveyItemsHorizontal(boolean extendLife, boolean preventPickUp) { @@ -166,22 +190,22 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem if (direction == 0) { entity.motionZ -= 1 * this.speed; - //entity.posX = this.xCoord + 0.5D; + // entity.posX = this.xCoord + 0.5D; } if (direction == 1) { entity.motionX += 1 * this.speed; - //entity.posZ = this.zCoord + 0.5D; + // entity.posZ = this.zCoord + 0.5D; } if (direction == 2) { entity.motionZ += 1 * this.speed; - //entity.posX = this.xCoord + 0.5D; + // entity.posX = this.xCoord + 0.5D; } if (direction == 3) { entity.motionX -= 1 * this.speed; - //entity.posZ = this.zCoord + 0.5D; + // entity.posZ = this.zCoord + 0.5D; } } } @@ -219,24 +243,6 @@ public class TileEntityConveyorBelt extends TileEntityElectricityReceiver implem return PacketManager.getPacket(AssemblyLine.CHANNEL, this, this.wattsReceived); } - @Override - public double wattRequest() - { - return JOULES_REQUIRED; - } - - @Override - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side) - { - this.wattsReceived += ElectricInfo.getWatts(amps, voltage); - } - - @Override - public boolean canReceiveFromSide(ForgeDirection side) - { - return side == ForgeDirection.DOWN; - } - public int getBeltDirection() { int meta = worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); diff --git a/src/common/assemblyline/machines/crafter/BlockCrafter.java b/src/common/assemblyline/machines/crafter/BlockCrafter.java index ae437c129..119fe7cf5 100644 --- a/src/common/assemblyline/machines/crafter/BlockCrafter.java +++ b/src/common/assemblyline/machines/crafter/BlockCrafter.java @@ -56,8 +56,7 @@ public class BlockCrafter extends BlockMachine } /** - * @param currentDirection - * - An integer from 0 to 4. + * @param currentDirection - An integer from 0 to 4. * @return The metadata this block should change into. */ public int getNextDirectionMeta(int currentDirection) @@ -103,7 +102,7 @@ public class BlockCrafter extends BlockMachine } @Override - public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { if (!par1World.isRemote) { @@ -117,7 +116,8 @@ public class BlockCrafter extends BlockMachine return true; } - public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + @Override + public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } diff --git a/src/common/assemblyline/machines/crafter/TileEntityCraftingArm.java b/src/common/assemblyline/machines/crafter/TileEntityCraftingArm.java index a8e17cf09..46a7ad266 100644 --- a/src/common/assemblyline/machines/crafter/TileEntityCraftingArm.java +++ b/src/common/assemblyline/machines/crafter/TileEntityCraftingArm.java @@ -1,5 +1,7 @@ package assemblyline.machines.crafter; +import java.util.EnumSet; + import net.minecraft.src.EntityPlayer; import net.minecraft.src.IInventory; import net.minecraft.src.INetworkManager; @@ -7,14 +9,19 @@ import net.minecraft.src.ItemStack; import net.minecraft.src.NBTTagCompound; import net.minecraft.src.NBTTagList; import net.minecraft.src.Packet250CustomPayload; +import net.minecraft.src.TileEntity; import net.minecraftforge.common.ForgeDirection; +import universalelectricity.core.electricity.ElectricityConnections; +import universalelectricity.core.implement.IConductor; +import universalelectricity.core.implement.IJouleStorage; +import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.network.IPacketReceiver; import universalelectricity.prefab.tile.TileEntityElectricityReceiver; import assemblyline.ai.TaskManager; import com.google.common.io.ByteArrayDataInput; -public class TileEntityCraftingArm extends TileEntityElectricityReceiver implements IInventory, IPacketReceiver +public class TileEntityCraftingArm extends TileEntityElectricityReceiver implements IInventory, IPacketReceiver, IJouleStorage { /** * The items this container contains. @@ -28,27 +35,56 @@ public class TileEntityCraftingArm extends TileEntityElectricityReceiver impleme */ public EntityCraftingArm EntityArm = null; - public double wattUsed = 20; + public final double WATT_REQUEST = 20; - public double jouleReceived = 0; - - public double maxJoules = 100; - /** - * does this arm have a task to do - */ - public boolean hasTask = true; + public double wattsReceived = 0; private int playerUsing = 0; + @Override + public void initiate() + { + ElectricityConnections.registerConnector(this, EnumSet.of(ForgeDirection.DOWN, ForgeDirection.SOUTH, ForgeDirection.NORTH, ForgeDirection.EAST, ForgeDirection.WEST)); + } + public void updateEntity() { super.updateEntity(); + if (!this.worldObj.isRemote) + { + for (int i = 0; i < 6; i++) + { + ForgeDirection inputDirection = ForgeDirection.getOrientation(i); + + if (inputDirection != ForgeDirection.UP) + { + TileEntity inputTile = Vector3.getTileEntityFromSide(this.worldObj, Vector3.get(this), inputDirection); + + if (inputTile != null) + { + if (inputTile instanceof IConductor) + { + if (this.getJoules() >= this.getMaxJoules()) + { + ((IConductor) inputTile).getNetwork().stopRequesting(this); + } + else + { + ((IConductor) inputTile).getNetwork().startRequesting(this, this.WATT_REQUEST / this.getVoltage(), this.getVoltage()); + this.setJoules(this.getJoules() + ((IConductor) inputTile).getNetwork().consumeElectricity(this).getWatts()); + } + } + } + } + } + } + taskManager.onUpdate(); - if (this.ticks % 5 == 0 && !this.isDisabled() && this.hasTask && EntityArm != null) + if (this.ticks % 5 == 0 && !this.isDisabled() && this.taskManager.hasTask() && EntityArm != null) { - this.jouleReceived -= this.wattUsed; + this.wattsReceived -= this.WATT_REQUEST; this.doWork(); } } @@ -61,36 +97,6 @@ public class TileEntityCraftingArm extends TileEntityElectricityReceiver impleme } - /** - * UE methods - */ - @Override - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side) - { - this.jouleReceived = Math.max(jouleReceived + (amps * voltage), maxJoules); - - } - - @Override - public double wattRequest() - { - return maxJoules - jouleReceived; - } - - @Override - public boolean canReceiveFromSide(ForgeDirection side) - { - if (side != ForgeDirection.UP) { return true; } - return false; - } - - @Override - public boolean canConnect(ForgeDirection side) - { - if (side != ForgeDirection.UP) { return true; } - return false; - } - @Override public double getVoltage() { @@ -255,4 +261,22 @@ public class TileEntityCraftingArm extends TileEntityElectricityReceiver impleme nbt.setTag("Items", var2); } + @Override + public double getJoules(Object... data) + { + return this.wattsReceived; + } + + @Override + public void setJoules(double joules, Object... data) + { + this.wattsReceived = joules; + } + + @Override + public double getMaxJoules(Object... data) + { + return 1000; + } + } diff --git a/src/common/universalelectricity/core/UEConfig.java b/src/common/universalelectricity/core/UEConfig.java deleted file mode 100644 index 244085a9a..000000000 --- a/src/common/universalelectricity/core/UEConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -package universalelectricity.core; - -import net.minecraftforge.common.Configuration; - -public class UEConfig -{ - public static int getConfigData(Configuration configuration, String name, int defaultInt) - { - configuration.load(); - int returnInt = defaultInt; - returnInt = Integer.parseInt(configuration.get(name, Configuration.CATEGORY_GENERAL, defaultInt).value); - configuration.save(); - return returnInt; - } - - public static boolean getConfigData(Configuration configuration, String name, boolean defaultBoolean) - { - configuration.load(); - boolean returnBoolean = defaultBoolean; - returnBoolean = Boolean.parseBoolean(configuration.get(name, Configuration.CATEGORY_GENERAL, defaultBoolean).value); - configuration.save(); - return returnBoolean; - } - - public static int getBlockConfigID(Configuration configuration, String name, int defaultID) - { - configuration.load(); - int id = defaultID; - - id = Integer.parseInt(configuration.getBlock(name, defaultID).value); - - if (id <= 136) { return defaultID; } - - configuration.save(); - return id; - } - - public static int getItemConfigID(Configuration configuration, String name, int defaultID) - { - configuration.load(); - int id = defaultID; - - id = Integer.parseInt(configuration.getItem(name, Configuration.CATEGORY_ITEM, defaultID).value); - - if (id < 256) { return defaultID; } - - configuration.save(); - return id; - } -} diff --git a/src/common/universalelectricity/core/UELoader.java b/src/common/universalelectricity/core/UELoader.java index 3c7c4f0a0..c22bae0de 100644 --- a/src/common/universalelectricity/core/UELoader.java +++ b/src/common/universalelectricity/core/UELoader.java @@ -2,14 +2,10 @@ package universalelectricity.core; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeSubscribe; -import net.minecraftforge.event.world.WorldEvent.Load; import net.minecraftforge.event.world.WorldEvent.Unload; -import universalelectricity.core.electricity.ElectricityManager; -import universalelectricity.core.electricity.ElectricityManagerTicker; +import universalelectricity.core.electricity.Electricity; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.Side; -import cpw.mods.fml.common.registry.TickRegistry; /** * A class used to load Universal Electricity and make it work. @@ -27,8 +23,7 @@ public class UELoader { if (!isInitialized) { - TickRegistry.registerTickHandler(new ElectricityManagerTicker(), Side.SERVER); - ElectricityManager.instance = new ElectricityManager(); + Electricity.instance = new Electricity(); MinecraftForge.EVENT_BUS.register(this); if (UniversalElectricity.BC3_RATIO <= 0 || !Loader.isModLoaded("BuildCraft|Core")) @@ -51,19 +46,18 @@ public class UELoader FMLLog.finest("Universal Electricity v" + UniversalElectricity.VERSION + " successfully loaded!"); + UniversalElectricity.IC2_RATIO = UniversalElectricity.CONFIGURATION.get("Compatiblity", "IndustrialCraft Conversion Ratio", UniversalElectricity.IC2_RATIO).getInt(); + UniversalElectricity.BC3_RATIO = UniversalElectricity.CONFIGURATION.get("Compatiblity", "BuildCraft Conversion Ratio", UniversalElectricity.BC3_RATIO).getInt(); + UniversalElectricity.TO_IC2_RATIO = 1 / UniversalElectricity.IC2_RATIO; + UniversalElectricity.TO_BC_RATIO = 1 / UniversalElectricity.BC3_RATIO; + isInitialized = true; } } - @ForgeSubscribe - public void onWorldLoad(Load event) - { - ElectricityManagerTicker.inGameTicks = 0; - } - @ForgeSubscribe public void onWorldUnload(Unload event) { - ElectricityManager.instance = new ElectricityManager(); + Electricity.instance = new Electricity(); } } diff --git a/src/common/universalelectricity/core/UniversalElectricity.java b/src/common/universalelectricity/core/UniversalElectricity.java index 661ccc99d..505f15d94 100644 --- a/src/common/universalelectricity/core/UniversalElectricity.java +++ b/src/common/universalelectricity/core/UniversalElectricity.java @@ -30,8 +30,8 @@ public class UniversalElectricity * The version of the Universal Electricity API. */ public static final int MAJOR_VERSION = 1; - public static final int MINOR_VERSION = 1; - public static final int REVISION_VERSION = 3; + public static final int MINOR_VERSION = 2; + public static final int REVISION_VERSION = 0; public static final String VERSION = MAJOR_VERSION + "." + MINOR_VERSION + "." + REVISION_VERSION; /** @@ -43,11 +43,11 @@ public class UniversalElectricity * Conversion ratios between Buildcraft and Industrialcraft energy. */ // EU to Watts ratio - public static final float IC2_RATIO = (float) UEConfig.getConfigData(CONFIGURATION, "IndustrialCraft Conversion Ratio", 7); + public static int IC2_RATIO = 7; // MJ to Watts ratio. - public static final float BC3_RATIO = (float) UEConfig.getConfigData(CONFIGURATION, "BuildCraft Conversion Ratio", 85);; - public static final float TO_IC2_RATIO = 1 / IC2_RATIO; - public static final float TO_BC_RATIO = 1 / BC3_RATIO; + public static int BC3_RATIO = 85; + public static int TO_IC2_RATIO = 1 / IC2_RATIO; + public static int TO_BC_RATIO = 1 / BC3_RATIO; /** * Use this material for all your machine blocks. It can be breakable by hand. @@ -62,19 +62,19 @@ public class UniversalElectricity */ public static void register(Object mod, int major, int minor, int revision, boolean strict) { - if (MAJOR_VERSION != major) { throw new RuntimeException("Universal Electricity wrong version! Require v" + major + "." + minor + "." + revision); } + if (MAJOR_VERSION != major) { throw new RuntimeException("A Universal Electricity mod is way too old! Make sure it is update to v" + major + "." + minor + "." + revision); } - if (MINOR_VERSION < minor) { throw new RuntimeException("Universal Electricity minor version is too old! Require v" + major + "." + minor + "." + revision); } + if (MINOR_VERSION < minor) { throw new RuntimeException("A Universal Electricity mod is too old! Make sure it is update to v" + major + "." + minor + "." + revision); } if (REVISION_VERSION < revision) { if (strict) { - throw new RuntimeException("Universal Electricity is too old! Require v" + major + "." + minor + "." + revision); + throw new RuntimeException("A Universal Electricity mod is too old! Require v" + major + "." + minor + "." + revision); } else { - FMLLog.warning("Universal Electricity is not the specified version. Odd things might happen. Recommend to have v" + major + "." + minor + "." + revision); + FMLLog.warning("The version of Universal Electricity detected is not the recommended version by the mod. Odd things might happen. Recommended to try v" + major + "." + minor + "." + revision); } } diff --git a/src/common/universalelectricity/core/electricity/ElectricInfo.java b/src/common/universalelectricity/core/electricity/ElectricInfo.java index 94ea3c28a..fea3a106c 100644 --- a/src/common/universalelectricity/core/electricity/ElectricInfo.java +++ b/src/common/universalelectricity/core/electricity/ElectricInfo.java @@ -186,8 +186,7 @@ public class ElectricInfo /** * Rounds a number to a specific number place places * - * @param The - * number + * @param The number * @return The rounded number */ public static double roundDecimals(double d, int significantFigures) diff --git a/src/common/universalelectricity/core/electricity/Electricity.java b/src/common/universalelectricity/core/electricity/Electricity.java new file mode 100644 index 000000000..9a2cd6614 --- /dev/null +++ b/src/common/universalelectricity/core/electricity/Electricity.java @@ -0,0 +1,142 @@ +package universalelectricity.core.electricity; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.src.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import universalelectricity.core.implement.IConductor; +import universalelectricity.core.vector.Vector3; +import cpw.mods.fml.common.FMLLog; + +/** + * THIS IS THE NEW ELECTRICITY MANAGER. THIS IS ONLY A DRAFT! + * + * The Electricity Network Manager. + * + * @author Calclavia + * + */ +public class Electricity +{ + public static Electricity instance = new Electricity(); + + private List electricityNetworks = new ArrayList(); + + /** + * Registers a conductor into the UE electricity net. + */ + public void registerConductor(IConductor newConductor) + { + this.cleanUpNetworks(); + ElectricityNetwork newNetwork = new ElectricityNetwork(newConductor); + this.electricityNetworks.add(newNetwork); + } + + public void unregister(TileEntity tileEntity) + { + for (ElectricityNetwork network : this.electricityNetworks) + { + network.stopProducing(tileEntity); + network.stopRequesting(tileEntity); + } + } + + /** + * Merges two connection lines together into one. + * + * @param networkA - The network to be merged into. This network will be kept. + * @param networkB - The network to be merged. This network will be deleted. + */ + public void mergeConnection(ElectricityNetwork networkA, ElectricityNetwork networkB) + { + if (networkA != networkB) + { + if (networkA != null && networkB != null) + { + networkA.conductors.addAll(networkB.conductors); + networkA.setNetwork(); + this.electricityNetworks.remove(networkB); + networkB = null; + + networkA.cleanConductors(); + } + else + { + System.err.println("Failed to merge Universal Electricity wire connections!"); + } + } + } + + /** + * Separate one connection line into two different ones between two conductors. This function + * does this by resetting all wires in the connection line and making them each reconnect. + * + * @param conductorA - existing conductor + * @param conductorB - broken/invalid conductor + */ + public void splitConnection(IConductor conductorA, IConductor conductorB) + { + ElectricityNetwork network = conductorA.getNetwork(); + + if (network != null) + { + network.cleanConductors(); + network.resetConductors(); + + for (IConductor conductor : network.conductors) + { + for (byte i = 0; i < 6; i++) + { + conductor.updateConnectionWithoutSplit(Vector3.getConnectorFromSide(((TileEntity) conductor).worldObj, Vector3.get((TileEntity) conductor), ForgeDirection.getOrientation(i)), ForgeDirection.getOrientation(i)); + } + } + + } + else + { + FMLLog.severe("Conductor invalid network while splitting connection!"); + } + } + + /** + * Clean up and remove all useless and invalid connections. + */ + public void cleanUpNetworks() + { + try + { + Iterator it = electricityNetworks.iterator(); + + while (it.hasNext()) + { + ElectricityNetwork network = ((ElectricityNetwork) it.next()); + network.cleanConductors(); + + if (network.conductors.size() == 0) + { + it.remove(); + } + } + } + catch (Exception e) + { + FMLLog.severe("Failed to clean up wire connections!"); + e.printStackTrace(); + } + } + + public void resetConductors() + { + Iterator it = electricityNetworks.iterator(); + + while (it.hasNext()) + { + ElectricityNetwork network = ((ElectricityNetwork) it.next()); + network.resetConductors(); + } + + System.out.println(electricityNetworks.size()); + } +} diff --git a/src/common/universalelectricity/core/electricity/ElectricityConnections.java b/src/common/universalelectricity/core/electricity/ElectricityConnections.java new file mode 100644 index 000000000..f4678fb88 --- /dev/null +++ b/src/common/universalelectricity/core/electricity/ElectricityConnections.java @@ -0,0 +1,52 @@ +package universalelectricity.core.electricity; + +import java.util.EnumSet; +import java.util.HashMap; + +import net.minecraft.src.TileEntity; +import net.minecraftforge.common.ForgeDirection; + +/** + * Register your block to allow a wire connection with this class. This class manages the visual + * aspect of a wire connection and does not effect the actual transmission of electricity. + * + * @author Calclavia + * + */ +public class ElectricityConnections +{ + private static final HashMap> connectors = new HashMap>(); + + /** + * Registers a block to allow connection from Universal Electricity wires. + * + * @param tileEntity - The TileEntity + * @param connectableDirections - Directions that allow connection + */ + public static void registerConnector(TileEntity tileEntity, EnumSet connectableDirections) + { + connectors.put(tileEntity, connectableDirections); + } + + public static boolean isConnector(TileEntity tileEntity) + { + return connectors.containsKey(tileEntity); + } + + public static boolean canConnect(TileEntity tileEntity, ForgeDirection side) + { + EnumSet enumSet = connectors.get(tileEntity); + + if (enumSet != null) { return enumSet.contains(side); } + + return false; + } + + /** + * Returns the directions in which this block may connect or be connected from. + */ + public static EnumSet getDirections(TileEntity tileEntity) + { + return connectors.get(tileEntity); + } +} diff --git a/src/common/universalelectricity/core/electricity/ElectricityManager.java b/src/common/universalelectricity/core/electricity/ElectricityManager.java deleted file mode 100644 index 9f5d1d0c3..000000000 --- a/src/common/universalelectricity/core/electricity/ElectricityManager.java +++ /dev/null @@ -1,413 +0,0 @@ -package universalelectricity.core.electricity; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import net.minecraft.src.Entity; -import net.minecraft.src.TileEntity; -import net.minecraftforge.common.ForgeDirection; -import universalelectricity.core.implement.IConductor; -import universalelectricity.core.implement.IElectricityReceiver; -import universalelectricity.core.vector.Vector3; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.common.TickType; - -/** - * This class is used to manage electricity transferring and flow. It is also used to call updates - * on UE tile entities. - * - * @author Calclavia - * - */ -public class ElectricityManager -{ - /** - * ElectricityManager exists on both client and server side. Rely on the server side one as it - * is more accurate! Client side only simulates. - */ - public static ElectricityManager instance; - - private List electricityTransferQueue = new ArrayList(); - private List electricityNetworks = new ArrayList(); - - public ElectricityManager() - { - System.out.println("Universal Electricity's Electricity Manager Initiated."); - } - - /** - * Registers a the conductor into the UE electricity net. - * - * @param conductor - * - The IConductor tile entity. - */ - public void registerConductor(IConductor newConductor) - { - cleanUpConnections(); - this.electricityNetworks.add(new ElectricityNetwork(newConductor)); - } - - /** - * Merges two connection lines together into one. - * - * @param networkA - * - The network to be merged into. This network will be kept. - * @param networkB - * - The network to be merged. This network will be deleted. - */ - public void mergeConnection(ElectricityNetwork networkA, ElectricityNetwork networkB) - { - if (networkA != networkB) - { - if (networkA != null && networkB != null) - { - networkA.conductors.addAll(networkB.conductors); - networkA.setNetwork(); - this.electricityNetworks.remove(networkB); - networkB = null; - } - else - { - System.err.println("Failed to merge Universal Electricity wire connections!"); - } - } - } - - /** - * Separate one connection line into two different ones between two conductors. This function - * does this by resetting all wires in the connection line and making them each reconnect. - * - * @param conductorA - * - existing conductor - * @param conductorB - * - broken/invalid conductor - */ - public void splitConnection(IConductor conductorA, IConductor conductorB) - { - ElectricityNetwork connection = conductorA.getNetwork(); - - if (connection != null) - { - connection.cleanUpArray(); - - for (IConductor conductor : connection.conductors) - { - conductor.reset(); - } - - for (IConductor conductor : connection.conductors) - { - for (byte i = 0; i < 6; i++) - { - conductor.updateConnectionWithoutSplit(Vector3.getConnectorFromSide(conductor.getWorld(), new Vector3(((TileEntity) conductor).xCoord, ((TileEntity) conductor).yCoord, ((TileEntity) conductor).zCoord), ForgeDirection.getOrientation(i)), ForgeDirection.getOrientation(i)); - } - } - } - else - { - FMLLog.severe("Conductor invalid network while splitting connection!"); - } - } - - /** - * Clean up and remove all useless and invalid connections. - */ - public void cleanUpConnections() - { - try - { - for (int i = 0; i < this.electricityNetworks.size(); i++) - { - this.electricityNetworks.get(i).cleanUpArray(); - - if (this.electricityNetworks.get(i).conductors.size() == 0) - { - this.electricityNetworks.remove(i); - } - } - } - catch (Exception e) - { - FMLLog.severe("Failed to clean up wire connections!"); - } - } - - /** - * Produces electricity into a specific wire which will be distributed across the electricity - * network. - * - * @param sender - * The machine sending the electricity. - * @param targetConductor - * The conductor receiving the electricity (or connected to the machine). - * @param amps - * The amount of amps this machine is sending. - * @param voltage - * The amount of volts this machine is sending. - */ - public void produceElectricity(Object sender, IConductor targetConductor, double amps, double voltage) - { - if (targetConductor != null && amps > 0 && voltage > 0) - { - // Find a path between this conductor - // and all connected units and - // try to send the electricity to them - // directly - ElectricityNetwork electricityNetwork = targetConductor.getNetwork(); - - if (electricityNetwork != null) - { - List allElectricUnitsInLine = electricityNetwork.getConnectedReceivers(); - double leftOverAmps = amps; - - for (IConductor conductor : electricityNetwork.conductors) - { - for (byte i = 0; i < conductor.getConnectedBlocks().length; i++) - { - TileEntity tileEntity = conductor.getConnectedBlocks()[i]; - - if (tileEntity != null) - { - if (tileEntity instanceof IElectricityReceiver) - { - IElectricityReceiver receiver = (IElectricityReceiver) tileEntity; - - if (this.getActualWattRequest(receiver) > 0 && receiver.canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite())) - { - double transferAmps = Math.max(0, Math.min(leftOverAmps, Math.min(amps / allElectricUnitsInLine.size(), ElectricInfo.getAmps(this.getActualWattRequest(receiver), receiver.getVoltage())))); - leftOverAmps -= transferAmps; - - double ampsReceived = transferAmps; - double voltsReceived = voltage; - - if (sender instanceof TileEntity) - { - // Calculate electricity loss - double distance = Vector3.distance(Vector3.get((TileEntity) sender), Vector3.get((TileEntity) receiver)); - ampsReceived = transferAmps - (transferAmps * transferAmps * targetConductor.getResistance() * distance) / voltage; - voltsReceived = voltage - (transferAmps * targetConductor.getResistance() * distance); - } - - this.electricityTransferQueue.add(new ElectricityTransferData(sender, receiver, electricityNetwork, ForgeDirection.getOrientation(i).getOpposite(), ampsReceived, voltsReceived)); - } - } - } - } - } - } - else - { - FMLLog.severe("Conductor not registered to a network!"); - } - } - } - - public void produceElectricity(Object sender, Entity entity, double amps, double voltage, ForgeDirection outputDirection) - { - if (entity instanceof IElectricityReceiver) - { - IElectricityReceiver electricEntity = ((IElectricityReceiver) entity); - - if (electricEntity.wattRequest() > 0) - { - if (electricEntity.canReceiveFromSide(outputDirection.getOpposite())) - { - electricEntity.onReceive(this, amps, voltage, outputDirection.getOpposite()); - } - } - } - } - - /** - * Gets the actual watt request of an electric receiver accounting all current electricity - * packets qued up for it. - * - * @return - The amount of watts requested. - */ - public double getActualWattRequest(IElectricityReceiver receiver) - { - double wattsRequest = receiver.wattRequest(); - - try - { - for (int i = 0; i < electricityTransferQueue.size(); i++) - { - if (electricityTransferQueue.get(i) != null) - { - if (electricityTransferQueue.get(i).isValid()) - { - if (electricityTransferQueue.get(i).receiver == receiver) - { - wattsRequest -= electricityTransferQueue.get(i).amps * electricityTransferQueue.get(i).voltage; - } - } - } - } - } - catch (Exception e) - { - FMLLog.severe("Failed to get watt request!"); - } - - return Math.max(Math.min(wattsRequest, receiver.wattRequest()), 0); - } - - /** - * Checks if the current connection line needs electricity - * - * @return - The amount of joules this connection line needs - */ - public double getElectricityRequired(ElectricityNetwork network) - { - double need = 0; - - if (network != null) - { - for (IConductor conductor : network.conductors) - { - for (byte i = 0; i < conductor.getConnectedBlocks().length; i++) - { - TileEntity tileEntity = conductor.getConnectedBlocks()[i]; - - if (tileEntity != null) - { - if (tileEntity instanceof IElectricityReceiver) - { - IElectricityReceiver electricUnit = (IElectricityReceiver) tileEntity; - - if (electricUnit.canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite())) - { - need += electricUnit.wattRequest(); - } - } - } - } - } - } - - return need; - } - - public double getActualElectricityRequired(ElectricityNetwork network) - { - double need = 0; - - if (network != null) - { - for (IConductor conductor : network.conductors) - { - for (byte i = 0; i < conductor.getConnectedBlocks().length; i++) - { - TileEntity tileEntity = conductor.getConnectedBlocks()[i]; - - if (tileEntity != null) - { - if (tileEntity instanceof IElectricityReceiver) - { - IElectricityReceiver electricUnit = (IElectricityReceiver) tileEntity; - - if (electricUnit.canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite())) - { - need += this.getActualWattRequest(electricUnit); - } - } - } - } - } - } - - return need; - } - - /** - * This function is called to refresh all conductors in the world. - */ - public void refreshConductors() - { - try - { - Iterator it = electricityNetworks.iterator(); - - while (it.hasNext()) - { - ((ElectricityNetwork) it.next()).refreshConductors(); - } - } - catch (Exception e) - { - FMLLog.fine("Failed to refresh conductors."); - } - } - - public void onTick(EnumSet type, Object... tickData) - { - if (ElectricityManagerTicker.inGameTicks % 40 == 0) - { - this.refreshConductors(); - } - - if (type.contains(TickType.WORLD) && !type.contains(TickType.WORLDLOAD)) - { - - try - { - HashMap conductorAmpData = new HashMap(); - - for (int i = 0; i < electricityTransferQueue.size(); i++) - { - if (electricityTransferQueue.get(i) != null) - { - if (electricityTransferQueue.get(i).isValid()) - { - double amps = electricityTransferQueue.get(i).amps; - - if (conductorAmpData.containsKey(electricityTransferQueue.get(i).network)) - { - amps += (Double) conductorAmpData.get(electricityTransferQueue.get(i).network); - } - - conductorAmpData.put(electricityTransferQueue.get(i).network, amps); - electricityTransferQueue.get(i).receiver.onReceive(electricityTransferQueue.get(i).sender, electricityTransferQueue.get(i).amps, electricityTransferQueue.get(i).voltage, electricityTransferQueue.get(i).side); - } - } - - electricityTransferQueue.remove(i); - } - - Iterator it = conductorAmpData.entrySet().iterator(); - - while (it.hasNext()) - { - Map.Entry pairs = (Map.Entry) it.next(); - - if (pairs.getKey() != null && pairs.getValue() != null) - { - if (pairs.getKey() instanceof ElectricityNetwork && pairs.getValue() instanceof Double) - { - if (((Double) pairs.getValue()) > ((ElectricityNetwork) pairs.getKey()).getLowestAmpConductor()) - { - ((ElectricityNetwork) pairs.getKey()).onOverCharge(); - } - } - } - - it.remove(); - } - } - catch (Exception e) - { - System.err.println("Failed to transfer electricity to receivers."); - e.printStackTrace(); - } - } - - if (ElectricityManagerTicker.inGameTicks == 0) - { - this.refreshConductors(); - } - } -} \ No newline at end of file diff --git a/src/common/universalelectricity/core/electricity/ElectricityManagerTicker.java b/src/common/universalelectricity/core/electricity/ElectricityManagerTicker.java deleted file mode 100644 index 95f9d40de..000000000 --- a/src/common/universalelectricity/core/electricity/ElectricityManagerTicker.java +++ /dev/null @@ -1,45 +0,0 @@ -package universalelectricity.core.electricity; - -import java.util.EnumSet; - -import cpw.mods.fml.common.ITickHandler; -import cpw.mods.fml.common.TickType; - -public class ElectricityManagerTicker implements ITickHandler -{ - public static long inGameTicks = 0; - - @Override - public void tickStart(EnumSet type, Object... tickData) - { - if (ElectricityManager.instance != null) - { - ElectricityManager.instance.onTick(type, tickData); - } - - inGameTicks++; - - if (inGameTicks >= Long.MAX_VALUE) - { - inGameTicks = 0; - } - } - - @Override - public void tickEnd(EnumSet type, Object... tickData) - { - - } - - @Override - public EnumSet ticks() - { - return EnumSet.of(TickType.WORLD, TickType.WORLDLOAD, TickType.SERVER); - } - - @Override - public String getLabel() - { - return "Electricity Manager"; - } -} diff --git a/src/common/universalelectricity/core/electricity/ElectricityNetwork.java b/src/common/universalelectricity/core/electricity/ElectricityNetwork.java index b69672f5a..cba111d10 100644 --- a/src/common/universalelectricity/core/electricity/ElectricityNetwork.java +++ b/src/common/universalelectricity/core/electricity/ElectricityNetwork.java @@ -1,25 +1,240 @@ package universalelectricity.core.electricity; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import net.minecraft.src.TileEntity; -import net.minecraftforge.common.ForgeDirection; import universalelectricity.core.implement.IConductor; -import universalelectricity.core.implement.IElectricityReceiver; +import cpw.mods.fml.common.FMLLog; public class ElectricityNetwork { - public List conductors = new ArrayList(); + private final HashMap producers = new HashMap(); + private final HashMap consumers = new HashMap(); + + public final List conductors = new ArrayList(); public ElectricityNetwork(IConductor conductor) { this.addConductor(conductor); } + /** + * Sets this tile entity to start producing energy in this network. + */ + public void startProducing(TileEntity tileEntity, double amperes, double voltage) + { + if (tileEntity != null && amperes > 0 && voltage > 0) + { + this.producers.put(tileEntity, new ElectricityPack(amperes, voltage)); + } + } + + public boolean isProducing(TileEntity tileEntity) + { + return this.producers.containsKey(tileEntity); + } + + /** + * Sets this tile entity to stop producing energy in this network. + */ + public void stopProducing(TileEntity tileEntity) + { + this.producers.remove(tileEntity); + } + + /** + * Sets this tile entity to start producing energy in this network. + */ + public void startRequesting(TileEntity tileEntity, double amperes, double voltage) + { + if (tileEntity != null && amperes > 0 && voltage > 0) + { + this.consumers.put(tileEntity, new ElectricityPack(amperes, voltage)); + } + } + + public boolean isRequesting(TileEntity tileEntity) + { + return this.consumers.containsKey(tileEntity); + } + + /** + * Sets this tile entity to stop producing energy in this network. + */ + public void stopRequesting(TileEntity tileEntity) + { + this.consumers.remove(tileEntity); + } + + /** + * @return The electricity produced in this electricity network + */ + public ElectricityPack getProduced() + { + ElectricityPack totalElectricity = new ElectricityPack(0, 0); + + Iterator it = this.producers.entrySet().iterator(); + + while (it.hasNext()) + { + Map.Entry pairs = (Map.Entry) it.next(); + + if (pairs != null) + { + TileEntity tileEntity = (TileEntity) pairs.getKey(); + + if (tileEntity == null) + { + it.remove(); + continue; + } + + if (tileEntity.isInvalid()) + { + it.remove(); + continue; + } + + if (tileEntity.worldObj.getBlockTileEntity(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord) != tileEntity) + { + it.remove(); + continue; + } + + ElectricityPack pack = (ElectricityPack) pairs.getValue(); + + if (pairs.getKey() != null && pairs.getValue() != null && pack != null) + { + totalElectricity.amperes += pack.amperes; + totalElectricity.voltage = Math.max(totalElectricity.voltage, pack.voltage); + } + } + } + + return totalElectricity; + } + + /** + * @return How much electricity this network needs. + */ + public ElectricityPack getRequest() + { + ElectricityPack totalElectricity = this.getRequestWithoutReduction(); + totalElectricity.amperes = Math.max(totalElectricity.amperes - this.getProduced().amperes, 0); + + return totalElectricity; + } + + public ElectricityPack getRequestWithoutReduction() + { + ElectricityPack totalElectricity = new ElectricityPack(0, 0); + + Iterator it = this.consumers.entrySet().iterator(); + + while (it.hasNext()) + { + Map.Entry pairs = (Map.Entry) it.next(); + + if (pairs != null) + { + TileEntity tileEntity = (TileEntity) pairs.getKey(); + + if (tileEntity == null) + { + it.remove(); + continue; + } + + if (tileEntity.isInvalid()) + { + it.remove(); + continue; + } + + if (tileEntity.worldObj.getBlockTileEntity(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord) != tileEntity) + { + it.remove(); + continue; + } + + ElectricityPack pack = (ElectricityPack) pairs.getValue(); + + if (pack != null) + { + totalElectricity.amperes += pack.amperes; + totalElectricity.voltage = Math.max(totalElectricity.voltage, pack.voltage); + } + } + } + + return totalElectricity; + } + + /** + * @param tileEntity + * @return The electricity being input into this tile entity. + */ + public ElectricityPack consumeElectricity(TileEntity tileEntity) + { + ElectricityPack totalElectricity = new ElectricityPack(0, 0); + + try + { + ElectricityPack tileRequest = this.consumers.get(tileEntity); + + if (this.consumers.containsKey(tileEntity) && tileRequest != null) + { + // Calculate the electricity this tile entity is receiving in percentage. + totalElectricity = this.getProduced(); + + if (totalElectricity.getWatts() > 0) + { + ElectricityPack totalRequest = this.getRequestWithoutReduction(); + totalElectricity.amperes *= (tileRequest.amperes / totalRequest.amperes); + + int distance = this.conductors.size(); + double ampsReceived = totalElectricity.amperes - (totalElectricity.amperes * totalElectricity.amperes * this.getResistance() * distance) / totalElectricity.voltage; + double voltsReceived = totalElectricity.voltage - (totalElectricity.amperes * this.getResistance() * distance); + + totalElectricity.amperes = ampsReceived; + totalElectricity.voltage = voltsReceived; + + return totalElectricity; + } + } + } + catch (Exception e) + { + FMLLog.severe("Failed to consume electricity!"); + e.printStackTrace(); + } + + return totalElectricity; + } + + /** + * @return Returns all producers in this electricity network. + */ + public HashMap getProducers() + { + return this.producers; + } + + /** + * @return Returns all consumers in this electricity network. + */ + public HashMap getConsumers() + { + return this.consumers; + } + public void addConductor(IConductor newConductor) { - this.cleanUpArray(); + this.cleanConductors(); if (!conductors.contains(newConductor)) { @@ -31,34 +246,26 @@ public class ElectricityNetwork /** * Get only the electric units that can receive electricity from the given side. */ - public List getConnectedReceivers() + public List getReceivers() { - this.cleanUpArray(); - List returnArray = new ArrayList(); + List receivers = new ArrayList(); - for (IConductor conductor : conductors) + Iterator it = this.consumers.entrySet().iterator(); + + while (it.hasNext()) { - for (byte i = 0; i < conductor.getConnectedBlocks().length; i++) - { - TileEntity tileEntity = conductor.getConnectedBlocks()[i]; + Map.Entry pairs = (Map.Entry) it.next(); - if (tileEntity != null) - { - if (tileEntity instanceof IElectricityReceiver) - { - if (!returnArray.contains((IElectricityReceiver) tileEntity) && ((IElectricityReceiver) tileEntity).canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite())) - { - returnArray.add((IElectricityReceiver) tileEntity); - } - } - } + if (pairs != null) + { + receivers.add((TileEntity) pairs.getKey()); } } - return returnArray; + return receivers; } - public void cleanUpArray() + public void cleanConductors() { for (int i = 0; i < conductors.size(); i++) { @@ -73,9 +280,17 @@ public class ElectricityNetwork } } + public void resetConductors() + { + for (int i = 0; i < conductors.size(); i++) + { + conductors.get(i).reset(); + } + } + public void setNetwork() { - this.cleanUpArray(); + this.cleanConductors(); for (IConductor conductor : this.conductors) { @@ -85,7 +300,7 @@ public class ElectricityNetwork public void onOverCharge() { - this.cleanUpArray(); + this.cleanConductors(); for (int i = 0; i < conductors.size(); i++) { @@ -93,7 +308,22 @@ public class ElectricityNetwork } } - public double getLowestAmpConductor() + /** + * Gets the resistance of this electrical network. + */ + public double getResistance() + { + double resistance = 0; + + for (int i = 0; i < conductors.size(); i++) + { + resistance = Math.max(resistance, conductors.get(i).getResistance()); + } + + return resistance; + } + + public double getLowestAmpTolerance() { double lowestAmp = 0; diff --git a/src/common/universalelectricity/core/electricity/ElectricityPack.java b/src/common/universalelectricity/core/electricity/ElectricityPack.java new file mode 100644 index 000000000..d73a98c7b --- /dev/null +++ b/src/common/universalelectricity/core/electricity/ElectricityPack.java @@ -0,0 +1,24 @@ +package universalelectricity.core.electricity; + +public class ElectricityPack +{ + public double amperes; + public double voltage; + + public ElectricityPack(double amperes, double voltage) + { + this.amperes = amperes; + this.voltage = voltage; + } + + public double getWatts() + { + return ElectricInfo.getWatts(amperes, voltage); + } + + @Override + public String toString() + { + return "ElectricityPack [Amps:" + this.amperes + " Volts:" + this.voltage + "]"; + } +} diff --git a/src/common/universalelectricity/core/electricity/ElectricityTransferData.java b/src/common/universalelectricity/core/electricity/ElectricityTransferData.java deleted file mode 100644 index 332765c3e..000000000 --- a/src/common/universalelectricity/core/electricity/ElectricityTransferData.java +++ /dev/null @@ -1,41 +0,0 @@ -package universalelectricity.core.electricity; - -import net.minecraftforge.common.ForgeDirection; -import universalelectricity.core.implement.IElectricityReceiver; - -public class ElectricityTransferData -{ - public Object sender; - public IElectricityReceiver receiver; - public ElectricityNetwork network; - public double amps; - public double voltage; - public ForgeDirection side; - - /** - * @param sender - * - Tile that's sending electricity. - * @param receiver - * - Receiver that's receiving electricity - * @param conductor - * - Conductor that is conducting the electricity - * @param side - * - - * @param amps - * @param voltage - */ - public ElectricityTransferData(Object sender, IElectricityReceiver receiver, ElectricityNetwork network, ForgeDirection side, double amps, double voltage) - { - this.sender = sender; - this.receiver = receiver; - this.network = network; - this.side = side; - this.amps = amps; - this.voltage = voltage; - } - - public boolean isValid() - { - return this.sender != null && this.receiver != null && this.network != null && this.amps > 0 && this.voltage > 0; - } -} diff --git a/src/common/universalelectricity/core/implement/IConductor.java b/src/common/universalelectricity/core/implement/IConductor.java index f74c16f6c..deb130732 100644 --- a/src/common/universalelectricity/core/implement/IConductor.java +++ b/src/common/universalelectricity/core/implement/IConductor.java @@ -1,7 +1,6 @@ package universalelectricity.core.implement; import net.minecraft.src.TileEntity; -import net.minecraft.src.World; import net.minecraftforge.common.ForgeDirection; import universalelectricity.core.electricity.ElectricityNetwork; @@ -11,7 +10,7 @@ import universalelectricity.core.electricity.ElectricityNetwork; * @author Calclavia * */ -public interface IConductor extends IConnector +public interface IConductor { /** * The electrical network this conductor is on. @@ -53,19 +52,16 @@ public interface IConductor extends IConnector */ public void reset(); - public World getWorld(); + public void refreshConnectedBlocks(); /** * Adds a connection between this conductor and a UE unit * - * @param tileEntity - * - Must be either a producer, consumer or a conductor - * @param side - * - side in which the connection is coming from + * @param tileEntity - Must be either a producer, consumer or a conductor + * @param side - side in which the connection is coming from */ public void updateConnection(TileEntity tileEntity, ForgeDirection side); public void updateConnectionWithoutSplit(TileEntity connectorFromSide, ForgeDirection orientation); - public void refreshConnectedBlocks(); } diff --git a/src/common/universalelectricity/core/implement/IConnector.java b/src/common/universalelectricity/core/implement/IConnector.java deleted file mode 100644 index 882c9ae3f..000000000 --- a/src/common/universalelectricity/core/implement/IConnector.java +++ /dev/null @@ -1,21 +0,0 @@ -package universalelectricity.core.implement; - -import net.minecraftforge.common.ForgeDirection; - -/** - * Applied to a TileEntity that can connect to UE wires. - * - * @author Calclavia - * - */ -public interface IConnector -{ - /** - * Can this TileEntity visually connect to a wire on this specific side? - * - * @param side - * - The side in which the connection is coming from. - * @return - True if so. - */ - public boolean canConnect(ForgeDirection side); -} diff --git a/src/common/universalelectricity/core/implement/IDisableable.java b/src/common/universalelectricity/core/implement/IDisableable.java index 41af02bd6..2f86ef290 100644 --- a/src/common/universalelectricity/core/implement/IDisableable.java +++ b/src/common/universalelectricity/core/implement/IDisableable.java @@ -12,8 +12,7 @@ public interface IDisableable /** * This is called when the tile entity is to be disabled. * - * @param duration - * - The duration of the disable in ticks. + * @param duration - The duration of the disable in ticks. */ public void onDisable(int duration); diff --git a/src/common/universalelectricity/core/implement/IElectricityProducer.java b/src/common/universalelectricity/core/implement/IElectricityProducer.java deleted file mode 100644 index bae82f9d2..000000000 --- a/src/common/universalelectricity/core/implement/IElectricityProducer.java +++ /dev/null @@ -1,12 +0,0 @@ -package universalelectricity.core.implement; - -/** - * Applied to TileEntities that can produces electricity. Of course, you will still need to call - * ElectricityManager.instance.produce() to actually output the electricity. - * - * @author Calclavia - */ -public interface IElectricityProducer extends IConnector, IDisableable, IVoltage -{ - -} diff --git a/src/common/universalelectricity/core/implement/IElectricityReceiver.java b/src/common/universalelectricity/core/implement/IElectricityReceiver.java deleted file mode 100644 index 52a77d5e4..000000000 --- a/src/common/universalelectricity/core/implement/IElectricityReceiver.java +++ /dev/null @@ -1,40 +0,0 @@ -package universalelectricity.core.implement; - -import net.minecraftforge.common.ForgeDirection; - -/** - * The IElectricityReceiver interface is an interface that must be applied to all TileEntities or - * Entities that can receive electricity. - * - * @author Calclavia - * - */ -public interface IElectricityReceiver extends IDisableable, IConnector, IVoltage -{ - /** - * Called every tick on this machine. - * - * @param sender - * - Either the TileEntity or the Entity sending the electricity to this - * TileEntity/Entity. - * @param amps - * - Amount of amps this electric unit is receiving. - * @param voltage - * - The voltage of the electricity sent. If more than one packet is being sent to - * you in this update, the highest voltage will override. - * @param side - * - The side of the block in which the electricity is coming from. - */ - public void onReceive(Object sender, double amps, double voltage, ForgeDirection side); - - /** - * How many watts does this electrical unit need this tick? Recommended for you to return the - * max electricity storage of this machine (if there is one). - */ - public double wattRequest(); - - /** - * Can this unit receive electricity from this specific side? - */ - public boolean canReceiveFromSide(ForgeDirection side); -} \ No newline at end of file diff --git a/src/common/universalelectricity/core/implement/IItemElectric.java b/src/common/universalelectricity/core/implement/IItemElectric.java index e8ac29a5e..8d365c530 100644 --- a/src/common/universalelectricity/core/implement/IItemElectric.java +++ b/src/common/universalelectricity/core/implement/IItemElectric.java @@ -18,7 +18,7 @@ public interface IItemElectric extends IJouleStorage, IVoltage /** * @return Returns true or false if this consumer can receive electricity at this given tick or - * moment. + * moment. */ public boolean canReceiveElectricity(); diff --git a/src/common/universalelectricity/core/vector/Vector3.java b/src/common/universalelectricity/core/vector/Vector3.java index d4890fdc6..cfa6cdf08 100644 --- a/src/common/universalelectricity/core/vector/Vector3.java +++ b/src/common/universalelectricity/core/vector/Vector3.java @@ -13,7 +13,7 @@ import net.minecraft.src.TileEntity; import net.minecraft.src.Vec3; import net.minecraft.src.World; import net.minecraftforge.common.ForgeDirection; -import universalelectricity.core.implement.IConnector; +import universalelectricity.core.electricity.ElectricityConnections; /** * Vector3 Class is used for defining objects in a 3D space. Vector3 makes it easier to handle the @@ -219,7 +219,7 @@ public class Vector3 extends Vector2 implements Cloneable this.z -= amount.z; } - public void multiply(int amount) + public void multiply(double amount) { this.x *= amount; this.y *= amount; @@ -255,10 +255,8 @@ public class Vector3 extends Vector2 implements Cloneable /** * Saves this Vector3 to disk * - * @param prefix - * - The prefix of this save. Use some unique string. - * @param par1NBTTagCompound - * - The NBT compound object to save the data in + * @param prefix - The prefix of this save. Use some unique string. + * @param par1NBTTagCompound - The NBT compound object to save the data in */ public void writeToNBT(String prefix, NBTTagCompound par1NBTTagCompound) { @@ -290,10 +288,8 @@ public class Vector3 extends Vector2 implements Cloneable /** * Gets a position relative to another position's side * - * @param position - * - The position - * @param side - * - The side. 0-5 + * @param position - The position + * @param side - The side. 0-5 * @return The position relative to the original position's side */ public void modifyPositionFromSide(ForgeDirection side, double amount) @@ -339,9 +335,9 @@ public class Vector3 extends Vector2 implements Cloneable { TileEntity tileEntity = getTileEntityFromSide(world, position, side); - if (tileEntity instanceof IConnector) + if (ElectricityConnections.isConnector(tileEntity)) { - if (((IConnector) tileEntity).canConnect(getOrientationFromSide(side, ForgeDirection.NORTH))) { return tileEntity; } + if (ElectricityConnections.canConnect(tileEntity, getOrientationFromSide(side, ForgeDirection.NORTH))) { return tileEntity; } } return null; @@ -353,11 +349,9 @@ public class Vector3 extends Vector2 implements Cloneable * * Bottom: 0; Top: 1; Back: 2; Front: 3; Left: 4; Right: 5; * - * @param front - * - The direction in which this block is facing/front. Use a number between 0 and 5. - * Default is 3. - * @param side - * - The side you are trying to find. A number between 0 and 5. + * @param front - The direction in which this block is facing/front. Use a number between 0 and + * 5. Default is 3. + * @param side - The side you are trying to find. A number between 0 and 5. * @return The side relative to the facing direction. */ diff --git a/src/common/universalelectricity/prefab/BlockConductor.java b/src/common/universalelectricity/prefab/BlockConductor.java index 3512aa622..3ca1f65c3 100644 --- a/src/common/universalelectricity/prefab/BlockConductor.java +++ b/src/common/universalelectricity/prefab/BlockConductor.java @@ -30,6 +30,8 @@ public abstract class BlockConductor extends BlockContainer ((IConductor) tileEntity).refreshConnectedBlocks(); } } + + world.scheduleBlockUpdate(x, y, z, this.blockID, this.tickRate()); } /** diff --git a/src/common/universalelectricity/prefab/BlockMachine.java b/src/common/universalelectricity/prefab/BlockMachine.java index 24a6c0a15..39d62e5a2 100644 --- a/src/common/universalelectricity/prefab/BlockMachine.java +++ b/src/common/universalelectricity/prefab/BlockMachine.java @@ -13,7 +13,7 @@ import net.minecraft.src.NBTTagCompound; import net.minecraft.src.TileEntity; import net.minecraft.src.World; import universalelectricity.core.implement.IItemElectric; -import universalelectricity.prefab.implement.IWrench; +import universalelectricity.prefab.implement.IToolConfigurator; /** * A block you may extend from to create your machine blocks! You do not have to extend from this @@ -62,45 +62,50 @@ public abstract class BlockMachine extends BlockContainer /** * DO NOT OVERRIDE THIS FUNCTION! Called when the block is right clicked by the player. This * modified version detects electric items and wrench actions on your machine block. Do not - * override this function. Use machineActivated instead! (It does the same thing) + * override this function. Use onMachineActivated instead! (It does the same thing) + * + * @param world The World Object. + * @param x, y, z The coordinate of the block. + * @param side The side the player clicked on. + * @param hitX, hitY, hitZ The position the player clicked on relative to the block. */ @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { - int metadata = par1World.getBlockMetadata(x, y, z); + int metadata = world.getBlockMetadata(x, y, z); /** * Check if the player is holding a wrench or an electric item. If so, do not open the GUI. */ if (par5EntityPlayer.inventory.getCurrentItem() != null) { - if (par5EntityPlayer.inventory.getCurrentItem().getItem() instanceof IWrench) + if (par5EntityPlayer.inventory.getCurrentItem().getItem() instanceof IToolConfigurator) { - par1World.notifyBlocksOfNeighborChange(x, y, z, this.blockID); - ((IWrench) par5EntityPlayer.inventory.getCurrentItem().getItem()).wrenchUsed(par5EntityPlayer, x, y, z); + world.notifyBlocksOfNeighborChange(x, y, z, this.blockID); + ((IToolConfigurator) par5EntityPlayer.inventory.getCurrentItem().getItem()).wrenchUsed(par5EntityPlayer, x, y, z); if (par5EntityPlayer.isSneaking()) { - return this.onSneakUseWrench(par1World, x, y, z, par5EntityPlayer); + return this.onSneakUseWrench(world, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } else { - return this.onUseWrench(par1World, x, y, z, par5EntityPlayer); + return this.onUseWrench(world, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } } else if (par5EntityPlayer.inventory.getCurrentItem().getItem() instanceof IItemElectric) { - if (this.onUseElectricItem(par1World, x, y, z, par5EntityPlayer)) { return true; } + if (this.onUseElectricItem(world, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ)) { return true; } } } if (par5EntityPlayer.isSneaking()) { - return this.onSneakMachineActivated(par1World, x, y, z, par5EntityPlayer); + return this.onSneakMachineActivated(world, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } else { - return this.onMachineActivated(par1World, x, y, z, par5EntityPlayer); + return this.onMachineActivated(world, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } } @@ -109,7 +114,7 @@ public abstract class BlockMachine extends BlockContainer * * @return True if something happens */ - public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } @@ -119,7 +124,7 @@ public abstract class BlockMachine extends BlockContainer * * @return True if something happens */ - public boolean onSneakMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onSneakMachineActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } @@ -129,7 +134,7 @@ public abstract class BlockMachine extends BlockContainer * * @return True if some happens */ - public boolean onUseElectricItem(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onUseElectricItem(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } @@ -139,7 +144,7 @@ public abstract class BlockMachine extends BlockContainer * * @return True if some happens */ - public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } @@ -149,9 +154,9 @@ public abstract class BlockMachine extends BlockContainer * * @return True if some happens */ - public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer) + public boolean onSneakUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { - return this.onUseWrench(par1World, x, y, z, par5EntityPlayer); + return this.onUseWrench(par1World, x, y, z, par5EntityPlayer, side, hitX, hitY, hitZ); } /** diff --git a/src/common/universalelectricity/prefab/ItemElectric.java b/src/common/universalelectricity/prefab/ItemElectric.java index a88cbc579..6eb61a6a9 100644 --- a/src/common/universalelectricity/prefab/ItemElectric.java +++ b/src/common/universalelectricity/prefab/ItemElectric.java @@ -110,8 +110,7 @@ public abstract class ItemElectric extends Item implements IItemElectric * This function sets the electriicty. Do not directly call this function. Try to use * onReceiveElectricity or onUseElectricity instead. * - * @param wattHours - * - The amount of electricity in joules + * @param wattHours - The amount of electricity in joules */ @Override public void setJoules(double wattHours, Object... data) diff --git a/src/common/universalelectricity/prefab/RecipeHelper.java b/src/common/universalelectricity/prefab/RecipeHelper.java index 9fbcedd97..a93e676c0 100644 --- a/src/common/universalelectricity/prefab/RecipeHelper.java +++ b/src/common/universalelectricity/prefab/RecipeHelper.java @@ -8,7 +8,6 @@ import net.minecraft.src.CraftingManager; import net.minecraft.src.IRecipe; import net.minecraft.src.ItemStack; import net.minecraftforge.common.Configuration; -import universalelectricity.core.UEConfig; import cpw.mods.fml.common.registry.GameRegistry; /** @@ -132,7 +131,8 @@ public class RecipeHelper } /** - * Removes all recipes found that has this output. + * Removes all recipes found that has this output. You may use this with Forge Ore Dictionary to + * remove all recipes with the FoD ID. * * @return True if successful */ @@ -170,14 +170,18 @@ public class RecipeHelper /** * Use this function if you want to check if the recipe is allowed in the configuration file. */ - public static void addRecipe(IRecipe recipe, String name, Configuration config, boolean defaultBoolean) + public static void addRecipe(IRecipe recipe, String name, Configuration configuration, boolean defaultBoolean) { - if (config != null) + if (configuration != null) { - if (UEConfig.getConfigData(config, "Allow " + name + " Crafting", defaultBoolean)) + configuration.load(); + + if (configuration.get("Crafting", "Allow " + name + " Crafting", defaultBoolean).getBoolean(defaultBoolean)) { GameRegistry.addRecipe(recipe); } + + configuration.save(); } } diff --git a/src/common/universalelectricity/prefab/UpdateNotifier.java b/src/common/universalelectricity/prefab/UpdateNotifier.java new file mode 100644 index 000000000..1b8beaec6 --- /dev/null +++ b/src/common/universalelectricity/prefab/UpdateNotifier.java @@ -0,0 +1,113 @@ +package universalelectricity.prefab; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.minecraft.src.EntityPlayer; +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.IPlayerTracker; +import cpw.mods.fml.common.registry.GameRegistry; + +/** + * A class used to search online and check for updates for your mod and notify the player. + * + * @author Calclavia + * + */ +public class UpdateNotifier implements IPlayerTracker +{ + public static final UpdateNotifier INSTANCE = new UpdateNotifier(); + public static boolean isInitialized = false; + + public static final HashMap modsToUpdate = new HashMap(); + + /** + * Call this in your FML Pre-Initialize Event. + * + * @param modName The name of your mod. + * @param currentVersion The current version of your mod. + * @param updateUrl The web address of your text file containing the latest version number. + * @return The latest version number, empty if fail to check for update. + */ + public final String checkUpdate(String modName, String currentVersion, String updateUrl) + { + if (!isInitialized) + { + GameRegistry.registerPlayerTracker(this); + isInitialized = true; + } + + String latestUpdate = getLatestVersion(updateUrl); + + if (latestUpdate != null && latestUpdate != "" && !latestUpdate.equals(currentVersion.trim())) + { + modsToUpdate.put(modName, latestUpdate); + } + + return latestUpdate; + } + + /** + * Allows you to check for updates for your mod. + * + * @param updateUrl The web address of your text file containing the latest version number. + * @return The latest version number, empty if fail to check for update. + */ + public static final String getLatestVersion(String updateUrl) + { + try + { + URL versionFile = new URL(updateUrl); + BufferedReader reader = new BufferedReader(new InputStreamReader(versionFile.openStream())); + return reader.readLine(); + } + catch (Exception e) + { + FMLLog.severe("Failed to check for mod updates."); + } + + return ""; + } + + @Override + public void onPlayerLogin(EntityPlayer player) + { + if (modsToUpdate.size() > 0) + { + String notification = "You have " + modsToUpdate.size() + " mod(s) that needs to be updated: "; + + Iterator it = modsToUpdate.entrySet().iterator(); + + while (it.hasNext()) + { + Map.Entry pairs = (Map.Entry) it.next(); + + notification += pairs.getKey() + " [" + pairs.getValue() + "] "; + } + + player.addChatMessage(notification); + } + } + + @Override + public void onPlayerLogout(EntityPlayer player) + { + + } + + @Override + public void onPlayerChangedDimension(EntityPlayer player) + { + + } + + @Override + public void onPlayerRespawn(EntityPlayer player) + { + + } +} diff --git a/src/common/universalelectricity/prefab/implement/IRotatable.java b/src/common/universalelectricity/prefab/implement/IRotatable.java index 77228a531..897993f55 100644 --- a/src/common/universalelectricity/prefab/implement/IRotatable.java +++ b/src/common/universalelectricity/prefab/implement/IRotatable.java @@ -18,16 +18,15 @@ public interface IRotatable * entity. * * @return The facing side from 0-5 The full list of which side the number represents is in the - * UniversalElectricity class. + * UniversalElectricity class. */ public ForgeDirection getDirection(); /** * Sets the facing direction of the tile entity. * - * @param facingDirection - * - A direction from 0-5. The full list of which side the number represents is in - * the UniversalElectricity class. + * @param facingDirection - A direction from 0-5. The full list of which side the number + * represents is in the UniversalElectricity class. */ public void setDirection(ForgeDirection facingDirection); } diff --git a/src/common/universalelectricity/prefab/implement/ITier.java b/src/common/universalelectricity/prefab/implement/ITier.java index 2cd0b60a4..6c6801f2e 100644 --- a/src/common/universalelectricity/prefab/implement/ITier.java +++ b/src/common/universalelectricity/prefab/implement/ITier.java @@ -18,8 +18,7 @@ public interface ITier /** * Sets the tier of the object * - * @param tier - * - The tier to be set + * @param tier - The tier to be set */ public void setTier(int tier); } diff --git a/src/common/universalelectricity/prefab/implement/IWrench.java b/src/common/universalelectricity/prefab/implement/IToolConfigurator.java similarity index 63% rename from src/common/universalelectricity/prefab/implement/IWrench.java rename to src/common/universalelectricity/prefab/implement/IToolConfigurator.java index ce3cebf38..1932b16ed 100644 --- a/src/common/universalelectricity/prefab/implement/IWrench.java +++ b/src/common/universalelectricity/prefab/implement/IToolConfigurator.java @@ -3,21 +3,20 @@ package universalelectricity.prefab.implement; import net.minecraft.src.EntityPlayer; /** - * Code written by Buildcraft. + * Code written by Buildcraft. Applied to items that acts as a block configurator such as wrenches, + * screw drivers and such. * * @author Buildcraft Team */ -public interface IWrench +public interface IToolConfigurator { /*** * Called to ensure that the wrench can be used. To get the ItemStack that is used, check * player.inventory.getCurrentItem() * - * @param player - * - The player doing the wrenching - * @param x - * ,y,z - The coordinates for the block being wrenched + * @param player - The player doing the wrenching + * @param x ,y,z - The coordinates for the block being wrenched * * @return true if wrenching is allowed, false if not */ @@ -27,10 +26,8 @@ public interface IWrench * Callback after the wrench has been used. This can be used to decrease durability or for other * purposes. To get the ItemStack that was used, check player.inventory.getCurrentItem() * - * @param player - * - The player doing the wrenching - * @param x - * ,y,z - The coordinates of the block being wrenched + * @param player - The player doing the wrenching + * @param x ,y,z - The coordinates of the block being wrenched */ public void wrenchUsed(EntityPlayer player, int x, int y, int z); } diff --git a/src/common/universalelectricity/prefab/modifier/IModifier.java b/src/common/universalelectricity/prefab/modifier/IModifier.java new file mode 100644 index 000000000..e95cfd962 --- /dev/null +++ b/src/common/universalelectricity/prefab/modifier/IModifier.java @@ -0,0 +1,22 @@ +package universalelectricity.prefab.modifier; + +import net.minecraft.src.ItemStack; + +/** + * This must be applied to an item that acts as a modifier or an upgrade. + * + * @author Calclavia + * + */ +public interface IModifier +{ + /** + * @return - The name of the modifier. + */ + public String getName(ItemStack itemstack); + + /** + * @return - How much effect does this modifier have? + */ + public int getEffectiveness(ItemStack itemstack); +} diff --git a/src/common/universalelectricity/prefab/modifier/SlotModifier.java b/src/common/universalelectricity/prefab/modifier/SlotModifier.java new file mode 100644 index 000000000..fab96f3b7 --- /dev/null +++ b/src/common/universalelectricity/prefab/modifier/SlotModifier.java @@ -0,0 +1,29 @@ +package universalelectricity.prefab.modifier; + +import net.minecraft.src.IInventory; +import net.minecraft.src.ItemStack; +import net.minecraft.src.Slot; + +/** + * This slot should be used by any container that contains an item that is a modifier. An example of + * this would be upgrade slots. + * + * @author Calclavia + * + */ +public class SlotModifier extends Slot +{ + public SlotModifier(IInventory par2IInventory, int par3, int par4, int par5) + { + super(par2IInventory, par3, par4, par5); + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for the armor slots. + */ + @Override + public boolean isItemValid(ItemStack par1ItemStack) + { + return par1ItemStack.getItem() instanceof IModifier; + } +} diff --git a/src/common/universalelectricity/prefab/multiblock/IMultiBlock.java b/src/common/universalelectricity/prefab/multiblock/IMultiBlock.java index 52d786ceb..ffe68f25f 100644 --- a/src/common/universalelectricity/prefab/multiblock/IMultiBlock.java +++ b/src/common/universalelectricity/prefab/multiblock/IMultiBlock.java @@ -15,16 +15,14 @@ public interface IMultiBlock extends IBlockActivate /** * Called when this multiblock is created * - * @param placedPosition - * - The position the block was placed at + * @param placedPosition - The position the block was placed at */ public void onCreate(Vector3 placedPosition); /** * Called when one of the multiblocks of this block is destroyed * - * @param callingBlock - * - The tile entity who called the onDestroy function + * @param callingBlock - The tile entity who called the onDestroy function */ public void onDestroy(TileEntity callingBlock); } diff --git a/src/common/universalelectricity/prefab/network/PacketManager.java b/src/common/universalelectricity/prefab/network/PacketManager.java index 5a9fb7177..fbd667009 100644 --- a/src/common/universalelectricity/prefab/network/PacketManager.java +++ b/src/common/universalelectricity/prefab/network/PacketManager.java @@ -25,9 +25,9 @@ import cpw.mods.fml.common.network.Player; * directly use this by registering this packet manager with NetworkMod. Example: * * @NetworkMod(channels = { "BasicComponents" }, clientSideRequired = true, serverSideRequired = - * false, packetHandler = PacketManager.class) + * false, packetHandler = PacketManager.class) * - * Check out {@link #BasicComponents} for better reference. + * Check out {@link #BasicComponents} for better reference. * * @author Calclavia */ diff --git a/src/common/universalelectricity/prefab/ore/OreGenBase.java b/src/common/universalelectricity/prefab/ore/OreGenBase.java new file mode 100644 index 000000000..66ccfe68a --- /dev/null +++ b/src/common/universalelectricity/prefab/ore/OreGenBase.java @@ -0,0 +1,99 @@ +package universalelectricity.prefab.ore; + +import java.util.Random; + +import net.minecraft.src.Block; +import net.minecraft.src.IChunkProvider; +import net.minecraft.src.ItemStack; +import net.minecraft.src.World; +import net.minecraftforge.common.Configuration; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.oredict.OreDictionary; +import universalelectricity.core.UniversalElectricity; + +/** + * This class is used for storing ore generation data. If you are too lazy to generate your own + * ores, you can do {@link #OreGenerator.ORES_TO_GENERATE.add()} to add your ore to the list of ores + * to generate. + * + * @author Calclavia + * + */ +public abstract class OreGenBase +{ + public String name; + + public String oreDictionaryName; + + public boolean shouldGenerate; + + public int blockIndexTexture; + + public ItemStack oreStack; + + public int oreID; + + public int oreMeta; + + /** + * What harvest level does this machine need to be acquired? + */ + public int harvestLevel; + + /** + * The predefined tool classes are "pickaxe", "shovel", "axe". You can add others for custom + * tools. + */ + public String harvestTool; + + /** + * @param name - The name of the ore for display + * @param textureFile - The 16x16 png texture of your ore to override + * @param minGenerateLevel - The highest generation level of your ore + * @param maxGenerateLevel - The lowest generation level of your ore + * @param amountPerChunk - The amount of ores to generate per chunk + * @param amountPerBranch - The amount of ores to generate in a clutter. E.g coal generates with + * a lot of other coal next to it. How much do you want? + */ + public OreGenBase(String name, String oreDiectionaryName, ItemStack stack, String harvestTool, int harvestLevel) + { + this.name = name; + this.shouldGenerate = false; + this.harvestTool = harvestTool; + this.harvestLevel = harvestLevel; + this.oreDictionaryName = oreDiectionaryName; + this.oreStack = stack; + this.oreID = stack.itemID; + this.oreMeta = stack.getItemDamage(); + + OreDictionary.registerOre(oreDictionaryName, stack); + MinecraftForge.setBlockHarvestLevel(Block.blocksList[stack.itemID], stack.getItemDamage(), harvestTool, harvestLevel); + } + + public OreGenBase enable(Configuration config) + { + this.shouldGenerate = shouldGenerateOre(config, this.name); + return this; + } + + public OreGenBase enable() + { + this.enable(UniversalElectricity.CONFIGURATION); + return this; + } + + /** + * Checks the config file and see if Universal Electricity should generate this ore + */ + private static boolean shouldGenerateOre(Configuration configuration, String oreName) + { + configuration.load(); + boolean shouldGenerate = configuration.get("Ore Generation", "Generate " + oreName, true).getBoolean(true); + configuration.save(); + return shouldGenerate; + } + + public abstract void generate(World world, Random random, int varX, int varZ); + + public abstract boolean isOreGeneratedInWorld(World world, IChunkProvider chunkGenerator); +} diff --git a/src/common/universalelectricity/prefab/ore/OreGenReplace.java b/src/common/universalelectricity/prefab/ore/OreGenReplace.java new file mode 100644 index 000000000..3bb7f7d01 --- /dev/null +++ b/src/common/universalelectricity/prefab/ore/OreGenReplace.java @@ -0,0 +1,126 @@ +package universalelectricity.prefab.ore; + +import java.util.Random; + +import net.minecraft.src.ChunkProviderEnd; +import net.minecraft.src.ChunkProviderGenerate; +import net.minecraft.src.ChunkProviderHell; +import net.minecraft.src.IChunkProvider; +import net.minecraft.src.ItemStack; +import net.minecraft.src.MathHelper; +import net.minecraft.src.World; + +/** + * This class is used for storing ore generation data. If you are too lazy to generate your own + * ores, you can do {@link #OreGenerator.ORES_TO_GENERATE.add()} to add your ore to the list of ores + * to generate. + * + * @author Calclavia + * + */ +public class OreGenReplace extends OreGenBase +{ + + public int minGenerateLevel; + public int maxGenerateLevel; + public int amountPerChunk; + public int amountPerBranch; + public int replaceID; + + public boolean generateSurface; + public boolean generateNether; + public boolean generateEnd; + + /** + * @param name - The name of the ore for display + * @param textureFile - The 16x16 png texture of your ore to override + * @param minGenerateLevel - The highest generation level of your ore + * @param maxGenerateLevel - The lowest generation level of your ore + * @param amountPerChunk - The amount of ores to generate per chunk + * @param amountPerBranch - The amount of ores to generate in a clutter. E.g coal generates with + * a lot of other coal next to it. How much do you want? + */ + public OreGenReplace(String name, String oreDiectionaryName, ItemStack stack, int replaceID, int minGenerateLevel, int maxGenerateLevel, int amountPerChunk, int amountPerBranch, String harvestTool, int harvestLevel) + { + super(name, oreDiectionaryName, stack, harvestTool, harvestLevel); + this.minGenerateLevel = minGenerateLevel; + this.maxGenerateLevel = maxGenerateLevel; + this.amountPerChunk = amountPerChunk; + this.amountPerBranch = amountPerBranch; + this.replaceID = replaceID; + } + + public void generate(World world, Random random, int varX, int varZ) + { + + for (int i = 0; i < this.amountPerChunk; i++) + { + int x = varX + random.nextInt(16); + int z = varZ + random.nextInt(16); + int y = random.nextInt(this.maxGenerateLevel - this.minGenerateLevel) + this.minGenerateLevel; + generateReplace(world, random, x, y, z); + } + } + + public boolean generateReplace(World par1World, Random par2Random, int par3, int par4, int par5) + { + float var6 = par2Random.nextFloat() * (float) Math.PI; + double var7 = (double) ((float) (par3 + 8) + MathHelper.sin(var6) * (float) this.amountPerBranch / 8.0F); + double var9 = (double) ((float) (par3 + 8) - MathHelper.sin(var6) * (float) this.amountPerBranch / 8.0F); + double var11 = (double) ((float) (par5 + 8) + MathHelper.cos(var6) * (float) this.amountPerBranch / 8.0F); + double var13 = (double) ((float) (par5 + 8) - MathHelper.cos(var6) * (float) this.amountPerBranch / 8.0F); + double var15 = (double) (par4 + par2Random.nextInt(3) - 2); + double var17 = (double) (par4 + par2Random.nextInt(3) - 2); + + for (int var19 = 0; var19 <= this.amountPerBranch; ++var19) + { + double var20 = var7 + (var9 - var7) * (double) var19 / (double) this.amountPerBranch; + double var22 = var15 + (var17 - var15) * (double) var19 / (double) this.amountPerBranch; + double var24 = var11 + (var13 - var11) * (double) var19 / (double) this.amountPerBranch; + double var26 = par2Random.nextDouble() * (double) this.amountPerBranch / 16.0D; + double var28 = (double) (MathHelper.sin((float) var19 * (float) Math.PI / (float) this.amountPerBranch) + 1.0F) * var26 + 1.0D; + double var30 = (double) (MathHelper.sin((float) var19 * (float) Math.PI / (float) this.amountPerBranch) + 1.0F) * var26 + 1.0D; + int var32 = MathHelper.floor_double(var20 - var28 / 2.0D); + int var33 = MathHelper.floor_double(var22 - var30 / 2.0D); + int var34 = MathHelper.floor_double(var24 - var28 / 2.0D); + int var35 = MathHelper.floor_double(var20 + var28 / 2.0D); + int var36 = MathHelper.floor_double(var22 + var30 / 2.0D); + int var37 = MathHelper.floor_double(var24 + var28 / 2.0D); + + for (int var38 = var32; var38 <= var35; ++var38) + { + double var39 = ((double) var38 + 0.5D - var20) / (var28 / 2.0D); + + if (var39 * var39 < 1.0D) + { + for (int var41 = var33; var41 <= var36; ++var41) + { + double var42 = ((double) var41 + 0.5D - var22) / (var30 / 2.0D); + + if (var39 * var39 + var42 * var42 < 1.0D) + { + for (int var44 = var34; var44 <= var37; ++var44) + { + double var45 = ((double) var44 + 0.5D - var24) / (var28 / 2.0D); + + int block = par1World.getBlockId(var38, var41, var44); + if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && (this.replaceID == 0 || block == this.replaceID)) + { + par1World.setBlockAndMetadata(var38, var41, var44, this.oreID, this.oreMeta); + } + } + } + } + } + } + } + + return true; + } + + @Override + public boolean isOreGeneratedInWorld(World world, IChunkProvider chunkGenerator) + { + return ((this.generateSurface && chunkGenerator instanceof ChunkProviderGenerate) || (this.generateNether && chunkGenerator instanceof ChunkProviderHell) || (this.generateEnd && chunkGenerator instanceof ChunkProviderEnd)); + } +} diff --git a/src/common/universalelectricity/prefab/ore/OreGenReplaceStone.java b/src/common/universalelectricity/prefab/ore/OreGenReplaceStone.java new file mode 100644 index 000000000..463fa2bc1 --- /dev/null +++ b/src/common/universalelectricity/prefab/ore/OreGenReplaceStone.java @@ -0,0 +1,18 @@ +package universalelectricity.prefab.ore; + +import net.minecraft.src.ItemStack; + +public class OreGenReplaceStone extends OreGenReplace +{ + public OreGenReplaceStone(String name, String oreDiectionaryName, ItemStack stack, int replaceID, int minGenerateLevel, int maxGenerateLevel, int amountPerChunk, int amountPerBranch, String harvestTool, int harvestLevel) + { + super(name, oreDiectionaryName, stack, 1, minGenerateLevel, maxGenerateLevel, amountPerChunk, amountPerBranch, harvestTool, harvestLevel); + this.generateSurface = true; + } + + // A simplified version of the constructor + public OreGenReplaceStone(String name, String oreDiectionaryName, ItemStack stack, int replaceID, int maxGenerateLevel, int amountPerChunk, int amountPerBranch) + { + this(name, oreDiectionaryName, stack, 0, replaceID, maxGenerateLevel, amountPerChunk, amountPerBranch, "pickaxe", 1); + } +} \ No newline at end of file diff --git a/src/common/universalelectricity/prefab/ore/OreGenerator.java b/src/common/universalelectricity/prefab/ore/OreGenerator.java new file mode 100644 index 000000000..68a1a1dfd --- /dev/null +++ b/src/common/universalelectricity/prefab/ore/OreGenerator.java @@ -0,0 +1,75 @@ +package universalelectricity.prefab.ore; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.src.IChunkProvider; +import net.minecraft.src.World; +import cpw.mods.fml.common.IWorldGenerator; +import cpw.mods.fml.common.registry.GameRegistry; + +public class OreGenerator implements IWorldGenerator +{ + public static boolean isInitiated = false; + + /** + * Add your ore data to this list of ores for it to automatically generate! No hassle indeed! + */ + private static final List ORES_TO_GENERATE = new ArrayList(); + + /** + * Adds an ore to the ore generate list. Do this in pre-init. + */ + public static void addOre(OreGenBase data) + { + if (!isInitiated) + { + GameRegistry.registerWorldGenerator(new OreGenerator()); + } + + ORES_TO_GENERATE.add(data); + } + + /** + * Checks to see if this ore + * + * @param oreName + * @return + */ + public static boolean oreExists(String oreName) + { + for (OreGenBase ore : ORES_TO_GENERATE) + { + if (ore.oreDictionaryName == oreName) { return true; } + } + + return false; + } + + /** + * Removes an ore to the ore generate list. Do this in init. + */ + public static void removeOre(OreGenBase data) + { + ORES_TO_GENERATE.remove(data); + } + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) + { + chunkX = chunkX << 4; + chunkZ = chunkZ << 4; + + // Checks to make sure this is the normal + // world + for (OreGenBase oreData : ORES_TO_GENERATE) + { + if (oreData.shouldGenerate && oreData.isOreGeneratedInWorld(world, chunkGenerator)) + { + oreData.generate(world, rand, chunkX, chunkZ); + } + + } + } +} diff --git a/src/common/universalelectricity/prefab/potion/CustomPotion.java b/src/common/universalelectricity/prefab/potion/CustomPotion.java new file mode 100644 index 000000000..3a296c147 --- /dev/null +++ b/src/common/universalelectricity/prefab/potion/CustomPotion.java @@ -0,0 +1,37 @@ +package universalelectricity.prefab.potion; + +import net.minecraft.src.Potion; +import cpw.mods.fml.common.registry.LanguageRegistry; + +public abstract class CustomPotion extends Potion +{ + /** + * Creates a new type of potion + * + * @param id - The ID of this potion. Make it greater than 20. + * @param isBadEffect - Is this potion a good potion or a bad one? + * @param color - The color of this potion. + * @param name - The name of this potion. + */ + public CustomPotion(int id, boolean isBadEffect, int color, String name) + { + super(id, isBadEffect, color); + this.setPotionName("potion." + name); + LanguageRegistry.instance().addStringLocalization(this.getName(), name); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } + + /** + * You must register all your potion effects during mod initialization! + */ + public void register() + { + Potion.potionTypes[this.getId()] = this; + } +} diff --git a/src/common/universalelectricity/prefab/potion/CustomPotionEffect.java b/src/common/universalelectricity/prefab/potion/CustomPotionEffect.java new file mode 100644 index 000000000..da4818e8b --- /dev/null +++ b/src/common/universalelectricity/prefab/potion/CustomPotionEffect.java @@ -0,0 +1,40 @@ +package universalelectricity.prefab.potion; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.src.ItemStack; +import net.minecraft.src.Potion; +import net.minecraft.src.PotionEffect; + +public class CustomPotionEffect extends PotionEffect +{ + public CustomPotionEffect(int potionID, int duration, int amplifier) + { + super(potionID, duration, amplifier); + } + + public CustomPotionEffect(Potion potion, int duration, int amplifier) + { + this(potion.getId(), duration, amplifier); + } + + /** + * Creates a potion effect with custom curable items. + * + * @param curativeItems - ItemStacks that can cure this potion effect + */ + public CustomPotionEffect(int potionID, int duration, int amplifier, List curativeItems) + { + super(potionID, duration, amplifier); + + if (curativeItems == null) + { + this.setCurativeItems(new ArrayList()); + } + else + { + this.setCurativeItems(curativeItems); + } + } +} diff --git a/src/common/universalelectricity/prefab/repair/IRepairable.java b/src/common/universalelectricity/prefab/repair/IRepairable.java new file mode 100644 index 000000000..f8c9d370c --- /dev/null +++ b/src/common/universalelectricity/prefab/repair/IRepairable.java @@ -0,0 +1,31 @@ +package universalelectricity.prefab.repair; + +import net.minecraft.src.EntityPlayer; + +/** + * Applied to TileEntities/Machines that can be repaired. + * + * @author Calclavia + * + */ +public interface IRepairable +{ + /** + * Called when the machine is being repaired. + * + * @param itemStack - The repairing tool that the player is holding + * @param player - The player who is repairing this machine. + */ + public void onRepair(IToolRepair itemStack, EntityPlayer player); + + /** + * @return The maximum possible damage of this machine. + */ + public int getMaxDamage(); + + /** + * @return How damaged is this machine? + */ + public int getDamage(); + +} diff --git a/src/common/universalelectricity/prefab/repair/IToolRepair.java b/src/common/universalelectricity/prefab/repair/IToolRepair.java new file mode 100644 index 000000000..d1adceed9 --- /dev/null +++ b/src/common/universalelectricity/prefab/repair/IToolRepair.java @@ -0,0 +1,19 @@ +package universalelectricity.prefab.repair; + +import net.minecraft.src.ItemStack; + +public interface IToolRepair +{ + /** + * A unique ID for mods to recognize what repair tool this is. + */ + public String getID(); + + /** + * How effective is this repairing tool? + * + * @param itemStack The ItemStack + * @return A effectiveness value. + */ + public int getEffectiveness(ItemStack itemStack); +} diff --git a/src/common/universalelectricity/prefab/tile/TileEntityConductor.java b/src/common/universalelectricity/prefab/tile/TileEntityConductor.java index d73833cf9..b6a7cbfb5 100644 --- a/src/common/universalelectricity/prefab/tile/TileEntityConductor.java +++ b/src/common/universalelectricity/prefab/tile/TileEntityConductor.java @@ -1,15 +1,16 @@ package universalelectricity.prefab.tile; +import java.util.EnumSet; + import net.minecraft.src.EntityPlayer; import net.minecraft.src.INetworkManager; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.TileEntity; -import net.minecraft.src.World; import net.minecraftforge.common.ForgeDirection; -import universalelectricity.core.electricity.ElectricityManager; +import universalelectricity.core.electricity.Electricity; +import universalelectricity.core.electricity.ElectricityConnections; import universalelectricity.core.electricity.ElectricityNetwork; import universalelectricity.core.implement.IConductor; -import universalelectricity.core.implement.IConnector; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.network.IPacketReceiver; @@ -33,6 +34,7 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements public TileEntityConductor() { + ElectricityConnections.registerConnector(this, EnumSet.range(ForgeDirection.DOWN, ForgeDirection.EAST)); this.reset(); } @@ -51,13 +53,7 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements @Override public TileEntity[] getConnectedBlocks() { - return connectedBlocks; - } - - @Override - public void initiate() - { - this.refreshConnectedBlocks(); + return this.connectedBlocks; } @Override @@ -65,13 +61,13 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements { if (tileEntity != null) { - if (tileEntity instanceof IConnector) + if (ElectricityConnections.isConnector(tileEntity)) { this.connectedBlocks[side.ordinal()] = tileEntity; if (tileEntity.getClass() == this.getClass()) { - ElectricityManager.instance.mergeConnection(this.getNetwork(), ((TileEntityConductor) tileEntity).getNetwork()); + Electricity.instance.mergeConnection(this.getNetwork(), ((TileEntityConductor) tileEntity).getNetwork()); } return; @@ -82,7 +78,7 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements { if (this.connectedBlocks[side.ordinal()] instanceof IConductor) { - ElectricityManager.instance.splitConnection(this, (IConductor) this.getConnectedBlocks()[side.ordinal()]); + Electricity.instance.splitConnection(this, (IConductor) this.getConnectedBlocks()[side.ordinal()]); } } @@ -94,13 +90,13 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements { if (tileEntity != null) { - if (tileEntity instanceof IConnector) + if (ElectricityConnections.isConnector(tileEntity)) { this.connectedBlocks[side.ordinal()] = tileEntity; if (tileEntity.getClass() == this.getClass()) { - ElectricityManager.instance.mergeConnection(this.getNetwork(), ((TileEntityConductor) tileEntity).getNetwork()); + Electricity.instance.mergeConnection(this.getNetwork(), ((TileEntityConductor) tileEntity).getNetwork()); } return; @@ -119,15 +115,10 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements } } - /** - * Determines if this TileEntity requires update calls. - * - * @return True if you want updateEntity() to be called, false if not - */ @Override - public boolean canUpdate() + public void initiate() { - return false; + this.refreshConnectedBlocks(); } @Override @@ -135,9 +126,9 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements { this.network = null; - if (ElectricityManager.instance != null) + if (Electricity.instance != null) { - ElectricityManager.instance.registerConductor(this); + Electricity.instance.registerConductor(this); } } @@ -152,16 +143,4 @@ public abstract class TileEntityConductor extends TileEntityAdvanced implements } } } - - @Override - public World getWorld() - { - return this.worldObj; - } - - @Override - public boolean canConnect(ForgeDirection side) - { - return true; - } } diff --git a/src/common/universalelectricity/prefab/tile/TileEntityElectricityProducer.java b/src/common/universalelectricity/prefab/tile/TileEntityElectricityProducer.java new file mode 100644 index 000000000..78457a010 --- /dev/null +++ b/src/common/universalelectricity/prefab/tile/TileEntityElectricityProducer.java @@ -0,0 +1,40 @@ +package universalelectricity.prefab.tile; + +import java.util.EnumSet; + +import net.minecraftforge.common.ForgeDirection; +import universalelectricity.core.electricity.Electricity; +import universalelectricity.core.electricity.ElectricityConnections; +import universalelectricity.core.implement.IVoltage; + +/** + * An easier way to implement the methods from IElectricityReceiver with default values set. + * + * @author Calclavia + */ +public abstract class TileEntityElectricityProducer extends TileEntityDisableable implements IVoltage +{ + public TileEntityElectricityProducer() + { + super(); + ElectricityConnections.registerConnector(this, EnumSet.range(ForgeDirection.DOWN, ForgeDirection.EAST)); + } + + @Override + public void updateEntity() + { + super.updateEntity(); + } + + @Override + public double getVoltage() + { + return 120; + } + + @Override + public void invalidate() + { + Electricity.instance.unregister(this); + } +} diff --git a/src/common/universalelectricity/prefab/tile/TileEntityElectricityReceiver.java b/src/common/universalelectricity/prefab/tile/TileEntityElectricityReceiver.java index 187fc5af4..04482d228 100644 --- a/src/common/universalelectricity/prefab/tile/TileEntityElectricityReceiver.java +++ b/src/common/universalelectricity/prefab/tile/TileEntityElectricityReceiver.java @@ -1,18 +1,23 @@ package universalelectricity.prefab.tile; +import java.util.EnumSet; + import net.minecraftforge.common.ForgeDirection; -import universalelectricity.core.implement.IElectricityReceiver; +import universalelectricity.core.electricity.Electricity; +import universalelectricity.core.electricity.ElectricityConnections; +import universalelectricity.core.implement.IVoltage; /** * An easier way to implement the methods from IElectricityReceiver with default values set. * * @author Calclavia */ -public abstract class TileEntityElectricityReceiver extends TileEntityDisableable implements IElectricityReceiver +public abstract class TileEntityElectricityReceiver extends TileEntityDisableable implements IVoltage { public TileEntityElectricityReceiver() { super(); + ElectricityConnections.registerConnector(this, EnumSet.range(ForgeDirection.DOWN, ForgeDirection.EAST)); } @Override @@ -20,16 +25,16 @@ public abstract class TileEntityElectricityReceiver extends TileEntityDisableabl { super.updateEntity(); } - - @Override - public boolean canConnect(ForgeDirection side) - { - return this.canReceiveFromSide(side); - } - + @Override public double getVoltage() { return 120; } + + @Override + public void invalidate() + { + Electricity.instance.unregister(this); + } }