v4.2.3 Release

*Updated to 1.4.2.
*Add 'getMaxEnergy' command to machines and power units.
*Add 'getEnergyNeeded' command to machines and power units.
*Add crafting recipes and creative tab assignment for machine upgrades.
*Add power transfer system for power units, so energy can be
transferred without needing UE, IC2, or BC.
*Bugfixes.
This commit is contained in:
Aidan Brady 2012-10-25 17:55:32 -04:00
parent d8634f5615
commit 7e4f1e7a1b
135 changed files with 3562 additions and 3579 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -23,5 +23,5 @@ public interface IEnergyStorage {
* *
* @return Energy output in EU/t * @return Energy output in EU/t
*/ */
public int getOutput(); public int getRate();
} }

View file

@ -165,7 +165,7 @@ public class ContainerAdvancedElectricMachine extends Container
return null; return null;
} }
currentSlot.onPickupFromSlot(slotStack); currentSlot.putStack(slotStack);
} }
return stack; return stack;

View file

@ -122,7 +122,7 @@ public class ContainerElectricMachine extends Container
return null; return null;
} }
currentSlot.onPickupFromSlot(slotStack); currentSlot.putStack(slotStack);
} }
return stack; return stack;

View file

@ -91,7 +91,7 @@ public class ContainerPowerUnit extends Container
return null; return null;
} }
currentSlot.onPickupFromSlot(slotStack); currentSlot.putStack(slotStack);
} }
return stack; return stack;

View file

@ -97,7 +97,7 @@ public class EntityObsidianTNT extends Entity
private void explode() private void explode()
{ {
worldObj.createExplosion((Entity)null, posX, posY, posZ, ObsidianIngots.ObsidianTNTBlastRadius); worldObj.createExplosion((Entity)null, posX, posY, posZ, ObsidianIngots.ObsidianTNTBlastRadius, true);
hasExploded = true; hasExploded = true;
} }

View file

@ -4,7 +4,7 @@ import java.util.List;
import obsidian.api.IEnergizedItem; import obsidian.api.IEnergizedItem;
import universalelectricity.UniversalElectricity; import universalelectricity.core.UniversalElectricity;
import universalelectricity.electricity.ElectricInfo; import universalelectricity.electricity.ElectricInfo;
import universalelectricity.implement.IItemElectric; import universalelectricity.implement.IItemElectric;
@ -28,7 +28,7 @@ public class ItemEnergized extends ItemObsidian implements IEnergizedItem, IItem
setCreativeTab(CreativeTabs.tabRedstone); setCreativeTab(CreativeTabs.tabRedstone);
} }
public void addInformation(ItemStack itemstack, List list) public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag)
{ {
int energy = getEnergy(itemstack); int energy = getEnergy(itemstack);

View file

@ -2,6 +2,7 @@ package net.uberkat.obsidian.common;
import java.util.List; import java.util.List;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import obsidian.api.IMachineUpgrade; import obsidian.api.IMachineUpgrade;
@ -11,5 +12,6 @@ public class ItemMachineUpgrade extends ItemObsidian implements IMachineUpgrade
{ {
super(i); super(i);
setMaxStackSize(1); setMaxStackSize(1);
setCreativeTab(CreativeTabs.tabRedstone);
} }
} }

View file

@ -65,7 +65,7 @@ public class ItemObsidianBow extends ItemObsidian
if (f == 1.0F) if (f == 1.0F)
{ {
entityarrow.func_70243_d(true); entityarrow.setIsCritical(true);
} }
int j = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, itemstack); int j = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, itemstack);

View file

@ -16,9 +16,9 @@ public class ItemObsidianHoe extends ItemObsidian
* Callback for item usage. If the item does something special on right clicking, he will have one of those. Return * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
* True if something happen and false if it don't. This is for ITEMS, not BLOCKS ! * True if something happen and false if it don't. This is for ITEMS, not BLOCKS !
*/ */
public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7) public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
{ {
if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6)) if (!par2EntityPlayer.func_82247_a(par4, par5, par6, par7, par1ItemStack))
{ {
return false; return false;
} }

View file

@ -503,6 +503,15 @@ public class ObsidianIngots
GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 3), new Object[] { GameRegistry.addRecipe(new ItemStack(MachineBlock, 1, 3), new Object[] {
"***", "*L*", "***", Character.valueOf('*'), PlatinumIngot, Character.valueOf('L'), Item.bucketLava "***", "*L*", "***", Character.valueOf('*'), PlatinumIngot, Character.valueOf('L'), Item.bucketLava
}); });
GameRegistry.addRecipe(new ItemStack(SpeedUpgrade), new Object[] {
"PAP", "ARA", "PAP", Character.valueOf('P'), PlatinumDust, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('E'), Item.emerald
});
GameRegistry.addRecipe(new ItemStack(EnergyUpgrade), new Object[] {
"RAR", "AEA", "RAR", Character.valueOf('R'), Item.redstone, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('E'), Item.emerald
});
GameRegistry.addRecipe(new ItemStack(UltimateUpgrade), new Object[] {
"ERA", "RDR", "ARS", Character.valueOf('E'), EnergyUpgrade, Character.valueOf('R'), Item.redstone, Character.valueOf('A'), EnrichedAlloy, Character.valueOf('D'), Item.diamond, Character.valueOf('S'), SpeedUpgrade
});
if(extrasEnabled) if(extrasEnabled)
{ {

View file

@ -13,7 +13,7 @@ import com.google.common.io.ByteStreams;
import net.minecraft.src.EntityPlayer; import net.minecraft.src.EntityPlayer;
import net.minecraft.src.ModLoader; import net.minecraft.src.ModLoader;
import net.minecraft.src.NetworkManager; import net.minecraft.src.INetworkManager;
import net.minecraft.src.Packet; import net.minecraft.src.Packet;
import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.Packet250CustomPayload;
import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntity;
@ -32,7 +32,7 @@ import cpw.mods.fml.server.FMLServerHandler;
*/ */
public class PacketHandler implements IPacketHandler public class PacketHandler implements IPacketHandler
{ {
public void onPacketData(NetworkManager manager, Packet250CustomPayload packet, Player player) public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player)
{ {
ByteArrayDataInput dataStream = ByteStreams.newDataInput(packet.data); ByteArrayDataInput dataStream = ByteStreams.newDataInput(packet.data);
EntityPlayer entityplayer = (EntityPlayer)player; EntityPlayer entityplayer = (EntityPlayer)player;

View file

@ -7,7 +7,7 @@ import java.util.List;
import obsidian.api.IEnergizedItem; import obsidian.api.IEnergizedItem;
import universalelectricity.UniversalElectricity; import universalelectricity.core.UniversalElectricity;
import universalelectricity.electricity.ElectricInfo; import universalelectricity.electricity.ElectricInfo;
import universalelectricity.implement.IItemElectric; import universalelectricity.implement.IItemElectric;
@ -93,7 +93,7 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM
} }
else if(inventory[3].getItem() instanceof IItemElectric) else if(inventory[3].getItem() instanceof IItemElectric)
{ {
IItemElectric electricItem = (IItemElectric) inventory[3].getItem(); IItemElectric electricItem = (IItemElectric)inventory[3].getItem();
if (electricItem.canProduceElectricity()) if (electricItem.canProduceElectricity())
{ {
@ -327,7 +327,7 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM
PacketHandler.sendAdvancedElectricMachinePacketWithRange(this, 50); PacketHandler.sendAdvancedElectricMachinePacketWithRange(this, 50);
} }
public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream)
{ {
try { try {
facing = dataStream.readInt(); facing = dataStream.readInt();
@ -421,7 +421,7 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM
public String[] getMethodNames() public String[] getMethodNames()
{ {
return new String[] {"getStored", "getSecondaryStored", "getProgress", "isActive", "facing", "canOperate"}; return new String[] {"getStored", "getSecondaryStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"};
} }
public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception
@ -440,9 +440,13 @@ public abstract class TileEntityAdvancedElectricMachine extends TileEntityBasicM
return new Object[] {facing}; return new Object[] {facing};
case 5: case 5:
return new Object[] {canOperate()}; return new Object[] {canOperate()};
case 6:
return new Object[] {currentMaxEnergy};
case 7:
return new Object[] {(currentMaxEnergy-energyStored)};
default: default:
System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID()); System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID());
return null; return new Object[] {"Unknown command."};
} }
} }
} }

View file

@ -1,7 +1,7 @@
package net.uberkat.obsidian.common; package net.uberkat.obsidian.common;
import obsidian.api.IElectricMachine; import obsidian.api.IElectricMachine;
import universalelectricity.UniversalElectricity; import universalelectricity.core.UniversalElectricity;
import universalelectricity.electricity.ElectricInfo; import universalelectricity.electricity.ElectricInfo;
import universalelectricity.electricity.ElectricityManager; import universalelectricity.electricity.ElectricityManager;
import universalelectricity.prefab.TileEntityDisableable; import universalelectricity.prefab.TileEntityDisableable;
@ -92,10 +92,6 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple
*/ */
public TileEntityBasicMachine(String soundPath, String name, String path, int perTick, int ticksRequired, int maxEnergy) public TileEntityBasicMachine(String soundPath, String name, String path, int perTick, int ticksRequired, int maxEnergy)
{ {
if(ObsidianIngots.hooks.UELoaded)
{
ElectricityManager.instance.registerElectricUnit(this);
}
ENERGY_PER_TICK = perTick; ENERGY_PER_TICK = perTick;
TICKS_REQUIRED = currentTicksRequired = ticksRequired; TICKS_REQUIRED = currentTicksRequired = ticksRequired;
MAX_ENERGY = currentMaxEnergy = maxEnergy; MAX_ENERGY = currentMaxEnergy = maxEnergy;
@ -445,5 +441,26 @@ public abstract class TileEntityBasicMachine extends TileEntityDisableable imple
par2ItemStack.stackSize = getInventoryStackLimit(); par2ItemStack.stackSize = getInventoryStackLimit();
} }
} }
public int transferToAcceptor(int amount)
{
int rejects = 0;
int neededEnergy = currentMaxEnergy-energyStored;
if(amount <= neededEnergy)
{
energyStored += amount;
}
else if(amount > neededEnergy)
{
energyStored += neededEnergy;
rejects = amount-neededEnergy;
}
return rejects;
}
public boolean canReceive(ForgeDirection side)
{
return true;
}
} }

View file

@ -7,7 +7,7 @@ import java.util.List;
import obsidian.api.IEnergizedItem; import obsidian.api.IEnergizedItem;
import universalelectricity.UniversalElectricity; import universalelectricity.core.UniversalElectricity;
import universalelectricity.electricity.ElectricInfo; import universalelectricity.electricity.ElectricInfo;
import universalelectricity.implement.IItemElectric; import universalelectricity.implement.IItemElectric;
@ -266,7 +266,7 @@ public abstract class TileEntityElectricMachine extends TileEntityBasicMachine
PacketHandler.sendElectricMachinePacketWithRange(this, 50); PacketHandler.sendElectricMachinePacketWithRange(this, 50);
} }
public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream)
{ {
try { try {
facing = dataStream.readInt(); facing = dataStream.readInt();
@ -343,7 +343,7 @@ public abstract class TileEntityElectricMachine extends TileEntityBasicMachine
public String[] getMethodNames() public String[] getMethodNames()
{ {
return new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate"}; return new String[] {"getStored", "getProgress", "isActive", "facing", "canOperate", "getMaxEnergy", "getEnergyNeeded"};
} }
public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception
@ -360,9 +360,13 @@ public abstract class TileEntityElectricMachine extends TileEntityBasicMachine
return new Object[] {facing}; return new Object[] {facing};
case 4: case 4:
return new Object[] {canOperate()}; return new Object[] {canOperate()};
case 5:
return new Object[] {currentMaxEnergy};
case 6:
return new Object[] {(currentMaxEnergy-energyStored)};
default: default:
System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID()); System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID());
return null; return new Object[] {"Unknown command."};
} }
} }
} }

View file

@ -6,20 +6,18 @@ import java.io.IOException;
import obsidian.api.IEnergizedItem; import obsidian.api.IEnergizedItem;
import obsidian.api.ITileNetwork; import obsidian.api.ITileNetwork;
import obsidian.api.IEnergyAcceptor;
import universalelectricity.UniversalElectricity; import universalelectricity.core.UniversalElectricity;
import universalelectricity.core.Vector3;
import universalelectricity.electricity.ElectricInfo; import universalelectricity.electricity.ElectricInfo;
import universalelectricity.electricity.ElectricityManager; import universalelectricity.electricity.ElectricityManager;
import universalelectricity.implement.IConductor; import universalelectricity.implement.IConductor;
import universalelectricity.implement.IElectricityReceiver; import universalelectricity.implement.IElectricityReceiver;
import universalelectricity.implement.IItemElectric; import universalelectricity.implement.IItemElectric;
import universalelectricity.implement.IJouleStorage; import universalelectricity.implement.IJouleStorage;
import universalelectricity.network.ConnectionHandler;
import universalelectricity.network.ConnectionHandler.ConnectionType;
import universalelectricity.network.ISimpleConnectionHandler;
import universalelectricity.prefab.TileEntityConductor; import universalelectricity.prefab.TileEntityConductor;
import universalelectricity.prefab.TileEntityDisableable; import universalelectricity.prefab.TileEntityDisableable;
import universalelectricity.prefab.Vector3;
import buildcraft.api.power.IPowerProvider; import buildcraft.api.power.IPowerProvider;
import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.IPowerReceptor;
@ -44,7 +42,7 @@ import net.minecraft.src.*;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.ISidedInventory; import net.minecraftforge.common.ISidedInventory;
public class TileEntityPowerUnit extends TileEntityDisableable implements IInventory, ISidedInventory, ITileNetwork, IWrenchable, IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IElectricityReceiver, IPeripheral public class TileEntityPowerUnit extends TileEntityDisableable implements IInventory, ISidedInventory, ITileNetwork, IWrenchable, IEnergySink, IEnergySource, IEnergyStorage, IPowerReceptor, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral
{ {
/** The inventory slot itemstacks used by this power unit. */ /** The inventory slot itemstacks used by this power unit. */
public ItemStack[] inventory = new ItemStack[2]; public ItemStack[] inventory = new ItemStack[2];
@ -85,10 +83,6 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
*/ */
public TileEntityPowerUnit(int energy, int i) public TileEntityPowerUnit(int energy, int i)
{ {
if(ObsidianIngots.hooks.UELoaded)
{
ElectricityManager.instance.registerElectricUnit(this);
}
maxEnergy = energy; maxEnergy = energy;
output = i; output = i;
if(PowerFramework.currentFramework != null) if(PowerFramework.currentFramework != null)
@ -199,26 +193,45 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
} }
} }
if(isPowerReceptor(tileEntity)) if(tileEntity != null)
{ {
IPowerReceptor receptor = (IPowerReceptor)tileEntity; if(isPowerReceptor(tileEntity))
int energyNeeded = Math.min(receptor.getPowerProvider().getMinEnergyReceived(), receptor.getPowerProvider().getMaxEnergyReceived())*10;
float transferEnergy = Math.max(Math.min(Math.min(energyNeeded, energyStored), 54000), 0);
receptor.getPowerProvider().receiveEnergy((float)(transferEnergy/10), Orientations.dirs()[ForgeDirection.getOrientation(facing).getOpposite().ordinal()]);
setEnergy(energyStored - (int)transferEnergy);
}
TileEntity connector = Vector3.getConnectorFromSide(worldObj, Vector3.get(this), ForgeDirection.getOrientation(facing));
if(connector != null && connector instanceof TileEntityConductor)
{
double joulesNeeded = ElectricityManager.instance.getElectricityRequired(((IConductor) connector).getConnectionID());
double transferAmps = Math.max(Math.min(Math.min(ElectricInfo.getAmps(joulesNeeded, getVoltage()), ElectricInfo.getAmps(energyStored*UniversalElectricity.IC2_RATIO, getVoltage())), 80), 0);
if (!worldObj.isRemote)
{ {
ElectricityManager.instance.produceElectricity(this, (IConductor) connector, transferAmps, getVoltage()); IPowerReceptor receptor = (IPowerReceptor)tileEntity;
int energyNeeded = Math.min(receptor.getPowerProvider().getMinEnergyReceived(), receptor.getPowerProvider().getMaxEnergyReceived())*10;
float transferEnergy = Math.max(Math.min(Math.min(energyNeeded, energyStored), 54000), 0);
receptor.getPowerProvider().receiveEnergy((float)(transferEnergy/10), Orientations.dirs()[ForgeDirection.getOrientation(facing).getOpposite().ordinal()]);
setEnergy(energyStored - (int)transferEnergy);
}
else if(tileEntity instanceof TileEntityConductor)
{
double joulesNeeded = ElectricityManager.instance.getElectricityRequired(((IConductor) tileEntity).getNetwork());
double transferAmps = Math.max(Math.min(Math.min(ElectricInfo.getAmps(joulesNeeded, getVoltage()), ElectricInfo.getAmps(energyStored*UniversalElectricity.IC2_RATIO, getVoltage())), 80), 0);
if (!worldObj.isRemote)
{
ElectricityManager.instance.produceElectricity(this, (IConductor)tileEntity, transferAmps, getVoltage());
}
setEnergy(energyStored - (int)(ElectricInfo.getJoules(transferAmps, getVoltage())*UniversalElectricity.TO_IC2_RATIO));
}
else if(tileEntity instanceof IEnergyAcceptor)
{
if(((IEnergyAcceptor)tileEntity).canReceive(ForgeDirection.getOrientation(facing).getOpposite()))
{
int sendingEnergy = 0;
if(energyStored >= output)
{
sendingEnergy = output;
}
else if(energyStored < output)
{
sendingEnergy = energyStored;
}
int rejects = ((IEnergyAcceptor)tileEntity).transferToAcceptor(output);
setEnergy(energyStored - (sendingEnergy - rejects));
}
} }
setEnergy(energyStored - (int)(ElectricInfo.getJoules(transferAmps, getVoltage())*UniversalElectricity.TO_IC2_RATIO));
} }
} }
@ -375,7 +388,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
nbtTags.setTag("Items", tagList); nbtTags.setTag("Items", tagList);
} }
public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream)
{ {
try { try {
facing = dataStream.readInt(); facing = dataStream.readInt();
@ -448,7 +461,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
return maxEnergy; return maxEnergy;
} }
public int getOutput() public int getRate()
{ {
return output; return output;
} }
@ -570,7 +583,7 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
public String[] getMethodNames() public String[] getMethodNames()
{ {
return new String[] {"getStored", "getOutput"}; return new String[] {"getStored", "getOutput", "getMaxEnergy", "getEnergyNeeded"};
} }
public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception
@ -581,6 +594,10 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
return new Object[] {energyStored}; return new Object[] {energyStored};
case 1: case 1:
return new Object[] {output}; return new Object[] {output};
case 2:
return new Object[] {maxEnergy};
case 3:
return new Object[] {(maxEnergy-energyStored)};
default: default:
System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID()); System.err.println("[ObsidianIngots] Attempted to call unknown method with computer ID " + computer.getID());
return null; return null;
@ -595,4 +612,26 @@ public class TileEntityPowerUnit extends TileEntityDisableable implements IInven
public void attach(IComputerAccess computer, String computerSide) {} public void attach(IComputerAccess computer, String computerSide) {}
public void detach(IComputerAccess computer) {} public void detach(IComputerAccess computer) {}
public int transferToAcceptor(int amount)
{
int rejects = 0;
int neededEnergy = maxEnergy-energyStored;
if(amount <= neededEnergy)
{
energyStored += amount;
}
else if(amount > neededEnergy)
{
energyStored += neededEnergy;
rejects = amount-neededEnergy;
}
return rejects;
}
public boolean canReceive(ForgeDirection side)
{
return side != ForgeDirection.getOrientation(facing);
}
} }

View file

@ -19,7 +19,7 @@ import net.minecraftforge.common.ISidedInventory;
* @author AidanBrady * @author AidanBrady
* *
*/ */
public interface IElectricMachine extends IInventory, ISidedInventory, IWrenchable, ITileNetwork, IPowerReceptor, IEnergySink, IJouleStorage, IElectricityReceiver, IPeripheral public interface IElectricMachine extends IInventory, ISidedInventory, IWrenchable, ITileNetwork, IPowerReceptor, IEnergySink, IJouleStorage, IElectricityReceiver, IEnergyAcceptor, IPeripheral
{ {
/** /**
* Update call for machines. Use instead of updateEntity() - it's called every tick. * Update call for machines. Use instead of updateEntity() - it's called every tick.

View file

@ -0,0 +1,10 @@
package obsidian.api;
import net.minecraftforge.common.ForgeDirection;
public interface IEnergyAcceptor
{
public int transferToAcceptor(int amount);
public boolean canReceive(ForgeDirection side);
}

View file

@ -1,7 +1,7 @@
package obsidian.api; package obsidian.api;
import net.minecraft.src.EntityPlayer; import net.minecraft.src.EntityPlayer;
import net.minecraft.src.NetworkManager; import net.minecraft.src.INetworkManager;
import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.Packet250CustomPayload;
import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataInput;
@ -20,5 +20,5 @@ public interface ITileNetwork
* @param player * @param player
* @param dataStream * @param dataStream
*/ */
public void handlePacketData(NetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream); public void handlePacketData(INetworkManager network, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream);
} }

0
src/common/railcraft/common/api/carts/CartBase.java Normal file → Executable file
View file

108
src/common/railcraft/common/api/carts/CartTools.java Normal file → Executable file
View file

@ -17,6 +17,7 @@ public abstract class CartTools
{ {
public static ILinkageManager serverLinkageManager; public static ILinkageManager serverLinkageManager;
/** /**
* Registers a subclass of EntityMinecart with the game engine. * Registers a subclass of EntityMinecart with the game engine.
* *
@ -29,8 +30,7 @@ public abstract class CartTools
* @param tag The String identifier * @param tag The String identifier
* @param internalId The mods internal entity id * @param internalId The mods internal entity id
*/ */
public static void registerMinecart(Object mod, Class<? extends EntityMinecart> type, String tag, int internalId) public static void registerMinecart(Object mod, Class<? extends EntityMinecart> type, String tag, int internalId) {
{
EntityRegistry.registerModEntity(type, tag, internalId, mod, 80, 3, true); EntityRegistry.registerModEntity(type, tag, internalId, mod, 80, 3, true);
} }
@ -42,8 +42,7 @@ public abstract class CartTools
* @param world The World, may be required in the future * @param world The World, may be required in the future
* @return an instance of ILinkageManager * @return an instance of ILinkageManager
*/ */
public static ILinkageManager getLinkageManager(World world) public static ILinkageManager getLinkageManager(World world) {
{
return serverLinkageManager; return serverLinkageManager;
} }
@ -54,8 +53,7 @@ public abstract class CartTools
* *
* @param owner * @param owner
*/ */
public static void setCartOwner(EntityMinecart cart, EntityPlayer owner) public static void setCartOwner(EntityMinecart cart, EntityPlayer owner) {
{
cart.getEntityData().setString("owner", owner.username); cart.getEntityData().setString("owner", owner.username);
} }
@ -66,8 +64,7 @@ public abstract class CartTools
* *
* @param owner * @param owner
*/ */
public static void setCartOwner(EntityMinecart cart, String owner) public static void setCartOwner(EntityMinecart cart, String owner) {
{
cart.getEntityData().setString("owner", owner); cart.getEntityData().setString("owner", owner);
} }
@ -78,8 +75,7 @@ public abstract class CartTools
* *
* @param owner * @param owner
*/ */
public static String getCartOwner(EntityMinecart cart) public static String getCartOwner(EntityMinecart cart) {
{
return cart.getEntityData().getString("owner"); return cart.getEntityData().getString("owner");
} }
@ -91,8 +87,7 @@ public abstract class CartTools
* @return true if the item matches the cart * @return true if the item matches the cart
* @see IMinecart * @see IMinecart
*/ */
public static boolean doesCartMatchFilter(ItemStack stack, EntityMinecart cart) public static boolean doesCartMatchFilter(ItemStack stack, EntityMinecart cart) {
{
if(stack == null) { if(stack == null) {
return false; return false;
} }
@ -100,7 +95,26 @@ public abstract class CartTools
return ((IMinecart)cart).doesCartMatchFilter(stack, cart); return ((IMinecart)cart).doesCartMatchFilter(stack, cart);
} }
ItemStack cartItem = cart.getCartItem(); ItemStack cartItem = cart.getCartItem();
return cartItem != null && stack.isItemEqual(cartItem); return cartItem != null && isItemEqual(stack, cartItem);
}
private static boolean isItemEqual(ItemStack a, ItemStack b) {
if(a == null || b == null) {
return false;
}
if(a.itemID != b.itemID) {
return false;
}
if(a.stackTagCompound != null && !a.stackTagCompound.equals(b.stackTagCompound)) {
return false;
}
if(a.getHasSubtypes() && (a.getItemDamage() == -1 || b.getItemDamage() == -1)) {
return true;
}
if(a.getHasSubtypes() && a.getItemDamage() != b.getItemDamage()) {
return false;
}
return true;
} }
/** /**
@ -120,8 +134,7 @@ public abstract class CartTools
* @return the cart placed or null if failed * @return the cart placed or null if failed
* @see IMinecartItem, ItemMinecart * @see IMinecartItem, ItemMinecart
*/ */
public static EntityMinecart placeCart(String owner, ItemStack cart, World world, int i, int j, int k) public static EntityMinecart placeCart(String owner, ItemStack cart, World world, int i, int j, int k) {
{
if(cart == null) { if(cart == null) {
return null; return null;
} }
@ -131,7 +144,7 @@ public abstract class CartTools
return mi.placeCart(owner, cart, world, i, j, k); return mi.placeCart(owner, cart, world, i, j, k);
} else if(cart.getItem() instanceof ItemMinecart) { } else if(cart.getItem() instanceof ItemMinecart) {
try { try {
boolean placed = cart.getItem().onItemUseFirst(cart, null, world, i, j, k, 0, 0, 0, 0); boolean placed = cart.getItem().onItemUse(cart, null, world, i, j, k, 0, 0, 0, 0);
if(placed) { if(placed) {
List<EntityMinecart> carts = getMinecartsAt(world, i, j, k, 0.3f); List<EntityMinecart> carts = getMinecartsAt(world, i, j, k, 0.3f);
if(carts.size() > 0) { if(carts.size() > 0) {
@ -152,8 +165,7 @@ public abstract class CartTools
* @param cart * @param cart
* @param stack * @param stack
*/ */
public static void offerOrDropItem(EntityMinecart cart, ItemStack stack) public static void offerOrDropItem(EntityMinecart cart, ItemStack stack) {
{
EntityMinecart link_A = getLinkageManager(cart.worldObj).getLinkedCartA(cart); EntityMinecart link_A = getLinkageManager(cart.worldObj).getLinkedCartA(cart);
EntityMinecart link_B = getLinkageManager(cart.worldObj).getLinkedCartB(cart); EntityMinecart link_B = getLinkageManager(cart.worldObj).getLinkedCartB(cart);
@ -169,26 +181,22 @@ public abstract class CartTools
} }
} }
public static boolean isMinecartOnRailAt(World world, int i, int j, int k, float sensitivity) public static boolean isMinecartOnRailAt(World world, int i, int j, int k, float sensitivity) {
{
return isMinecartOnRailAt(world, i, j, k, sensitivity, null, true); return isMinecartOnRailAt(world, i, j, k, sensitivity, null, true);
} }
public static boolean isMinecartOnRailAt(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) public static boolean isMinecartOnRailAt(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) {
{
if(BlockRail.isRailBlockAt(world, i, j, k)) { if(BlockRail.isRailBlockAt(world, i, j, k)) {
return isMinecartAt(world, i, j, k, sensitivity, type, subclass); return isMinecartAt(world, i, j, k, sensitivity, type, subclass);
} }
return false; return false;
} }
public static boolean isMinecartOnAnySide(World world, int i, int j, int k, float sensitivity) public static boolean isMinecartOnAnySide(World world, int i, int j, int k, float sensitivity) {
{
return isMinecartOnAnySide(world, i, j, k, sensitivity, null, true); return isMinecartOnAnySide(world, i, j, k, sensitivity, null, true);
} }
public static boolean isMinecartOnAnySide(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) public static boolean isMinecartOnAnySide(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) {
{
List<EntityMinecart> list = new ArrayList<EntityMinecart>(); List<EntityMinecart> list = new ArrayList<EntityMinecart>();
for(int side = 0; side < 6; side++) { for(int side = 0; side < 6; side++) {
list.addAll(getMinecartsOnSide(world, i, j, k, sensitivity, ForgeDirection.getOrientation(side))); list.addAll(getMinecartsOnSide(world, i, j, k, sensitivity, ForgeDirection.getOrientation(side)));
@ -206,13 +214,11 @@ public abstract class CartTools
return false; return false;
} }
public static boolean isMinecartAt(World world, int i, int j, int k, float sensitivity) public static boolean isMinecartAt(World world, int i, int j, int k, float sensitivity) {
{
return isMinecartAt(world, i, j, k, sensitivity, null, true); return isMinecartAt(world, i, j, k, sensitivity, null, true);
} }
public static boolean isMinecartAt(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) public static boolean isMinecartAt(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) {
{
List<EntityMinecart> list = getMinecartsAt(world, i, j, k, sensitivity); List<EntityMinecart> list = getMinecartsAt(world, i, j, k, sensitivity);
if(type == null) { if(type == null) {
@ -227,8 +233,7 @@ public abstract class CartTools
return false; return false;
} }
public static List<EntityMinecart> getMinecartsOnAllSides(World world, int i, int j, int k, float sensitivity) public static List<EntityMinecart> getMinecartsOnAllSides(World world, int i, int j, int k, float sensitivity) {
{
List<EntityMinecart> carts = new ArrayList<EntityMinecart>(); List<EntityMinecart> carts = new ArrayList<EntityMinecart>();
for(int side = 0; side < 6; side++) { for(int side = 0; side < 6; side++) {
carts.addAll(getMinecartsOnSide(world, i, j, k, sensitivity, ForgeDirection.getOrientation(side))); carts.addAll(getMinecartsOnSide(world, i, j, k, sensitivity, ForgeDirection.getOrientation(side)));
@ -237,8 +242,7 @@ public abstract class CartTools
return carts; return carts;
} }
public static List<EntityMinecart> getMinecartsOnAllSides(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) public static List<EntityMinecart> getMinecartsOnAllSides(World world, int i, int j, int k, float sensitivity, Class<? extends EntityMinecart> type, boolean subclass) {
{
List<EntityMinecart> list = new ArrayList<EntityMinecart>(); List<EntityMinecart> list = new ArrayList<EntityMinecart>();
List<EntityMinecart> carts = new ArrayList<EntityMinecart>(); List<EntityMinecart> carts = new ArrayList<EntityMinecart>();
for(int side = 0; side < 6; side++) { for(int side = 0; side < 6; side++) {
@ -253,8 +257,7 @@ public abstract class CartTools
return carts; return carts;
} }
private static int getYOnSide(int y, ForgeDirection side) private static int getYOnSide(int y, ForgeDirection side) {
{
switch (side) { switch (side) {
case UP: case UP:
return y + 1; return y + 1;
@ -265,8 +268,7 @@ public abstract class CartTools
} }
} }
private static int getXOnSide(int x, ForgeDirection side) private static int getXOnSide(int x, ForgeDirection side) {
{
switch (side) { switch (side) {
case EAST: case EAST:
return x + 1; return x + 1;
@ -277,8 +279,7 @@ public abstract class CartTools
} }
} }
private static int getZOnSide(int z, ForgeDirection side) private static int getZOnSide(int z, ForgeDirection side) {
{
switch (side) { switch (side) {
case NORTH: case NORTH:
return z - 1; return z - 1;
@ -289,31 +290,26 @@ public abstract class CartTools
} }
} }
public static List<EntityMinecart> getMinecartsOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) public static List<EntityMinecart> getMinecartsOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) {
{
return getMinecartsAt(world, getXOnSide(i, side), getYOnSide(j, side), getZOnSide(k, side), sensitivity); return getMinecartsAt(world, getXOnSide(i, side), getYOnSide(j, side), getZOnSide(k, side), sensitivity);
} }
public static boolean isMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) public static boolean isMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) {
{
return getMinecartOnSide(world, i, j, k, sensitivity, side) != null; return getMinecartOnSide(world, i, j, k, sensitivity, side) != null;
} }
public static EntityMinecart getMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) public static EntityMinecart getMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side) {
{
for(EntityMinecart cart : getMinecartsOnSide(world, i, j, k, sensitivity, side)) { for(EntityMinecart cart : getMinecartsOnSide(world, i, j, k, sensitivity, side)) {
return cart; return cart;
} }
return null; return null;
} }
public static boolean isMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side, Class<? extends EntityMinecart> type, boolean subclass) public static boolean isMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side, Class<? extends EntityMinecart> type, boolean subclass) {
{
return getMinecartOnSide(world, i, j, k, sensitivity, side, type, subclass) != null; return getMinecartOnSide(world, i, j, k, sensitivity, side, type, subclass) != null;
} }
public static EntityMinecart getMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side, Class<? extends EntityMinecart> type, boolean subclass) public static EntityMinecart getMinecartOnSide(World world, int i, int j, int k, float sensitivity, ForgeDirection side, Class<? extends EntityMinecart> type, boolean subclass) {
{
for(EntityMinecart cart : getMinecartsOnSide(world, i, j, k, sensitivity, side)) { for(EntityMinecart cart : getMinecartsOnSide(world, i, j, k, sensitivity, side)) {
if(type == null || (subclass && type.isInstance(cart)) || cart.getClass() == type) { if(type == null || (subclass && type.isInstance(cart)) || cart.getClass() == type) {
return cart; return cart;
@ -331,8 +327,7 @@ public abstract class CartTools
* @param sensitivity Controls the size of the search box, ranges from (-inf, 0.49]. * @param sensitivity Controls the size of the search box, ranges from (-inf, 0.49].
* @return * @return
*/ */
public static List<EntityMinecart> getMinecartsAt(World world, int i, int j, int k, float sensitivity) public static List<EntityMinecart> getMinecartsAt(World world, int i, int j, int k, float sensitivity) {
{
sensitivity = Math.min(sensitivity, 0.49f); sensitivity = Math.min(sensitivity, 0.49f);
List entities = world.getEntitiesWithinAABB(net.minecraft.src.EntityMinecart.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(i + sensitivity, j + sensitivity, k + sensitivity, i + 1 - sensitivity, j + 1 - sensitivity, k + 1 - sensitivity)); List entities = world.getEntitiesWithinAABB(net.minecraft.src.EntityMinecart.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(i + sensitivity, j + sensitivity, k + sensitivity, i + 1 - sensitivity, j + 1 - sensitivity, k + 1 - sensitivity));
List<EntityMinecart> carts = new ArrayList<EntityMinecart>(); List<EntityMinecart> carts = new ArrayList<EntityMinecart>();
@ -342,8 +337,7 @@ public abstract class CartTools
return carts; return carts;
} }
public static List<EntityMinecart> getMinecartsIn(World world, int i1, int j1, int k1, int i2, int j2, int k2) public static List<EntityMinecart> getMinecartsIn(World world, int i1, int j1, int k1, int i2, int j2, int k2) {
{
List entities = world.getEntitiesWithinAABB(net.minecraft.src.EntityMinecart.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(i1, j1, k1, i2, j2, k2)); List entities = world.getEntitiesWithinAABB(net.minecraft.src.EntityMinecart.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool(i1, j1, k1, i2, j2, k2));
List<EntityMinecart> carts = new ArrayList<EntityMinecart>(); List<EntityMinecart> carts = new ArrayList<EntityMinecart>();
for(Object o : entities) { for(Object o : entities) {
@ -360,13 +354,11 @@ public abstract class CartTools
* @param cart * @param cart
* @return speed * @return speed
*/ */
public static double getCartSpeedUncapped(EntityMinecart cart) public static double getCartSpeedUncapped(EntityMinecart cart) {
{
return Math.sqrt(cart.motionX * cart.motionX + cart.motionZ * cart.motionZ); return Math.sqrt(cart.motionX * cart.motionX + cart.motionZ * cart.motionZ);
} }
public static boolean cartVelocityIsLessThan(EntityMinecart cart, float vel) public static boolean cartVelocityIsLessThan(EntityMinecart cart, float vel) {
{
return Math.abs(cart.motionX) < vel && Math.abs(cart.motionZ) < vel; return Math.abs(cart.motionX) < vel && Math.abs(cart.motionZ) < vel;
} }
} }

View file

View file

View file

@ -0,0 +1,56 @@
package railcraft.common.api.carts;
public interface IExplosiveCart
{
/**
* If set to true the cart should explode after
* whatever fuse duration is set.
*
* @param primed
*/
public void setPrimed(boolean primed);
/**
* Returns whether the cart is primed to explode.
*
* @return primed
*/
public boolean isPrimed();
/**
* Returns the length of the current fuse.
*
* @return fuse length in ticks
*/
public int getFuse();
/**
* Optional function to allow setting the fuse duration.
*
* Used by the Priming Track.
*
* @param fuse in ticks
*/
public void setFuse(int fuse);
/**
* Returns the blast radius, but I don't think anything currently uses this.
*
* @return blast radius
*/
public float getBlastRadius();
/**
* Optional function to allow setting the blast radius.
*
* @param radius
*/
public void setBlastRadius(float radius);
/**
* Causes the cart to explode immediately.
*
*/
public void explode();
}

View file

View file

View file

View file

0
src/common/railcraft/common/api/carts/IMinecart.java Normal file → Executable file
View file

View file

View file

View file

View file

View file

View file

View file

View file

@ -31,7 +31,7 @@ public enum EnumItemType
} }
switch (this) { switch (this) {
case FUEL: case FUEL:
return TileEntityFurnace.getItemBurnTime(stack) > 0; return TileEntityFurnace.isItemFuel(stack);
case RAIL: case RAIL:
return stack.getItem() instanceof ITrackItem || (stack.getItem() instanceof ItemBlock && BlockRail.isRailBlock(stack.itemID)); return stack.getItem() instanceof ITrackItem || (stack.getItem() instanceof ItemBlock && BlockRail.isRailBlock(stack.itemID));
case MINECART: case MINECART:

View file

View file

View file

View file

@ -62,6 +62,7 @@ public final class ItemRegistry
*/ */
public static void registerItem(String tag, ItemStack item) public static void registerItem(String tag, ItemStack item)
{ {
tag = tag.replace("rc.", "");
registry.put(tag, item); registry.put(tag, item);
} }

View file

View file

View file

View file

View file

@ -4,6 +4,7 @@ import java.util.List;
import net.minecraft.src.IRecipe; import net.minecraft.src.IRecipe;
import net.minecraft.src.InventoryCrafting; import net.minecraft.src.InventoryCrafting;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import net.minecraft.src.World;
/** /**
* *
@ -16,7 +17,7 @@ public interface IRollingMachineCraftingManager
void addShapelessRecipe(ItemStack output, Object[] compenents); void addShapelessRecipe(ItemStack output, Object[] compenents);
ItemStack findMatchingRecipe(InventoryCrafting inventorycrafting); ItemStack findMatchingRecipe(InventoryCrafting inventorycrafting, World world);
List<IRecipe> getRecipeList(); List<IRecipe> getRecipeList();

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

0
src/common/railcraft/common/api/tracks/ITrackTile.java Normal file → Executable file
View file

0
src/common/railcraft/common/api/tracks/RailTools.java Normal file → Executable file
View file

View file

View file

0
src/common/railcraft/common/api/tracks/TrackSpec.java Normal file → Executable file
View file

View file

@ -1,61 +0,0 @@
package universalelectricity;
import net.minecraft.src.Block;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import universalelectricity.ore.OreGenBase;
import universalelectricity.prefab.ItemElectric;
/**
* The main class for managing Basic Component items and blocks. Reference objects from this class to add them to your
* recipes and such.
* @author Calclavia
*/
public class BasicComponents
{
public static final String FILE_PATH = "/basiccomponents/textures/";
public static final String BLOCK_TEXTURE_FILE = FILE_PATH + "blocks.png";
public static final String ITEM_TEXTURE_FILE = FILE_PATH + "items.png";
/**
* Try not reference to these variable in pre-initialization as they might be null!
*/
public static int BLOCK_ID_PREFIX = 3970;
//Metadata ore block that contains copper
public static Block blockBasicOre;
public static Block blockCopperWire;
public static Block oilMoving;
public static Block oilStill;
public static Block blockMachine;
public static Block blockMulti;
public static final int ITEM_ID_PREFIX = 13970;
public static ItemElectric itemBattery;
public static Item itemWrench;
public static Item itemCopperIngot;
public static Item itemTinIngot;
public static Item itemSteelIngot;
public static Item itemSteelDust;
public static Item itemCircuit;
public static Item itemBronzeIngot;
public static Item itemBronzeDust;
public static Item itemSteelPlate;
public static Item itemBronzePlate;
public static Item itemMotor;
public static Item itemOilBucket;
public static Item itemCopperPlate;
public static Item itemTinPlate;
/**
* Some neat references to help you out.
*/
public static ItemStack coalGenerator;
public static ItemStack batteryBox;
public static ItemStack electricFurnace;
public static OreGenBase copperOreGeneration;
public static OreGenBase tinOreGeneration;
}

View file

@ -1,56 +0,0 @@
package universalelectricity;
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;
}
}

View file

@ -1,90 +0,0 @@
package universalelectricity;
import java.io.File;
import net.minecraft.src.MapColor;
import net.minecraft.src.Material;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.ForgeVersion;
import cpw.mods.fml.common.Loader;
public class UniversalElectricity
{
public static final int MAJOR_VERSION = 0;
public static final int MINOR_VERSION = 9;
public static final int REVISION_VERSION = 3;
public static final String VERSION = MAJOR_VERSION+"."+MINOR_VERSION+"."+REVISION_VERSION;
public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "UniversalElectricity/UniversalElectricity.cfg"));
//EU to Watts ratio
public static final float IC2_RATIO = (float)UEConfig.getConfigData(CONFIGURATION, "IndustrialCraft Conversion 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;
/**
* Use this material for all your machine blocks. It can be breakable by hand.
*/
public static final Material machine = new Material(MapColor.ironColor);
public static void versionLock(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(MINOR_VERSION < minor)
{
throw new RuntimeException("Universal Electricity minor version is too old! Require v"+major+"."+minor+"."+revision);
}
if(REVISION_VERSION < revision)
{
if(strict)
{
throw new RuntimeException("Universal Electricity is too old! Require v"+major+"."+minor+"."+revision);
}
else
{
System.out.println("Universal Electricity is not the specified version. Odd things might happen. Require "+major+"."+minor+"."+revision);
}
}
}
public static void forgeLock(int major, int minor, int revision, boolean strict)
{
if(ForgeVersion.getMajorVersion() != major)
{
throw new RuntimeException("Universal Electricity: Wrong Minecraft Forge version! Require "+major+"."+minor+"."+revision);
}
if(ForgeVersion.getMinorVersion() < minor)
{
throw new RuntimeException("Universal Electricity: Minecraft Forge minor version is too old! Require "+major+"."+minor+"."+revision);
}
if(ForgeVersion.getRevisionVersion() < revision)
{
if(strict)
{
throw new RuntimeException("Universal Electricity: Minecraft Forge revision version is too old! Require "+major+"."+minor+"."+revision);
}
else
{
System.out.println("Universal Electricity Warning: Minecraft Forge is not the specified version. Odd things might happen. Require "+major+"."+minor+"."+revision);
}
}
}
public static void forgeLock(int major, int minor, int revision)
{
forgeLock(major, minor, revision, false);
}
}

View file

@ -0,0 +1,50 @@
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;
}
}

View file

@ -0,0 +1,68 @@
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.electricity.ElectricityManager;
import universalelectricity.electricity.ElectricityManagerTicker;
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.
* @author Calclavia
*
*/
public class UELoader
{
public static final UELoader INSTANCE = new UELoader();
public static boolean isInitialized = false;
public void initiate()
{
if (!isInitialized)
{
TickRegistry.registerTickHandler(new ElectricityManagerTicker(), Side.SERVER);
ElectricityManager.instance = new ElectricityManager();
MinecraftForge.EVENT_BUS.register(this);
if (UniversalElectricity.BC3_RATIO <= 0 || !Loader.isModLoaded("BuildCraft|Core"))
{
FMLLog.fine("Disabled Buildcraft electricity conversion!");
}
else
{
FMLLog.fine("Buildcraft conversion ratio: " + UniversalElectricity.BC3_RATIO);
}
if (UniversalElectricity.IC2_RATIO <= 0 || !Loader.isModLoaded("IC2"))
{
FMLLog.fine("Disabled Industrialcraft electricity conversion!");
}
else
{
FMLLog.fine("IC2 conversion ratio: " + UniversalElectricity.IC2_RATIO);
}
FMLLog.finest("Universal Electricity v" + UniversalElectricity.VERSION + " successfully loaded!");
isInitialized = true;
}
}
@ForgeSubscribe
public void onWorldLoad(Load event)
{
ElectricityManagerTicker.inGameTicks = 0;
}
@ForgeSubscribe
public void onWorldUnload(Unload event)
{
ElectricityManager.instance = new ElectricityManager();
}
}

View file

@ -0,0 +1,119 @@
package universalelectricity.core;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.src.MapColor;
import net.minecraft.src.Material;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.ForgeVersion;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Loader;
/**
* Instructions for using the Universal Electricity API.
*
* The less you include of the API, the more compatible your
* mod will be for future releases of Universal Electricity.
*
* REQUIRED PACKAGES:
* "universalelectricity"
* "universalelectricity.electricity"
* "universalelectricity.implements" - Some interfaces can be removed if not needed.
*
* The rest of the classes should be removed if you are not going to use them.
*
* @author Calclavia
*
*/
public class UniversalElectricity
{
/**
* The version of the Universal Electricity API.
*/
public static final int MAJOR_VERSION = 1;
public static final int MINOR_VERSION = 0;
public static final int REVISION_VERSION = 0;
public static final String VERSION = MAJOR_VERSION + "." + MINOR_VERSION + "." + REVISION_VERSION;
/**
* The Universal Electricity configuration file.
*/
public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "UniversalElectricity/UniversalElectricity.cfg"));
/**
* 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);
// 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;
/**
* Use this material for all your machine blocks. It can be breakable by
* hand.
*/
public static final Material machine = new Material(MapColor.ironColor);
public static final List<Object> mods = new ArrayList<Object>();
/**
* You must register your mod with Universal Electricity. Call this in your
* mod's pre-initialization stage.
*/
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 (MINOR_VERSION < minor) { throw new RuntimeException("Universal Electricity minor version is too old! Require v" + major + "." + minor + "." + revision); }
if (REVISION_VERSION < revision)
{
if (strict)
{
throw new RuntimeException("Universal Electricity 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);
}
}
mods.add(mod);
FMLLog.fine(mod.getClass().getSimpleName()+" has been registered to Universal Electricity.");
UELoader.INSTANCE.initiate();
}
/**
* A function that allows you to lock your mod to a specific version of
* Forge.
*/
public static void forgeLock(int major, int minor, int revision, boolean strict)
{
if (ForgeVersion.getMajorVersion() != major) { throw new RuntimeException("Universal Electricity: Wrong Minecraft Forge version! Require " + major + "." + minor + "." + revision); }
if (ForgeVersion.getMinorVersion() < minor) { throw new RuntimeException("Universal Electricity: Minecraft Forge minor version is too old! Require " + major + "." + minor + "." + revision); }
if (ForgeVersion.getRevisionVersion() < revision)
{
if (strict)
{
throw new RuntimeException("Universal Electricity: Minecraft Forge revision version is too old! Require " + major + "." + minor + "." + revision);
}
else
{
System.out.println("Universal Electricity Warning: Minecraft Forge is not the specified version. Odd things might happen. Require " + major + "." + minor + "." + revision);
}
}
}
public static void forgeLock(int major, int minor, int revision)
{
forgeLock(major, minor, revision, false);
}
}

View file

@ -0,0 +1,106 @@
package universalelectricity.core;
import net.minecraft.src.MathHelper;
/**
* Vector2 Class is used for defining objects in a 2D space. Vector2 makes it
* easier to handle the coordinates of objects. Instead of fumbling with x and y
* variables, all x and y variables are stored in one class. Vector3.x,
* Vector3.y.
*
* @author Calclavia
*/
public class Vector2 implements Cloneable
{
public double x;
public double y;
public Vector2()
{
this(0, 0);
}
public Vector2(int x, int y)
{
this.x = x;
this.y = y;
}
public Vector2(double x, double y)
{
this.x = x;
this.y = y;
}
// Returns the values as an int
public int intX()
{
return (int) Math.floor(this.x);
}
public int intY()
{
return (int) Math.floor(this.y);
}
/**
* Makes a new copy of this Vector. Prevents variable referencing problems.
*/
@Override
public Vector2 clone()
{
return new Vector2(this.x, this.y);
}
public static boolean isPointInRegion(Vector2 point, Vector2 minPoint, Vector2 maxPoint)
{
return (point.x > minPoint.x && point.x < maxPoint.x) && (point.y > minPoint.y && point.y < maxPoint.y);
}
public static double distance(Vector2 par1, Vector2 par2)
{
double var2 = par1.x - par2.x;
double var4 = par1.y - par2.y;
return MathHelper.sqrt_double(var2 * var2 + var4 * var4);
}
public static double slope(Vector2 par1, Vector2 par2)
{
double var2 = par1.x - par2.x;
double var4 = par1.y - par2.y;
return var4 / var2;
}
public void add(Vector2 par1)
{
this.x += par1.x;
this.y += par1.y;
}
public void add(double par1)
{
this.x += par1;
this.y += par1;
}
public Vector2 round()
{
return new Vector2(Math.round(this.x), Math.round(this.y));
}
public Vector2 floor()
{
return new Vector2(Math.floor(this.x), Math.floor(this.y));
}
public String output()
{
return "Vector2: " + this.x + "," + this.y;
}
public void printVector()
{
System.out.println(output());
}
}

View file

@ -0,0 +1,448 @@
package universalelectricity.core;
import net.minecraft.src.ChunkCoordinates;
import net.minecraft.src.Entity;
import net.minecraft.src.MathHelper;
import net.minecraft.src.MovingObjectPosition;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.TileEntity;
import net.minecraft.src.Vec3;
import net.minecraft.src.World;
import net.minecraftforge.common.ForgeDirection;
import universalelectricity.implement.IConnector;
/**
* Vector3 Class is used for defining objects in a 3D space. Vector3 makes it
* easier to handle the coordinates of objects. Instead of fumbling with x, y
* and z variables, all x, y and z variables are stored in one class. Vector3.x,
* Vector3.y, Vector3.z.
*
* @author Calclavia
*/
public class Vector3 extends Vector2 implements Cloneable
{
public double z;
public Vector3()
{
this(0, 0, 0);
}
public Vector3(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
public Vector3(double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
}
/**
* Returns the coordinates as integers
*/
public int intX()
{
return (int) Math.floor(this.x);
}
public int intY()
{
return (int) Math.floor(this.y);
}
public int intZ()
{
return (int) Math.floor(this.z);
}
/**
* Makes a new copy of this Vector. Prevents variable referencing problems.
*/
@Override
public Vector3 clone()
{
return new Vector3(this.x, this.y, this.z);
}
/**
* Converts a TileEntity's position into Vector3
*/
public static Vector3 get(Entity par1)
{
return new Vector3(par1.posX, par1.posY, par1.posZ);
}
/**
* Converts an entity's position into Vector3
*/
public static Vector3 get(TileEntity par1)
{
return new Vector3(par1.xCoord, par1.yCoord, par1.zCoord);
}
/**
* Converts from Vec3 into a Vector3
*/
public static Vector3 get(Vec3 par1)
{
return new Vector3(par1.xCoord, par1.yCoord, par1.zCoord);
}
/**
* Converts a MovingObjectPosition to Vector3
*/
public static Vector3 get(MovingObjectPosition par1)
{
return new Vector3(par1.blockX, par1.blockY, par1.blockZ);
}
/**
* Converts a MovingObjectPosition to Vector3
*/
public static Vector3 get(ChunkCoordinates par1)
{
return new Vector3(par1.posX, par1.posY, par1.posZ);
}
public int getBlockID(World world)
{
return world.getBlockId(this.intX(), this.intY(), this.intZ());
}
public int getBlockMetadata(World world)
{
return world.getBlockMetadata(this.intX(), this.intY(), this.intZ());
}
public TileEntity getTileEntity(World world)
{
return world.getBlockTileEntity(this.intX(), this.intY(), this.intZ());
}
public void setBlock(World world, int id, int metadata)
{
world.setBlockAndMetadata(this.intX(), this.intY(), this.intZ(), id, metadata);
}
public void setBlock(World world, int id)
{
world.setBlock(this.intX(), this.intY(), this.intZ(), id);
}
public void setBlockWithNotify(World world, int id, int metadata)
{
world.setBlockAndMetadataWithNotify(this.intX(), this.intY(), this.intZ(), id, metadata);
}
public void setBlockWithNotify(World world, int id)
{
world.setBlockWithNotify(this.intX(), this.intY(), this.intZ(), id);
}
/**
* Converts this Vector3 into a Vector2 by dropping the Y axis.
*/
public Vector2 toVector2()
{
return new Vector2(this.x, this.z);
}
/**
* Converts this vector three into a Minecraft Vec3 object
*/
public Vec3 toVec3()
{
return Vec3.createVectorHelper(this.x, this.y, this.z);
}
/**
* Checks if a Vector3 point is located inside a region
*/
public static boolean isPointInRegion(Vector3 point, Vector3 minPoint, Vector3 maxPoint)
{
return (point.x > minPoint.x && point.x < maxPoint.x) && (point.y > minPoint.y && point.y < maxPoint.y) && (point.z > minPoint.z && point.z < maxPoint.z);
}
/**
* Compares two vectors and see if they are equal. True if so.
*/
public boolean isEqual(Vector3 vector3)
{
return (this.x == vector3.x && this.y == vector3.y && this.z == vector3.z);
}
/**
* Gets the distance between two vectors
*
* @return The distance
*/
public static double distance(Vector3 par1, Vector3 par2)
{
double var2 = par1.x - par2.x;
double var4 = par1.y - par2.y;
double var6 = par1.z - par2.z;
return MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
}
public double distanceTo(Vector3 vector3)
{
double var2 = vector3.x - this.x;
double var4 = vector3.y - this.y;
double var6 = vector3.z - this.z;
return MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
}
public static Vector3 subtract(Vector3 par1, Vector3 par2)
{
return new Vector3(par1.x - par2.x, par1.y - par2.y, par1.z - par2.z);
}
public static Vector3 add(Vector3 par1, Vector3 par2)
{
return new Vector3(par1.x + par2.x, par1.y + par2.y, par1.z + par2.z);
}
public static Vector3 add(Vector3 par1, double par2)
{
return new Vector3(par1.x + par2, par1.y + par2, par1.z + par2);
}
public void add(Vector3 par1)
{
this.x += par1.x;
this.y += par1.y;
this.z += par1.z;
}
@Override
public void add(double par1)
{
this.x += par1;
this.y += par1;
this.z += par1;
}
public static Vector3 multiply(Vector3 par1, Vector3 par2)
{
return new Vector3(par1.x * par2.x, par1.y * par2.y, par1.z * par2.z);
}
public static Vector3 multiply(Vector3 par1, double par2)
{
return new Vector3(par1.x * par2, par1.y * par2, par1.z * par2);
}
public static Vector3 readFromNBT(String prefix, NBTTagCompound par1NBTTagCompound)
{
Vector3 tempVector = new Vector3();
tempVector.x = par1NBTTagCompound.getDouble(prefix + "X");
tempVector.y = par1NBTTagCompound.getDouble(prefix + "Y");
tempVector.z = par1NBTTagCompound.getDouble(prefix + "Z");
return tempVector;
}
/**
* 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
*/
public void writeToNBT(String prefix, NBTTagCompound par1NBTTagCompound)
{
par1NBTTagCompound.setDouble(prefix + "X", this.x);
par1NBTTagCompound.setDouble(prefix + "Y", this.y);
par1NBTTagCompound.setDouble(prefix + "Z", this.z);
}
@Override
public Vector3 round()
{
return new Vector3(Math.round(this.x), Math.round(this.y), Math.round(this.z));
}
@Override
public Vector3 floor()
{
return new Vector3(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));
}
@Override
public String output()
{
return "Vector3: " + this.x + "," + this.y + "," + this.z;
}
/**
* Gets a position relative to another position's side
*
* @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)
{
switch (side.ordinal())
{
case 0:
this.y -= 1;
break;
case 1:
this.y += 1;
break;
case 2:
this.z -= 1;
break;
case 3:
this.z += 1;
break;
case 4:
this.x -= 1;
break;
case 5:
this.x += 1;
break;
}
}
public static TileEntity getTileEntityFromSide(World world, Vector3 position, ForgeDirection side)
{
position.modifyPositionFromSide(side);
return world.getBlockTileEntity(position.intX(), position.intY(), position.intZ());
}
/**
* Gets a connector unit based on the given side.
*/
public static TileEntity getConnectorFromSide(World world, Vector3 position, ForgeDirection side)
{
TileEntity tileEntity = getTileEntityFromSide(world, position, side);
if (tileEntity instanceof IConnector)
{
if (((IConnector) tileEntity).canConnect(getOrientationFromSide(side, ForgeDirection.NORTH))) { return tileEntity; }
}
return null;
}
/**
* Finds the side of a block depending on it's facing direction from the
* given side. The side numbers are compatible with the
* function"getBlockTextureFromSideAndMetadata".
*
* 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.
* @return The side relative to the facing direction.
*/
public static ForgeDirection getOrientationFromSide(ForgeDirection front, ForgeDirection side)
{
switch (front.ordinal())
{
case 0:
switch (side.ordinal())
{
case 0:
return ForgeDirection.getOrientation(3);
case 1:
return ForgeDirection.getOrientation(2);
case 2:
return ForgeDirection.getOrientation(1);
case 3:
return ForgeDirection.getOrientation(0);
case 4:
return ForgeDirection.getOrientation(5);
case 5:
return ForgeDirection.getOrientation(4);
}
case 1:
switch (side.ordinal())
{
case 0:
return ForgeDirection.getOrientation(4);
case 1:
return ForgeDirection.getOrientation(5);
case 2:
return ForgeDirection.getOrientation(0);
case 3:
return ForgeDirection.getOrientation(1);
case 4:
return ForgeDirection.getOrientation(2);
case 5:
return ForgeDirection.getOrientation(3);
}
case 2:
switch (side.ordinal())
{
case 0:
return ForgeDirection.getOrientation(0);
case 1:
return ForgeDirection.getOrientation(1);
case 2:
return ForgeDirection.getOrientation(3);
case 3:
return ForgeDirection.getOrientation(2);
case 4:
return ForgeDirection.getOrientation(5);
case 5:
return ForgeDirection.getOrientation(4);
}
case 3:
return side;
case 4:
switch (side.ordinal())
{
case 0:
return ForgeDirection.getOrientation(0);
case 1:
return ForgeDirection.getOrientation(1);
case 2:
return ForgeDirection.getOrientation(5);
case 3:
return ForgeDirection.getOrientation(4);
case 4:
return ForgeDirection.getOrientation(3);
case 5:
return ForgeDirection.getOrientation(2);
}
case 5:
switch (side.ordinal())
{
case 0:
return ForgeDirection.getOrientation(0);
case 1:
return ForgeDirection.getOrientation(1);
case 2:
return ForgeDirection.getOrientation(4);
case 3:
return ForgeDirection.getOrientation(5);
case 4:
return ForgeDirection.getOrientation(2);
case 5:
return ForgeDirection.getOrientation(3);
}
}
return ForgeDirection.UNKNOWN;
}
}

View file

@ -1,8 +1,8 @@
package universalelectricity.electricity; package universalelectricity.electricity;
/** /**
* A better way to storage information on electricity * An easy way to display information on electricity.
*
* @author Calclavia * @author Calclavia
*/ */
@ -10,51 +10,41 @@ public class ElectricInfo
{ {
public static enum ElectricUnit public static enum ElectricUnit
{ {
AMPERE("Amp", "I"), AMPERE("Amp", "I"), AMP_HOUR("Amp Hour", "Ah"), VOLTAGE("Volt", "V"), WATT("Watt", "W"), WATT_HOUR("Watt Hour", "Wh"), RESISTANCE("Ohm", "R"), CONDUCTANCE("Siemen", "S"), JOULES("Joule", "J");
AMP_HOUR("Amp Hour", "Ah"),
VOLTAGE("Volt", "V"),
WATT("Watt", "W"),
WATT_HOUR("Watt Hour", "Wh"),
RESISTANCE("Ohm", "R"),
CONDUCTANCE("Siemen", "S"),
JOULES("Joule", "J");
public String name; public String name;
public String symbol; public String symbol;
private ElectricUnit(String name, String symbol) private ElectricUnit(String name, String symbol)
{ {
this.name = name; this.name = name;
this.symbol = symbol; this.symbol = symbol;
} }
public String getPlural() public String getPlural()
{ {
return this.name+"s"; return this.name + "s";
} }
} }
public static enum MeasurementUnit public static enum MeasurementUnit
{ {
MICRO("Micro", "mi", 0.000001), MICRO("Micro", "mi", 0.000001), MILLI("Milli", "m", 0.001), KILO("Kilo", "k", 1000), MEGA("Mega", "M", 1000000);
MILLI("Milli", "m", 0.001),
KILO("Kilo", "k", 1000),
MEGA("Mega", "M", 1000000);
public String name; public String name;
public String symbol; public String symbol;
public double process; public double process;
private MeasurementUnit(String name, String symbol, double process) private MeasurementUnit(String name, String symbol, double process)
{ {
this.name = name; this.name = name;
this.symbol = symbol; this.symbol = symbol;
this.process = process; this.process = process;
} }
public String getName(boolean isSymbol) public String getName(boolean isSymbol)
{ {
if(isSymbol) if (isSymbol)
{ {
return symbol; return symbol;
} }
@ -63,169 +53,149 @@ public class ElectricInfo
return name; return name;
} }
} }
public double process(double value) public double process(double value)
{ {
return value/this.process; return value / this.process;
} }
} }
public static double getJoules(double watts, double seconds) public static double getJoules(double watts, double seconds)
{ {
return watts*seconds; return watts * seconds;
} }
public static double getJoules(double amps, double voltage, double seconds) public static double getJoules(double amps, double voltage, double seconds)
{ {
return amps*voltage*seconds; return amps * voltage * seconds;
} }
public static double getWattsFromJoules(double joules, double seconds) public static double getWattsFromJoules(double joules, double seconds)
{ {
return joules/seconds; return joules / seconds;
} }
public static double getAmps(double watts, double voltage) public static double getAmps(double watts, double voltage)
{ {
return watts/voltage; return watts / voltage;
} }
public static double getAmps(double ampHours) public static double getAmps(double ampHours)
{ {
return ampHours*3600; return ampHours * 3600;
} }
public static double getAmpsFromWattHours(double wattHours, double voltage) public static double getAmpsFromWattHours(double wattHours, double voltage)
{ {
return getWatts(wattHours)/voltage; return getWatts(wattHours) / voltage;
} }
public static double getWattHoursFromAmpHours(double ampHours, double voltage) public static double getWattHoursFromAmpHours(double ampHours, double voltage)
{ {
return ampHours*voltage; return ampHours * voltage;
} }
public static double getAmpHours(double amps) public static double getAmpHours(double amps)
{ {
return amps/3600; return amps / 3600;
} }
public static double getWatts(double amps, double voltage) public static double getWatts(double amps, double voltage)
{ {
return amps*voltage; return amps * voltage;
} }
public static double getWatts(double wattHours) public static double getWatts(double wattHours)
{ {
return wattHours*3600; return wattHours * 3600;
} }
public static double getWattHours(double watts) public static double getWattHours(double watts)
{ {
return watts/3600; return watts / 3600;
} }
public static double getWattHours(double amps, double voltage) public static double getWattHours(double amps, double voltage)
{ {
return getWattHours(getWatts(amps, voltage)); return getWattHours(getWatts(amps, voltage));
} }
public static double getResistance(double amps, double voltage) public static double getResistance(double amps, double voltage)
{ {
return voltage/amps; return voltage / amps;
} }
public static double getConductance(double amps, double voltage) public static double getConductance(double amps, double voltage)
{ {
return amps/voltage; return amps / voltage;
} }
/** /**
* Displays the unit as text. Works only for positive numbers. * Displays the unit as text. Works only for positive numbers.
*/ */
public static String getDisplay(double value, ElectricUnit unit, int significantFigures, boolean isShort) public static String getDisplay(double value, ElectricUnit unit, int significantFigures, boolean isShort)
{ {
String unitName = unit.name; String unitName = unit.name;
if(isShort) if (isShort)
{ {
unitName = unit.symbol; unitName = unit.symbol;
} }
else if(value > 1) else if (value > 1)
{ {
unitName = unit.getPlural(); unitName = unit.getPlural();
} }
if(value == 0) if (value == 0) { return value + " " + unitName; }
{
return value + " " + unitName; if (value <= MeasurementUnit.MILLI.process) { return roundDecimals(MeasurementUnit.MICRO.process(value), significantFigures) + " " + MeasurementUnit.MICRO.getName(isShort) + unitName; }
}
if (value < 1) { return roundDecimals(MeasurementUnit.MILLI.process(value), significantFigures) + " " + MeasurementUnit.MILLI.getName(isShort) + unitName; }
if(value <= MeasurementUnit.MILLI.process)
{ if (value > MeasurementUnit.KILO.process) { return roundDecimals(MeasurementUnit.KILO.process(value), significantFigures) + " " + MeasurementUnit.KILO.getName(isShort) + unitName; }
return roundDecimals(MeasurementUnit.MICRO.process(value), significantFigures) + " " + MeasurementUnit.MICRO.getName(isShort)+unitName;
} if (value > MeasurementUnit.MEGA.process) { return roundDecimals(MeasurementUnit.MEGA.process(value), significantFigures) + " " + MeasurementUnit.MEGA.getName(isShort) + unitName; }
if(value < 1) return roundDecimals(value, significantFigures) + " " + unitName;
{
return roundDecimals(MeasurementUnit.MILLI.process(value), significantFigures) + " " + MeasurementUnit.MILLI.getName(isShort)+unitName;
}
if(value > MeasurementUnit.KILO.process)
{
return roundDecimals(MeasurementUnit.KILO.process(value), significantFigures) + " " + MeasurementUnit.KILO.getName(isShort)+unitName;
}
if(value > MeasurementUnit.MEGA.process)
{
return roundDecimals(MeasurementUnit.MEGA.process(value), significantFigures) + " " + MeasurementUnit.MEGA.getName(isShort)+unitName;
}
return roundDecimals(value, significantFigures) + " " + unitName;
} }
public static String getDisplayShort(double value, ElectricUnit unit) public static String getDisplayShort(double value, ElectricUnit unit)
{ {
return getDisplay(value, unit, 2, true); return getDisplay(value, unit, 2, true);
} }
public static String getDisplay(double value, ElectricUnit unit) public static String getDisplay(double value, ElectricUnit unit)
{ {
return getDisplay(value, unit, 2, false); return getDisplay(value, unit, 2, false);
} }
public static String getDisplaySimple(double value, ElectricUnit unit, int significantFigures) public static String getDisplaySimple(double value, ElectricUnit unit, int significantFigures)
{ {
if(value > 1) if (value > 1)
{ {
if(significantFigures < 1) if (significantFigures < 1) { return (int) value + " " + unit.getPlural(); }
{
return (int)value + " " + unit.getPlural(); return roundDecimals(value, significantFigures) + " " + unit.getPlural();
}
return roundDecimals(value, significantFigures) + " " + unit.getPlural();
} }
if(significantFigures < 1) if (significantFigures < 1) { return (int) value + " " + unit.name; }
{
return (int)value + " " + unit.name; return roundDecimals(value, significantFigures) + " " + unit.name;
}
return roundDecimals(value, significantFigures) + " " + unit.name;
} }
/** /**
* Rounds a number to a specific number place places * Rounds a number to a specific number place places
* @param The number *
* @param The
* number
* @return The rounded number * @return The rounded number
*/ */
public static double roundDecimals(double d, int significantFigures) public static double roundDecimals(double d, int significantFigures)
{ {
int j = (int)(d * Math.pow(10, significantFigures)); int j = (int) (d * Math.pow(10, significantFigures));
return j / (double)Math.pow(10, significantFigures); return j / (double) Math.pow(10, significantFigures);
} }
public static double roundDecimals(double d) public static double roundDecimals(double d)
{ {
return roundDecimals(d, 2); return roundDecimals(d, 2);

View file

@ -9,427 +9,402 @@ import java.util.Map;
import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import universalelectricity.Ticker; import universalelectricity.core.Vector3;
import universalelectricity.implement.IConductor; import universalelectricity.implement.IConductor;
import universalelectricity.implement.IElectricityReceiver; import universalelectricity.implement.IElectricityReceiver;
import universalelectricity.prefab.Vector3;
import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.TickType; 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. * This class is used to manage electricity
* transferring and flow. It is also used to call
* updates on UE tile entities.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public class ElectricityManager public class ElectricityManager
{ {
/** /**
* ElectricityManager exists on both client and server side. * ElectricityManager exists on both client
* Rely on the server side one as it is more accurate! Client side only simulates. * and server side. Rely on the server side
* one as it is more accurate! Client side
* only simulates.
*/ */
public static ElectricityManager instance; public static ElectricityManager instance;
private List<IElectricityReceiver> electricityReceivers = new ArrayList<IElectricityReceiver>();
private List<IConductor> electricConductors = new ArrayList<IConductor>();
private List<ElectricityTransferData> electricityTransferQueue = new ArrayList<ElectricityTransferData>(); private List<ElectricityTransferData> electricityTransferQueue = new ArrayList<ElectricityTransferData>();
private List<ElectricityNetwork> electricityNetworks = new ArrayList<ElectricityNetwork>(); private List<ElectricityNetwork> electricityNetworks = new ArrayList<ElectricityNetwork>();
private int maxConnectionID = 0;
public ElectricityManager()
{
System.out.println("Universal Electricity's Electricity Manager Initiated.");
}
/**
* Registers an electricity consumer for it to receive electricity.
* Call it in your consumer's tile entity constructor like this:
* ElectricityManager.registerConsumer(this);
* @param newUnit - The consumer to be registered.
*/
public void registerElectricUnit(IElectricityReceiver newUnit)
{
if (!this.electricityReceivers.contains(newUnit))
{
this.electricityReceivers.add(newUnit);
}
}
/** public ElectricityManager()
* Registers a UE conductor {
* @param conductor - The conductor tile entity System.out.println("Universal Electricity's Electricity Manager Initiated.");
* @return - The ID of the connection line that is assigned to this conductor }
*/
public void registerConductor(IConductor newConductor)
{
cleanUpConnections();
this.electricityNetworks.add(new ElectricityNetwork(getMaxConnectionID(), newConductor));
if (!this.electricConductors.contains(newConductor)) /**
{ * Registers a the conductor into the UE
this.electricConductors.add(newConductor); * 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. * Merges two connection lines together into
* @param ID1 - ID of connection line * one.
* @param ID2 - ID of connection line *
*/ * @param networkA
public void mergeConnection(int ID1, int ID2) * - The network to be merged into.
{ * This network will be kept.
if(ID1 != ID2) * @param networkB
{ * - The network to be merged. This
ElectricityNetwork connection1 = getConnectionByID(ID1); * network will be deleted.
ElectricityNetwork connection2 = getConnectionByID(ID2); */
public void mergeConnection(ElectricityNetwork networkA, ElectricityNetwork networkB)
if(connection1 != null && connection2 != null) {
{ if (networkA != networkB)
connection1.conductors.addAll(connection2.conductors);
connection1.setID(ID1);
this.electricityNetworks.remove(connection2);
}
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 = getConnectionByID(conductorA.getConnectionID());
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));
}
}
}
/**
* Gets a electricity wire connection line by it's connection ID
* @param ID
* @return
*/
public ElectricityNetwork getConnectionByID(int ID)
{
cleanUpConnections();
for (int i = 0; i < this.electricityNetworks.size(); i++)
{
if (this.electricityNetworks.get(i).getID() == ID)
{
return this.electricityNetworks.get(i);
}
}
return null;
}
/**
* Clean up and remove useless 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!");
}
}
/**
* Get the highest connection ID. Use this to assign new wire connection lines
* @return
*/
public int getMaxConnectionID()
{
this.maxConnectionID ++;
if(this.maxConnectionID >= Integer.MAX_VALUE)
{
this.maxConnectionID = 0;
}
return this.maxConnectionID;
}
/**
* 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 0 The amount of volts this machine is sending.
*/
public void produceElectricity(TileEntity 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 = this.getConnectionByID(targetConductor.getConnectionID());
if(electricityNetwork != null)
{
List<IElectricityReceiver> 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;
//Calculate electricity loss
double distance = Vector3.distance(Vector3.get(sender), Vector3.get((TileEntity)receiver));
double ampsReceived = transferAmps - (transferAmps * transferAmps * targetConductor.getResistance() * distance)/voltage;
double voltsReceived = voltage - (transferAmps * targetConductor.getResistance() * distance);
this.electricityTransferQueue.add(new ElectricityTransferData(sender, receiver, electricityNetwork, ForgeDirection.getOrientation(i).getOpposite(), ampsReceived, voltsReceived));
}
}
}
}
}
}
}
}
/**
* 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(int ID)
{
ElectricityNetwork connection = this.getConnectionByID(ID);
double need = 0;
if (connection != null)
{
for (IConductor conductor : connection.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(int ID)
{
ElectricityNetwork connection = this.getConnectionByID(ID);
double need = 0;
if (connection != null)
{
for (IConductor conductor : connection.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 UE
*/
public void refreshConductors()
{
for(int j = 0; j < this.electricConductors.size(); j ++)
{
IConductor conductor = this.electricConductors.get(j);
conductor.refreshConnectedBlocks();
}
}
/**
* Clean up and remove useless connections
*/
public void cleanUpElectricityReceivers()
{
try
{
for (int i = 0; i < this.electricityReceivers.size(); i++)
{
IElectricityReceiver electricUnit = electricityReceivers.get(i);
//Cleanup useless units
if (electricUnit == null)
{
electricityReceivers.remove(electricUnit);
}
else if (((TileEntity)electricUnit).isInvalid())
{
electricityReceivers.remove(electricUnit);
}
}
}
catch(Exception e)
{ {
System.err.println("Failed to clean up electricity receivers."); if (networkA != null && networkB != null)
e.printStackTrace(); {
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(TileEntity 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<IElectricityReceiver> 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;
// Calculate
// electricity
// loss
double distance = Vector3.distance(Vector3.get(sender), Vector3.get((TileEntity) receiver));
double ampsReceived = transferAmps - (transferAmps * transferAmps * targetConductor.getResistance() * distance) / voltage;
double 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!");
}
}
}
/**
* 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<TickType> type, Object... tickData) public void onTick(EnumSet<TickType> type, Object... tickData)
{ {
if((type.contains(TickType.CLIENT) || type.contains(TickType.WORLD)) && !type.contains(TickType.WORLDLOAD)) if (type.contains(TickType.WORLD) && !type.contains(TickType.WORLDLOAD))
{ {
if (ElectricityManagerTicker.inGameTicks % 40 == 0)
{
this.refreshConductors();
}
try try
{ {
HashMap conductorAmpData = new HashMap<ElectricityNetwork, Double>(); HashMap conductorAmpData = new HashMap<ElectricityNetwork, Double>();
for (int i = 0; i < electricityTransferQueue.size(); i ++) for (int i = 0; i < electricityTransferQueue.size(); i++)
{ {
if(electricityTransferQueue.get(i) != null) if (electricityTransferQueue.get(i) != null)
{ {
if(electricityTransferQueue.get(i).isValid()) if (electricityTransferQueue.get(i).isValid())
{ {
double amps = electricityTransferQueue.get(i).amps; double amps = electricityTransferQueue.get(i).amps;
if(conductorAmpData.containsKey(electricityTransferQueue.get(i).network)) if (conductorAmpData.containsKey(electricityTransferQueue.get(i).network))
{ {
amps += (Double)conductorAmpData.get(electricityTransferQueue.get(i).network); amps += (Double) conductorAmpData.get(electricityTransferQueue.get(i).network);
} }
conductorAmpData.put(electricityTransferQueue.get(i).network, amps); 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.get(i).receiver.onReceive(electricityTransferQueue.get(i).sender, electricityTransferQueue.get(i).amps, electricityTransferQueue.get(i).voltage, electricityTransferQueue.get(i).side);
} }
} }
electricityTransferQueue.remove(i); electricityTransferQueue.remove(i);
} }
Iterator it = conductorAmpData.entrySet().iterator(); Iterator it = conductorAmpData.entrySet().iterator();
while (it.hasNext()) while (it.hasNext())
{ {
Map.Entry pairs = (Map.Entry)it.next(); Map.Entry pairs = (Map.Entry) it.next();
if(pairs.getKey() != null && pairs.getValue() != null) if (pairs.getKey() != null && pairs.getValue() != null)
{ {
if(pairs.getKey() instanceof ElectricityNetwork && pairs.getValue() instanceof Double) if (pairs.getKey() instanceof ElectricityNetwork && pairs.getValue() instanceof Double)
{ {
if(((Double)pairs.getValue()) > ((ElectricityNetwork)pairs.getKey()).getLowestAmpConductor()) if (((Double) pairs.getValue()) > ((ElectricityNetwork) pairs.getKey()).getLowestAmpConductor())
{ {
((ElectricityNetwork)pairs.getKey()).meltDown(); ((ElectricityNetwork) pairs.getKey()).onOverCharge();
} }
} }
} }
it.remove(); it.remove();
} }
} }
catch(Exception e) catch (Exception e)
{ {
System.err.println("Failed to transfer electricity to receivers."); System.err.println("Failed to transfer electricity to receivers.");
e.printStackTrace(); e.printStackTrace();
} }
} }
if(Ticker.inGameTicks == 0) if (ElectricityManagerTicker.inGameTicks == 0)
{ {
this.refreshConductors(); this.refreshConductors();
} }

View file

@ -1,41 +1,40 @@
package universalelectricity; package universalelectricity.electricity;
import java.util.EnumSet; import java.util.EnumSet;
import universalelectricity.electricity.ElectricityManager;
import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.ITickHandler;
import cpw.mods.fml.common.TickType; import cpw.mods.fml.common.TickType;
public class Ticker implements ITickHandler public class ElectricityManagerTicker implements ITickHandler
{ {
public static long inGameTicks = 0; public static long inGameTicks = 0;
@Override @Override
public void tickStart(EnumSet<TickType> type, Object... tickData) public void tickStart(EnumSet<TickType> type, Object... tickData)
{ {
if (ElectricityManager.instance != null)
{
ElectricityManager.instance.onTick(type, tickData);
}
inGameTicks++;
if (inGameTicks >= Long.MAX_VALUE)
{
inGameTicks = 0;
}
} }
@Override @Override
public void tickEnd(EnumSet<TickType> type, Object... tickData) public void tickEnd(EnumSet<TickType> type, Object... tickData)
{ {
if(ElectricityManager.instance != null)
{
ElectricityManager.instance.onTick(type, tickData);
}
inGameTicks ++;
if(inGameTicks >= Long.MAX_VALUE)
{
inGameTicks = 0;
}
} }
@Override @Override
public EnumSet<TickType> ticks() public EnumSet<TickType> ticks()
{ {
return EnumSet.of(TickType.WORLD, TickType.WORLDLOAD, TickType.CLIENT, TickType.SERVER); return EnumSet.of(TickType.WORLD, TickType.WORLDLOAD, TickType.SERVER);
} }
@Override @Override

View file

@ -10,109 +10,114 @@ import universalelectricity.implement.IElectricityReceiver;
public class ElectricityNetwork public class ElectricityNetwork
{ {
private int ID; public List<IConductor> conductors = new ArrayList<IConductor>();
public List<IConductor> conductors = new ArrayList<IConductor>();
public ElectricityNetwork(int ID, IConductor conductor) public ElectricityNetwork(IConductor conductor)
{ {
this.ID = ID; this.addConductor(conductor);
this.addConductor(conductor); }
}
public void addConductor(IConductor newConductor) public void addConductor(IConductor newConductor)
{
this.cleanUpArray();
if (!conductors.contains(newConductor))
{
conductors.add(newConductor);
newConductor.setConnectionID(this.ID);
}
}
/**
* Get only the electric units that can receive electricity from the given side.
*/
public List<IElectricityReceiver> getConnectedReceivers()
{
this.cleanUpArray();
List<IElectricityReceiver> returnArray = new ArrayList<IElectricityReceiver>();
for (IConductor conductor : conductors)
{
for (byte i = 0; i < conductor.getConnectedBlocks().length; i++)
{
TileEntity tileEntity = conductor.getConnectedBlocks()[i];
if (tileEntity != null)
{
if (tileEntity instanceof IElectricityReceiver)
{
if (!returnArray.contains((IElectricityReceiver)tileEntity) && ((IElectricityReceiver)tileEntity).canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite()))
{
returnArray.add((IElectricityReceiver)tileEntity);
}
}
}
}
}
return returnArray;
}
public void cleanUpArray()
{
for (int i = 0; i < conductors.size(); i++)
{
if (conductors.get(i) == null)
{
conductors.remove(i);
}
else if (((TileEntity)conductors.get(i)).isInvalid())
{
conductors.remove(i);
}
}
}
public void setID(int ID)
{
this.ID = ID;
this.cleanUpArray();
for (IConductor conductor : this.conductors)
{
conductor.setConnectionID(this.ID);
}
}
public int getID()
{
return this.ID;
}
public void meltDown()
{ {
this.cleanUpArray(); this.cleanUpArray();
for (int i = 0; i < conductors.size(); i++) if (!conductors.contains(newConductor))
{ {
conductors.get(i).onConductorMelt(); conductors.add(newConductor);
} newConductor.setNetwork(this);
}
} }
/**
* Get only the electric units that can receive electricity from the given
* side.
*/
public List<IElectricityReceiver> getConnectedReceivers()
{
this.cleanUpArray();
List<IElectricityReceiver> returnArray = new ArrayList<IElectricityReceiver>();
for (IConductor conductor : conductors)
{
for (byte i = 0; i < conductor.getConnectedBlocks().length; i++)
{
TileEntity tileEntity = conductor.getConnectedBlocks()[i];
if (tileEntity != null)
{
if (tileEntity instanceof IElectricityReceiver)
{
if (!returnArray.contains((IElectricityReceiver) tileEntity) && ((IElectricityReceiver) tileEntity).canReceiveFromSide(ForgeDirection.getOrientation(i).getOpposite()))
{
returnArray.add((IElectricityReceiver) tileEntity);
}
}
}
}
}
return returnArray;
}
public void cleanUpArray()
{
for (int i = 0; i < conductors.size(); i++)
{
if (conductors.get(i) == null)
{
conductors.remove(i);
}
else if (((TileEntity) conductors.get(i)).isInvalid())
{
conductors.remove(i);
}
}
}
public void setNetwork()
{
this.cleanUpArray();
for (IConductor conductor : this.conductors)
{
conductor.setNetwork(this);
}
}
public void onOverCharge()
{
this.cleanUpArray();
for (int i = 0; i < conductors.size(); i++)
{
conductors.get(i).onOverCharge();
}
}
public double getLowestAmpConductor() public double getLowestAmpConductor()
{ {
double lowestAmp = 0; double lowestAmp = 0;
for(IConductor conductor : conductors) for (IConductor conductor : conductors)
{ {
if(lowestAmp == 0 || conductor.getMaxAmps() < lowestAmp) if (lowestAmp == 0 || conductor.getMaxAmps() < lowestAmp)
{ {
lowestAmp = conductor.getMaxAmps(); lowestAmp = conductor.getMaxAmps();
} }
} }
return lowestAmp; return lowestAmp;
} }
/**
* This function is called to refresh all conductors in this network
*/
public void refreshConductors()
{
for (int j = 0; j < this.conductors.size(); j++)
{
IConductor conductor = this.conductors.get(j);
conductor.refreshConnectedBlocks();
}
}
} }

View file

@ -9,34 +9,34 @@ public class ElectricityTransferData
public TileEntity sender; public TileEntity sender;
public IElectricityReceiver receiver; public IElectricityReceiver receiver;
public ElectricityNetwork network; public ElectricityNetwork network;
public double amps; public double amps;
public double voltage; public double voltage;
public ForgeDirection side; public ForgeDirection side;
/** /**
* @param sender - Tile that's sending electricity. * @param sender
* @param receiver - Receiver that's receiving electricity * - Tile that's sending electricity.
* @param conductor - Conductor that is conducting the electricity * @param receiver
* @param side - * - Receiver that's receiving electricity
* @param amps * @param conductor
* @param voltage * - Conductor that is conducting the electricity
*/ * @param side
public ElectricityTransferData(TileEntity sender, IElectricityReceiver receiver, ElectricityNetwork network, ForgeDirection side, double amps, double voltage) * -
{ * @param amps
this.sender = sender; * @param voltage
this.receiver = receiver; */
this.network = network; public ElectricityTransferData(TileEntity sender, IElectricityReceiver receiver, ElectricityNetwork network, ForgeDirection side, double amps, double voltage)
this.side = side; {
this.amps = amps; this.sender = sender;
this.voltage = voltage; this.receiver = receiver;
} this.network = network;
this.side = side;
public boolean isValid() this.amps = amps;
{ this.voltage = voltage;
return this.sender != null && }
this.receiver != null &&
this.network != null && public boolean isValid()
this.amps > 0 && {
this.voltage > 0; return this.sender != null && this.receiver != null && this.network != null && this.amps > 0 && this.voltage > 0;
} }
} }

View file

@ -3,54 +3,67 @@ package universalelectricity.implement;
import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntity;
import net.minecraft.src.World; import net.minecraft.src.World;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import universalelectricity.electricity.ElectricityNetwork;
/** /**
* Must be applied to all tile entities that are conductors. * Must be applied to all tile entities that are conductors.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IConductor extends IConnector public interface IConductor extends IConnector
{ {
/** /**
* The ID of the connection this conductor is in. * The electrical network this conductor is on.
*/ */
public int getConnectionID(); public ElectricityNetwork getNetwork();
public void setConnectionID(int ID); public void setNetwork(ElectricityNetwork network);
/** /**
* The UE tile entities that this conductor is connected to. * The UE tile entities that this conductor is connected to.
*
* @return * @return
*/ */
public TileEntity[] getConnectedBlocks(); public TileEntity[] getConnectedBlocks();
/** /**
* Gets the resistance of the conductor. Used to calculate energy loss. * Gets the resistance of the conductor. Used to calculate energy loss. A
* A higher resistance means a higher energy loss. * higher resistance means a higher energy loss.
* @return The amount of Ohm's of resistance. *
*/ * @return The amount of Ohm's of resistance.
public double getResistance(); */
public double getResistance();
/**
* The maximum amount of amps this conductor can handle before melting down. This is calculating /**
* PER TICK! * The maximum amount of amps this conductor can handle before melting down.
* @return The amount of amps in volts * This is calculating PER TICK!
*/ *
public double getMaxAmps(); * @return The amount of amps in volts
*/
/** public double getMaxAmps();
* Called when the electricity passing through exceeds the maximum voltage.
*/ /**
public void onConductorMelt(); * Called when the electricity passing through exceeds the maximum voltage.
*/
/** public void onOverCharge();
* Resets the conductor and recalculate connection IDs again
*/ /**
public void reset(); * Resets the conductor and recalculate connection IDs again
*/
public World getWorld(); public void reset();
public void updateConnection(TileEntity tileEntity, ForgeDirection side); public World getWorld();
/**
* 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
*/
public void updateConnection(TileEntity tileEntity, ForgeDirection side);
public void updateConnectionWithoutSplit(TileEntity connectorFromSide, ForgeDirection orientation); public void updateConnectionWithoutSplit(TileEntity connectorFromSide, ForgeDirection orientation);

View file

@ -3,16 +3,19 @@ package universalelectricity.implement;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
/** /**
* Applied to tile entities that can connect to UE wires. * Applied to TileEntities that can connect to UE wires.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IConnector public interface IConnector
{ {
/** /**
* Can this tile entity visually connect to a wire on this specific side? * Can this tile entity visually connect to a wire on this specific side?
* @param side. 0-5 byte *
* @return - True if so. * @param side
*/ * - The side in which the connection is coming from.
public boolean canConnect(ForgeDirection side); * @return - True if so.
*/
public boolean canConnect(ForgeDirection side);
} }

View file

@ -1,21 +1,26 @@
package universalelectricity.implement; package universalelectricity.implement;
/** /**
* This class should be applied to all tile entities (mainly machines) that can be disabled (by things like EMP, short circuit etc.). * This class should be applied to all tile entities (mainly machines) that can
* be disabled (by things like EMP, short circuit etc.).
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IDisableable public interface IDisableable
{ {
/** /**
* This is called when the tile entity is to be disabled. * This is called when the tile entity is to be disabled.
* @param duration - The duration of the disable in ticks. *
*/ * @param duration
public void onDisable(int duration); * - The duration of the disable in ticks.
*/
public void onDisable(int duration);
/** /**
* Called to see if this tile entity is disabled. * Called to see if this tile entity is disabled.
* @return True if the tile entity is disabled. *
*/ * @return True if the tile entity is disabled.
public boolean isDisabled(); */
public boolean isDisabled();
} }

View file

@ -4,14 +4,17 @@ import net.minecraftforge.common.ForgeDirection;
/** /**
* Applied to tile entities that can produce electricity * Applied to tile entities that can produce electricity
*
* @author Calclavia * @author Calclavia
*/ */
public interface IElectricityProducer extends IConnector, IDisableable, IVoltage public interface IElectricityProducer extends IConnector, IDisableable, IVoltage
{ {
/** /**
* Can this machine visually connect to a wire on this specific side? * Can this machine visually connect to a wire on this specific side?
* @param side. 0-5 byte *
* @return - True if so. * @param side
*/ * . 0-5 byte
public boolean canConnect(ForgeDirection side); * @return - True if so.
*/
public boolean canConnect(ForgeDirection side);
} }

View file

@ -3,33 +3,39 @@ package universalelectricity.implement;
import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
/** /**
* The IElectricityReceiver interface is an interface that must be applied to all tile entities that can input or output electricity. * The IElectricityReceiver interface is an interface that must be applied to
* all tile entities that can input or output electricity.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IElectricityReceiver extends IDisableable, IConnector, IVoltage public interface IElectricityReceiver extends IDisableable, IConnector, IVoltage
{ {
/** /**
* Called every tick on this machine. * Called every tick on this machine.
* *
* @param amps - Amount of amps this electric unit is receiving. * @param amps
* @param voltage - The voltage of the electricity sent. If more than one * - Amount of amps this electric unit is receiving.
* packet is being sent to you in this update, the highest voltage will * @param voltage
* override. * - The voltage of the electricity sent. If more than one packet
* @param side - The side of the block in which the electricity is coming from. * is being sent to you in this update, the highest voltage will
*/ * override.
public void onReceive(TileEntity sender, double amps, double voltage, ForgeDirection side); * @param side
* - The side of the block in which the electricity is coming
* from.
*/
public void onReceive(TileEntity sender, double amps, double voltage, ForgeDirection side);
/** /**
* How many watts does this electrical unit need this tick? * How many watts does this electrical unit need this tick? Recommended for
* Recommended for you to return the max electricity storage of this machine (if there is one). * you to return the max electricity storage of this machine (if there is
*/ * one).
public double wattRequest(); */
public double wattRequest();
/** /**
* Can this unit receive electricity from this specific side? * Can this unit receive electricity from this specific side?
*/ */
public boolean canReceiveFromSide(ForgeDirection side); public boolean canReceiveFromSide(ForgeDirection side);
} }

View file

@ -7,23 +7,27 @@ public interface IItemElectric extends IJouleStorage, IVoltage
/** /**
* Called when this item receives electricity. * Called when this item receives electricity.
*/ */
public double onReceive(double amps, double voltage, ItemStack itemStack); public double onReceive(double amps, double voltage, ItemStack itemStack);
/** /**
* Called when something requests electricity from this item. * Called when something requests electricity from this item.
* @return - The amount of given joules *
*/ * @return - The amount of given joules
public double onUse(double joulesNeeded, ItemStack itemStack); */
public double onUse(double joulesNeeded, ItemStack itemStack);
/**
* @return Returns true or false if this consumer can receive electricity at this given tick or moment. /**
*/ * @return Returns true or false if this consumer can receive electricity at
public boolean canReceiveElectricity(); * this given tick or moment.
*/
/** public boolean canReceiveElectricity();
* Can this item give out electricity when placed in an tile entity? Electric items like batteries
* should be able to produce electricity (if they are rechargeable). /**
* @return - True or False. * Can this item give out electricity when placed in an tile entity?
*/ * Electric items like batteries should be able to produce electricity (if
public boolean canProduceElectricity(); * they are rechargeable).
*
* @return - True or False.
*/
public boolean canProduceElectricity();
} }

View file

@ -1,7 +1,9 @@
package universalelectricity.implement; package universalelectricity.implement;
/** /**
* This interface is to be applied to all tile entities which stores energy within them. * This interface is to be applied to all tile entities which stores energy
* within them.
*
* @author Calclavia * @author Calclavia
*/ */
public interface IJouleStorage public interface IJouleStorage
@ -10,12 +12,12 @@ public interface IJouleStorage
* Returns the amount of joules this unit has stored. * Returns the amount of joules this unit has stored.
*/ */
public double getJoules(Object... data); public double getJoules(Object... data);
/** /**
* Sets the amount of joules this unit has stored. * Sets the amount of joules this unit has stored.
*/ */
public void setJoules(double wattHours, Object... data); public void setJoules(double wattHours, Object... data);
/** /**
* Gets the maximum amount of joules this unit can store. * Gets the maximum amount of joules this unit can store.
*/ */

View file

@ -2,12 +2,13 @@ package universalelectricity.implement;
/** /**
* This should be applied on tile entities that can provide redstone power * This should be applied on tile entities that can provide redstone power
*
* @author Henry * @author Henry
* *
*/ */
public interface IRedstoneProvider public interface IRedstoneProvider
{ {
public boolean isPoweringTo(byte side); public boolean isPoweringTo(byte side);
public boolean isIndirectlyPoweringTo(byte side); public boolean isIndirectlyPoweringTo(byte side);
} }

View file

@ -1,21 +1,21 @@
package universalelectricity.implement; package universalelectricity.implement;
/** /**
* OPTIONAL * OPTIONAL This interface should be applied onto all tile entities that needs
* This interface should be applied onto all tile entities that needs to receive redstone power. * to receive redstone power. Look at TileEntityBatteryBox for reference.
* Look at TileEntityBatteryBox for reference. *
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IRedstoneReceptor public interface IRedstoneReceptor
{ {
/** /**
* Called when the block is powered on by redstone * Called when the block is powered on by redstone
*/ */
public void onPowerOn(); public void onPowerOn();
/** /**
* Called when the block is powered off by redstone * Called when the block is powered off by redstone
*/ */
public void onPowerOff(); public void onPowerOff();
} }

View file

@ -3,26 +3,31 @@ package universalelectricity.implement;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
/** /**
* OPTIONAL * This interface should be applied onto all tile entities that are
* This interface should be applied onto all tile entities that are rotatable. This interface however is optional * rotatable. This interface however is optional and you do not need it for your
* and you do not need it for your add-on to function. It just makes things easier for you to code. * add-on to function. It just makes things easier for you to code.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface IRotatable public interface IRotatable
{ {
/** /**
* Gets the facing direction of the tile entity. Always returns the front side of the tile entity. * Gets the facing direction of the tile entity. Always returns the front
* @return The facing side from 0-5 The full list of which side the number represents * side of the tile entity.
* is in the UniversalElectricity class. *
*/ * @return The facing side from 0-5 The full list of which side the number
public ForgeDirection getDirection(); * represents is in the UniversalElectricity class.
*/
public ForgeDirection getDirection();
/** /**
* Sets the facing direction of the tile entity. * 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
public void setDirection(ForgeDirection facingDirection); * represents is in the UniversalElectricity class.
*/
public void setDirection(ForgeDirection facingDirection);
} }

28
src/common/universalelectricity/implement/ITier.java Normal file → Executable file
View file

@ -1,21 +1,25 @@
package universalelectricity.implement; package universalelectricity.implement;
/** /**
* This interface should be applied to all things that has a tier/level * This interface should be applied to all things that has a tier/level.
*
* @author Calclavia * @author Calclavia
* *
*/ */
public interface ITier public interface ITier
{ {
/** /**
* Gets the tier of this object * Gets the tier of this object
* @return - The tier *
*/ * @return - The tier
public int getTier(); */
public int getTier();
/** /**
* Sets the tier of the object * Sets the tier of the object
* @param tier - The tier to be set *
*/ * @param tier
public void setTier(int tier); * - The tier to be set
*/
public void setTier(int tier);
} }

15
src/common/universalelectricity/implement/IVoltage.java Normal file → Executable file
View file

@ -1,10 +1,15 @@
package universalelectricity.implement; package universalelectricity.implement;
/**
* Applies to all objects that has a voltage.
* @author Calclavia
*
*/
public interface IVoltage public interface IVoltage
{ {
/** /**
* Gets the voltage of this object. * Gets the voltage of this object.
* @return The amount of volts. E.g 120v or 240v * @return The amount of volts. E.g 120v or 240v
*/ */
public double getVoltage(); public double getVoltage();
} }

View file

@ -9,21 +9,21 @@ import cpw.mods.fml.common.registry.LanguageRegistry;
public class UEDamageSource extends DamageSource public class UEDamageSource extends DamageSource
{ {
public static final List<UEDamageSource> damageSources = new ArrayList<UEDamageSource>(); public static final List<UEDamageSource> damageSources = new ArrayList<UEDamageSource>();
/** /**
* Use this damage source for all types of electrical attacks. * Use this damage source for all types of electrical attacks.
*/ */
public static final UEDamageSource electrocution = (UEDamageSource)new UEDamageSource("electrocution", "%1$s got electrocuted!").setDamageBypassesArmor(); public static final UEDamageSource electrocution = (UEDamageSource) new UEDamageSource("electrocution", "%1$s got electrocuted!").setDamageBypassesArmor();
public String deathMessage; public String deathMessage;
public UEDamageSource(String damageType) public UEDamageSource(String damageType)
{ {
super(damageType); super(damageType);
damageSources.add(this); damageSources.add(this);
} }
public UEDamageSource(String damageType, String deathMessage) public UEDamageSource(String damageType, String deathMessage)
{ {
this(damageType); this(damageType);
this.setDeathMessage(deathMessage); this.setDeathMessage(deathMessage);
@ -34,32 +34,24 @@ public class UEDamageSource extends DamageSource
this.deathMessage = deathMessage; this.deathMessage = deathMessage;
return this; return this;
} }
public static void registerDeathMesages()
{
for(UEDamageSource damageSource : damageSources)
{
damageSource.registerDeathMessage();
}
}
public DamageSource setDamageBypassesArmor() public DamageSource setDamageBypassesArmor()
{ {
return super.setDamageBypassesArmor(); return super.setDamageBypassesArmor();
} }
public DamageSource setDamageAllowedInCreativeMode() public DamageSource setDamageAllowedInCreativeMode()
{ {
return super.setDamageAllowedInCreativeMode(); return super.setDamageAllowedInCreativeMode();
} }
public DamageSource setFireDamage() public DamageSource setFireDamage()
{ {
return super.setFireDamage(); return super.setFireDamage();
} }
public void registerDeathMessage() public void registerDeathMessage()
{ {
LanguageRegistry.instance().addStringLocalization("death."+this.damageType, this.deathMessage); LanguageRegistry.instance().addStringLocalization("death." + this.damageType, this.deathMessage);
} }
} }

View file

@ -1,15 +0,0 @@
package universalelectricity.network;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.NetworkManager;
import net.minecraft.src.Packet250CustomPayload;
import com.google.common.io.ByteArrayDataInput;
public interface IPacketReceiver
{
/**
* Sends some data to the tile entity.
*/
public void handlePacketData(NetworkManager network, int packetType, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream);
}

View file

@ -1,12 +0,0 @@
package universalelectricity.network;
import universalelectricity.network.ConnectionHandler.ConnectionType;
public interface ISimpleConnectionHandler
{
/**
* Called when a player logs in. Use this to reset some tile entities variables if you need to.
* @param player
*/
public void handelConnection(ConnectionType type, Object... data);
}

View file

@ -1,264 +0,0 @@
package universalelectricity.network;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.NetworkManager;
import net.minecraft.src.Packet;
import net.minecraft.src.Packet250CustomPayload;
import net.minecraft.src.TileEntity;
import net.minecraft.src.World;
import universalelectricity.prefab.Vector3;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;
/**
* This class is used for sending and receiving packets between the server
* and the client. You can directly use this by registering this packet manager
* with NetworkMod. Example:
* @NetworkMod(channels = { "BasicComponents" }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketManager.class)
*
* Check out {@link #BasicComponents} for better reference.
*
* @author Calclavia
*/
public class PacketManager implements IPacketHandler, IPacketReceiver
{
public enum PacketType
{
UNSPECIFIED, TILEENTITY;
public static PacketType get(int id)
{
if (id >= 0 && id < PacketType.values().length)
{
return PacketType.values()[id];
}
return UNSPECIFIED;
}
}
public static Packet getPacketWithID(String channelName, int id, Object... sendData)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
DataOutputStream data = new DataOutputStream(bytes);
try
{
data.writeInt(id);
data = encodeDataStream(data, sendData);
Packet250CustomPayload packet = new Packet250CustomPayload();
packet.channel = channelName;
packet.data = bytes.toByteArray();
packet.length = packet.data.length;
return packet;
}
catch (IOException e)
{
System.out.println("Failed to create packet.");
e.printStackTrace();
}
return null;
}
public static Packet getPacket(String channelName, Object... sendData)
{
return getPacketWithID(channelName, PacketType.UNSPECIFIED.ordinal(), sendData);
}
/**
* Gets a packet for the tile entity.
* @return
*/
public static Packet getPacket(String channelName, TileEntity sender, Object... sendData)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
DataOutputStream data = new DataOutputStream(bytes);
try
{
data.writeInt(PacketType.TILEENTITY.ordinal());
data.writeInt(sender.xCoord);
data.writeInt(sender.yCoord);
data.writeInt(sender.zCoord);
data = encodeDataStream(data, sendData);
Packet250CustomPayload packet = new Packet250CustomPayload();
packet.channel = channelName;
packet.data = bytes.toByteArray();
packet.length = packet.data.length;
return packet;
}
catch (IOException e)
{
System.out.println("Failed to create packet.");
e.printStackTrace();
}
return null;
}
/**
* Sends packets to clients around a specific coordinate. A wrapper using Vector3.
* See {@PacketDispatcher} for detailed information.
*/
public static void sendPacketToClients(Packet packet, World worldObj, Vector3 position, double range)
{
try
{
PacketDispatcher.sendPacketToAllAround(position.x, position.y, position.z, range, worldObj.provider.dimensionId, packet);
}
catch (Exception e)
{
System.out.println("Sending packet to client failed.");
e.printStackTrace();
}
}
/**
* Sends a packet to all the clients on this server.
*/
public static void sendPacketToClients(Packet packet, World worldObj)
{
try
{
PacketDispatcher.sendPacketToAllInDimension(packet, worldObj.provider.dimensionId);
}
catch (Exception e)
{
System.out.println("Sending packet to client failed.");
e.printStackTrace();
}
}
public static void sendPacketToClients(Packet packet)
{
try
{
if(FMLCommonHandler.instance().getMinecraftServerInstance() != null)
{
FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().sendPacketToAllPlayers(packet);
}
}
catch (Exception e)
{
System.out.println("Sending packet to client failed.");
e.printStackTrace();
}
}
public static DataOutputStream encodeDataStream(DataOutputStream data, Object... sendData)
{
try
{
for(Object dataValue : sendData)
{
if(dataValue instanceof Integer)
{
data.writeInt((Integer)dataValue);
}
else if(dataValue instanceof Float)
{
data.writeFloat((Float)dataValue);
}
else if(dataValue instanceof Double)
{
data.writeDouble((Double)dataValue);
}
else if(dataValue instanceof Byte)
{
data.writeByte((Byte)dataValue);
}
else if(dataValue instanceof Boolean)
{
data.writeBoolean((Boolean)dataValue);
}
else if(dataValue instanceof String)
{
data.writeUTF((String)dataValue);
}
else if(dataValue instanceof Short)
{
data.writeShort((Short)dataValue);
}
else if(dataValue instanceof Long)
{
data.writeLong((Long)dataValue);
}
}
return data;
}
catch (IOException e)
{
System.out.println("Packet data encoding failed.");
e.printStackTrace();
}
return data;
}
@Override
public void onPacketData(NetworkManager network, Packet250CustomPayload packet, Player player)
{
try
{
ByteArrayDataInput data = ByteStreams.newDataInput(packet.data);
int packetTypeID = data.readInt();
PacketType packetType = PacketType.get(packetTypeID);
if(packetType == PacketType.TILEENTITY)
{
int x = data.readInt();
int y = data.readInt();
int z = data.readInt();
World world = ((EntityPlayer)player).worldObj;
if(world != null)
{
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity != null)
{
if(tileEntity instanceof IPacketReceiver)
{
((IPacketReceiver)tileEntity).handlePacketData(network, packetTypeID, packet, ((EntityPlayer)player), data);
}
}
}
}
else
{
this.handlePacketData(network, packetTypeID, packet, ((EntityPlayer)player), data);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
@Override
public void handlePacketData(NetworkManager network, int packetType, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream)
{
}
}

View file

@ -1,49 +0,0 @@
package universalelectricity.network;
import java.util.Arrays;
import java.util.List;
import net.minecraft.src.CommandBase;
import net.minecraft.src.ICommand;
import net.minecraft.src.ICommandSender;
import net.minecraft.src.WrongUsageException;
import universalelectricity.UniversalElectricity;
public class UECommand extends CommandBase
{
@Override
public int compareTo(Object arg0)
{
return this.getCommandName().compareTo(((ICommand)arg0).getCommandName());
}
@Override
public String getCommandName()
{
return "universalelectricity";
}
@Override
public String getCommandUsage(ICommandSender sender)
{
return "/" + this.getCommandName();
}
@Override
public List getCommandAliases()
{
return Arrays.asList(new String[]{"ue"});
}
@Override
public void processCommand(ICommandSender sender, String[] arguments)
{
if(arguments.length <= 0)
{
sender.sendChatToPlayer(String.format("You are using Universal Electricity v" + UniversalElectricity.VERSION));
return;
}
throw new WrongUsageException(this.getCommandUsage(sender));
}
}

View file

@ -1,91 +0,0 @@
package universalelectricity.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.MinecraftForge;
import net.minecraftforge.oredict.OreDictionary;
import universalelectricity.UEConfig;
import universalelectricity.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()
{
this.shouldGenerate = shouldGenerateOre(name);
return this;
}
//You may inherit from this class and change this function if you want a custom texture render for your ore.
public int getBlockTextureFromSide(int side)
{
return this.blockIndexTexture;
}
//Checks the config file and see if Universal Electricity should generate this ore
private static boolean shouldGenerateOre(String oreName)
{
return UEConfig.getConfigData(UniversalElectricity.CONFIGURATION, "Generate " + oreName, true);
}
public abstract void generate(World world, Random random, int varX, int varZ);
public abstract boolean isOreGeneratedInWorld(World world, IChunkProvider chunkGenerator);
}

View file

@ -1,128 +0,0 @@
package universalelectricity.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)
);
}
}

Some files were not shown because too many files have changed in this diff Show more