Fixed battery tiers

This commit is contained in:
Calclavia 2014-01-19 20:19:58 +08:00
parent 06a9c10788
commit a3122c7e0f
2 changed files with 280 additions and 255 deletions

View file

@ -21,148 +21,170 @@ import calclavia.lib.utility.LanguageUtility;
@UniversalClass @UniversalClass
public class ItemBlockBattery extends ItemBlock implements IEnergyItem, IVoltageItem public class ItemBlockBattery extends ItemBlock implements IEnergyItem, IVoltageItem
{ {
public ItemBlockBattery(int id) public ItemBlockBattery(int id)
{ {
super(id); super(id);
this.setMaxStackSize(1); this.setMaxStackSize(1);
this.setMaxDamage(100); this.setMaxDamage(100);
this.setNoRepair(); this.setNoRepair();
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4)
{ {
String color = ""; String color = "";
long joules = this.getEnergy(itemStack); long joules = this.getEnergy(itemStack);
if (joules <= this.getEnergyCapacity(itemStack) / 3) if (joules <= this.getEnergyCapacity(itemStack) / 3)
{ {
color = "\u00a74"; color = "\u00a74";
} }
else if (joules > this.getEnergyCapacity(itemStack) * 2 / 3) else if (joules > this.getEnergyCapacity(itemStack) * 2 / 3)
{ {
color = "\u00a72"; color = "\u00a72";
} }
else else
{ {
color = "\u00a76"; color = "\u00a76";
} }
itemStack.getItemDamageForDisplay(); itemStack.getItemDamageForDisplay();
list.add(LanguageUtility.getLocal("tooltip.battery.energy").replace("%0", color).replace("%1", EnumColor.GREY.toString()).replace("%v0", UnitDisplay.getDisplayShort(joules, Unit.JOULES)).replace("%v1", UnitDisplay.getDisplayShort(this.getEnergyCapacity(itemStack), Unit.JOULES))); list.add(LanguageUtility.getLocal("tooltip.battery.energy").replace("%0", color).replace("%1", EnumColor.GREY.toString()).replace("%v0", UnitDisplay.getDisplayShort(joules, Unit.JOULES)).replace("%v1", UnitDisplay.getDisplayShort(this.getEnergyCapacity(itemStack), Unit.JOULES)));
} }
@Override @Override
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata)
{ {
boolean place = super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata); boolean place = super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, getTier(stack));
if (place) if (place)
{ {
TileBattery tileEntity = (TileBattery) world.getBlockTileEntity(x, y, z); TileBattery tileEntity = (TileBattery) world.getBlockTileEntity(x, y, z);
tileEntity.setEnergy(null, this.getEnergy(stack)); tileEntity.setEnergy(null, this.getEnergy(stack));
} }
return place; return place;
} }
/** Makes sure the item is uncharged when it is crafted and not charged. Change this if you do /**
* not want this to happen! */ * Makes sure the item is uncharged when it is crafted and not charged. Change this if you do
@Override * not want this to happen!
public void onCreated(ItemStack itemStack, World par2World, EntityPlayer par3EntityPlayer) */
{ @Override
this.setEnergy(itemStack, 0); public void onCreated(ItemStack itemStack, World par2World, EntityPlayer par3EntityPlayer)
} {
this.setEnergy(itemStack, 0);
}
@Override @Override
public long recharge(ItemStack itemStack, long energy, boolean doReceive) public long recharge(ItemStack itemStack, long energy, boolean doReceive)
{ {
long rejectedElectricity = Math.max((this.getEnergy(itemStack) + energy) - this.getEnergyCapacity(itemStack), 0); long rejectedElectricity = Math.max((this.getEnergy(itemStack) + energy) - this.getEnergyCapacity(itemStack), 0);
long energyToReceive = Math.min(energy - rejectedElectricity, getTransferRate(itemStack)); long energyToReceive = Math.min(energy - rejectedElectricity, getTransferRate(itemStack));
if (doReceive) if (doReceive)
{ {
this.setEnergy(itemStack, this.getEnergy(itemStack) + energyToReceive); this.setEnergy(itemStack, this.getEnergy(itemStack) + energyToReceive);
} }
return energyToReceive; return energyToReceive;
} }
@Override @Override
public long discharge(ItemStack itemStack, long energy, boolean doTransfer) public long discharge(ItemStack itemStack, long energy, boolean doTransfer)
{ {
long energyToExtract = Math.min(Math.min(this.getEnergy(itemStack), energy), getTransferRate(itemStack)); long energyToExtract = Math.min(Math.min(this.getEnergy(itemStack), energy), getTransferRate(itemStack));
if (doTransfer) if (doTransfer)
{ {
this.setEnergy(itemStack, this.getEnergy(itemStack) - energyToExtract); this.setEnergy(itemStack, this.getEnergy(itemStack) - energyToExtract);
} }
return energyToExtract; return energyToExtract;
} }
@Override @Override
public long getVoltage(ItemStack itemStack) public long getVoltage(ItemStack itemStack)
{ {
return UniversalElectricity.DEFAULT_VOLTAGE; return UniversalElectricity.DEFAULT_VOLTAGE;
} }
@Override @Override
public void setEnergy(ItemStack itemStack, long joules) public void setEnergy(ItemStack itemStack, long joules)
{ {
if (itemStack.getTagCompound() == null) if (itemStack.getTagCompound() == null)
{ {
itemStack.setTagCompound(new NBTTagCompound()); itemStack.setTagCompound(new NBTTagCompound());
} }
long electricityStored = Math.max(Math.min(joules, this.getEnergyCapacity(itemStack)), 0); long electricityStored = Math.max(Math.min(joules, this.getEnergyCapacity(itemStack)), 0);
itemStack.getTagCompound().setLong("electricity", electricityStored); itemStack.getTagCompound().setLong("electricity", electricityStored);
} }
public long getTransfer(ItemStack itemStack) public long getTransfer(ItemStack itemStack)
{ {
return this.getEnergyCapacity(itemStack) - this.getEnergy(itemStack); return this.getEnergyCapacity(itemStack) - this.getEnergy(itemStack);
} }
/** Gets the energy stored in the item. Energy is stored using item NBT */ /** Gets the energy stored in the item. Energy is stored using item NBT */
@Override @Override
public long getEnergy(ItemStack itemStack) public long getEnergy(ItemStack itemStack)
{ {
if (itemStack.getTagCompound() == null) if (itemStack.getTagCompound() == null)
{ {
itemStack.setTagCompound(new NBTTagCompound()); itemStack.setTagCompound(new NBTTagCompound());
} }
long energyStored = itemStack.getTagCompound().getLong("electricity"); long energyStored = itemStack.getTagCompound().getLong("electricity");
return energyStored; return energyStored;
} }
@Override public ItemStack setTier(ItemStack itemStack, byte tier)
public int getDisplayDamage(ItemStack stack) {
{ if (itemStack.getTagCompound() == null)
return (int) (100 - ((double) this.getEnergy(stack) / (double) getEnergyCapacity(stack)) * 100); {
} itemStack.setTagCompound(new NBTTagCompound());
}
@Override itemStack.getTagCompound().setByte("tier", tier);
public long getEnergyCapacity(ItemStack theItem) return itemStack;
{ }
return TileBattery.getEnergyForTier(theItem.getItemDamage() + 1);
}
public long getTransferRate(ItemStack itemStack) public byte getTier(ItemStack itemStack)
{ {
return this.getEnergyCapacity(itemStack) / 100; if (itemStack.getTagCompound() == null)
} {
itemStack.setTagCompound(new NBTTagCompound());
}
return itemStack.getTagCompound().getByte("tier");
}
@SuppressWarnings("unchecked") @Override
@Override public int getDisplayDamage(ItemStack stack)
public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) {
{ return (int) (100 - ((double) this.getEnergy(stack) / (double) getEnergyCapacity(stack)) * 100);
par3List.add(new ItemStack(this, 1, 0)); }
par3List.add(CompatibilityModule.getItemWithCharge(new ItemStack(this, 1, 0), this.getEnergyCapacity(new ItemStack(this, 1, 0))));
par3List.add(new ItemStack(this, 1, 1));
par3List.add(CompatibilityModule.getItemWithCharge(new ItemStack(this, 1, 1), this.getEnergyCapacity(new ItemStack(this, 1, 1))));
} @Override
public long getEnergyCapacity(ItemStack theItem)
{
return TileBattery.getEnergyForTier(theItem.getItemDamage() + 1);
}
public long getTransferRate(ItemStack itemStack)
{
return this.getEnergyCapacity(itemStack) / 100;
}
@SuppressWarnings("unchecked")
@Override
public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
{
for (byte tier = 0; tier < 3; tier++)
{
par3List.add(setTier(new ItemStack(this, 1), tier));
par3List.add(setTier(CompatibilityModule.getItemWithCharge(new ItemStack(this, 1, 0), this.getEnergyCapacity(new ItemStack(this, 1, 0))), tier));
}
}
} }

View file

@ -24,171 +24,174 @@ import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.PacketDispatcher;
/** A modular battery. /**
* A modular battery.
* *
* @author Calclavia */ * @author Calclavia
*/
public class TileBattery extends TileElectrical implements IConnector<BatteryStructure>, IVoltageInput, IVoltageOutput, IPacketSender, IPacketReceiver, IEnergyInterface, IEnergyContainer public class TileBattery extends TileElectrical implements IConnector<BatteryStructure>, IVoltageInput, IVoltageOutput, IPacketSender, IPacketReceiver, IEnergyInterface, IEnergyContainer
{ {
/** The transfer rate **/ /** The transfer rate **/
public static final long DEFAULT_WATTAGE = getEnergyForTier(1); public static final long DEFAULT_WATTAGE = getEnergyForTier(1);
/** Voltage increases as series connection increases */ /** Voltage increases as series connection increases */
public static final long DEFAULT_VOLTAGE = UniversalElectricity.DEFAULT_VOLTAGE; public static final long DEFAULT_VOLTAGE = UniversalElectricity.DEFAULT_VOLTAGE;
private BatteryStructure structure; private BatteryStructure structure;
public Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>(); public Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>();
public float clientEnergy; public float clientEnergy;
public int clientCells; public int clientCells;
public float clientMaxEnergy; public float clientMaxEnergy;
public TileBattery() public TileBattery()
{ {
this.energy = new EnergyStorageHandler(getEnergyForTier(1)); this.energy = new EnergyStorageHandler(getEnergyForTier(1));
this.saveIOMap = true; this.saveIOMap = true;
} }
public static long getEnergyForTier(int tier) /**
{ * @param tier - 0, 1, 2
if (tier <= 0) * @return
{ */
tier = 1; public static long getEnergyForTier(int tier)
} {
return (long) Math.pow(1000000, tier); return (long) Math.pow(1000000, tier + 1);
} }
@Override @Override
public void initiate() public void initiate()
{ {
this.updateStructure(); this.updateStructure();
} }
public void updateStructure() public void updateStructure()
{ {
if (!this.worldObj.isRemote) if (!this.worldObj.isRemote)
{ {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) energy.setCapacity(getEnergyForTier(getBlockMetadata()));
{ for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj); {
TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj);
if (tile instanceof TileBattery) if (tile instanceof TileBattery)
{ {
this.getNetwork().merge(((TileBattery) tile).getNetwork()); this.getNetwork().merge(((TileBattery) tile).getNetwork());
} }
} }
this.energy.setMaxTransfer(DEFAULT_WATTAGE * this.getNetwork().get().size()); this.energy.setMaxTransfer(DEFAULT_WATTAGE * this.getNetwork().get().size());
this.getNetwork().redistribute(); this.getNetwork().redistribute();
} }
} }
@Override @Override
public void updateEntity() public void updateEntity()
{ {
super.updateEntity(); super.updateEntity();
if (!this.worldObj.isRemote) if (!this.worldObj.isRemote)
{ {
if (this.produce() > 0) if (this.produce() > 0)
{ {
this.getNetwork().redistribute(); this.getNetwork().redistribute();
} }
} }
} }
@Override @Override
public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive)
{ {
long returnValue = super.onReceiveEnergy(from, receive, doReceive); long returnValue = super.onReceiveEnergy(from, receive, doReceive);
this.getNetwork().redistribute(); this.getNetwork().redistribute();
return returnValue; return returnValue;
} }
@Override @Override
public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract) public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract)
{ {
long returnValue = super.onExtractEnergy(from, extract, doExtract); long returnValue = super.onExtractEnergy(from, extract, doExtract);
this.getNetwork().redistribute(); this.getNetwork().redistribute();
return returnValue; return returnValue;
} }
public void updateClient() public void updateClient()
{ {
PacketDispatcher.sendPacketToAllPlayers(ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray())); PacketDispatcher.sendPacketToAllPlayers(ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray()));
} }
@Override @Override
public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra)
{ {
} }
@Override @Override
public ArrayList getPacketData(int type) public ArrayList getPacketData(int type)
{ {
ArrayList data = new ArrayList(); ArrayList data = new ArrayList();
return data; return data;
} }
@Override @Override
public BatteryStructure getNetwork() public BatteryStructure getNetwork()
{ {
if (this.structure == null) if (this.structure == null)
{ {
this.structure = new BatteryStructure(); this.structure = new BatteryStructure();
this.structure.add(this); this.structure.add(this);
} }
return this.structure; return this.structure;
} }
@Override @Override
public void setNetwork(BatteryStructure structure) public void setNetwork(BatteryStructure structure)
{ {
this.structure = structure; this.structure = structure;
} }
@Override @Override
public Object[] getConnections() public Object[] getConnections()
{ {
Object[] connections = new Object[6]; Object[] connections = new Object[6];
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{ {
TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj); TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj);
if (tile instanceof TileBattery) if (tile instanceof TileBattery)
{ {
connections[dir.ordinal()] = tile; connections[dir.ordinal()] = tile;
} }
} }
return connections; return connections;
} }
@Override @Override
public void invalidate() public void invalidate()
{ {
this.getNetwork().redistribute(this); this.getNetwork().redistribute(this);
this.getNetwork().split(this); this.getNetwork().split(this);
super.invalidate(); super.invalidate();
} }
@Override @Override
public long getVoltageOutput(ForgeDirection side) public long getVoltageOutput(ForgeDirection side)
{ {
return DEFAULT_VOLTAGE; return DEFAULT_VOLTAGE;
} }
@Override @Override
public long getVoltageInput(ForgeDirection direction) public long getVoltageInput(ForgeDirection direction)
{ {
return DEFAULT_VOLTAGE; return DEFAULT_VOLTAGE;
} }
@Override @Override
public void onWrongVoltage(ForgeDirection direction, long voltage) public void onWrongVoltage(ForgeDirection direction, long voltage)
{ {
} }
} }