Got modular battery working with UE

This commit is contained in:
Calclavia 2013-08-07 00:33:50 -04:00
parent c5bad9c491
commit a93571ad33
8 changed files with 122 additions and 113 deletions

@ -1 +1 @@
Subproject commit 688cfc13e8d045a25924c81c2e130dce1d3f842a Subproject commit b3efc76d869dc6d9a104c9338cc1cf8c32e307b8

View file

@ -44,7 +44,7 @@ public class ItemCapacitor extends ItemUniversalElectric
@Override @Override
public float getMaxElectricityStored(ItemStack theItem) public float getMaxElectricityStored(ItemStack theItem)
{ {
return 25; return 20;
} }
} }

View file

@ -4,6 +4,7 @@
package resonantinduction.battery; package resonantinduction.battery;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -13,25 +14,26 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import resonantinduction.PacketHandler; import resonantinduction.PacketHandler;
import resonantinduction.api.ITesla;
import resonantinduction.base.IPacketReceiver; import resonantinduction.base.IPacketReceiver;
import resonantinduction.base.ListUtil; import resonantinduction.base.ListUtil;
import resonantinduction.tesla.TeslaGrid;
import universalelectricity.compatibility.TileEntityUniversalElectrical; import universalelectricity.compatibility.TileEntityUniversalElectrical;
import universalelectricity.core.electricity.ElectricityPack;
import universalelectricity.core.item.IItemElectric; import universalelectricity.core.item.IItemElectric;
import universalelectricity.core.vector.Vector3; import universalelectricity.core.vector.Vector3;
import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;
/** /**
* A modular battery with no GUI. * A modular battery with no GUI.
* *
* @author AidanBrady * @author AidanBrady
*/ */
public class TileEntityBattery extends TileEntityUniversalElectrical implements IPacketReceiver, IInventory, ITesla public class TileEntityBattery extends TileEntityUniversalElectrical implements IPacketReceiver, IInventory
{ {
public Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>(); public Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>();
@ -46,18 +48,13 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
@Override @Override
public void updateEntity() public void updateEntity()
{ {
ticks++; super.updateEntity();
if (ticks == 1) if (!this.worldObj.isRemote)
{ {
TeslaGrid.instance().register(this); if (this.ticks == 5 && !structure.isMultiblock)
}
if (!worldObj.isRemote)
{ {
if (ticks == 5 && !structure.isMultiblock) this.update();
{
update();
} }
if (structure.visibleInventory[0] != null) if (structure.visibleInventory[0] != null)
@ -80,7 +77,7 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
float batteryNeeded = battery.getMaxElectricityStored(itemStack) - battery.getElectricityStored(itemStack); float batteryNeeded = battery.getMaxElectricityStored(itemStack) - battery.getElectricityStored(itemStack);
float toGive = Math.min(energyStored, Math.min(battery.getTransfer(itemStack), batteryNeeded)); float toGive = Math.min(energyStored, Math.min(battery.getTransfer(itemStack), batteryNeeded));
battery.setElectricity(itemStack, battery.getElectricityStored(itemStack) + removeEnergy(toGive, true)); battery.setElectricity(itemStack, battery.getElectricityStored(itemStack) + provideElectricity(toGive, true).getWatts());
} }
if (structure.visibleInventory[2] != null) if (structure.visibleInventory[2] != null)
@ -92,7 +89,7 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
float batteryStored = battery.getElectricityStored(itemStack); float batteryStored = battery.getElectricityStored(itemStack);
float toReceive = Math.min(energyNeeded, Math.min(battery.getTransfer(itemStack), batteryStored)); float toReceive = Math.min(energyNeeded, Math.min(battery.getTransfer(itemStack), batteryStored));
battery.setElectricity(itemStack, battery.getElectricityStored(itemStack) - addEnergy(toReceive, true)); battery.setElectricity(itemStack, battery.getElectricityStored(itemStack) - receiveElectricity(toReceive, true));
} }
if (prevStructure != structure) if (prevStructure != structure)
@ -114,6 +111,13 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
{ {
updateClient(); updateClient();
} }
for (EntityPlayer player : this.playersUsing)
{
PacketDispatcher.sendPacketToPlayer(PacketHandler.getTileEntityPacket(this, this.getNetworkedData(new ArrayList()).toArray()), (Player) player);
}
this.produce();
} }
} }
@ -142,13 +146,6 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
} }
} }
@Override
public void invalidate()
{
TeslaGrid.instance().unregister(this);
super.invalidate();
}
@Override @Override
public void readFromNBT(NBTTagCompound nbtTags) public void readFromNBT(NBTTagCompound nbtTags)
{ {
@ -261,11 +258,10 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
} }
} }
/** @Override
* @return added energy public float receiveElectricity(ElectricityPack receive, boolean doAdd)
*/
public float addEnergy(float amount, boolean doAdd)
{ {
float amount = receive.getWatts();
float added = 0; float added = 0;
for (ItemStack itemStack : structure.inventory) for (ItemStack itemStack : structure.inventory)
@ -294,15 +290,14 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
return added; return added;
} }
/** @Override
* @return removed energy public ElectricityPack provideElectricity(ElectricityPack pack, boolean doRemove)
*/
public float removeEnergy(float amount, boolean doRemove)
{ {
float amount = pack.getWatts();
List<ItemStack> inverse = ListUtil.inverse(structure.inventory); List<ItemStack> inverse = ListUtil.inverse(structure.inventory);
float removed = 0; float removed = 0;
for (ItemStack itemStack : inverse) for (ItemStack itemStack : inverse)
{ {
if (itemStack.getItem() instanceof IItemElectric) if (itemStack.getItem() instanceof IItemElectric)
@ -326,7 +321,7 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
} }
} }
return removed; return ElectricityPack.getFromWatts(removed, this.getVoltage());
} }
@Override @Override
@ -558,27 +553,21 @@ public class TileEntityBattery extends TileEntityUniversalElectrical implements
return false; return false;
} }
@Override
public float transfer(float transferEnergy, boolean doTransfer)
{
return addEnergy(transferEnergy, doTransfer);
}
@Override
public boolean canReceive(TileEntity transferTile)
{
return this.getMaxEnergyStored() - this.getEnergyStored() > 0;
}
@Override @Override
public float getRequest(ForgeDirection direction) public float getRequest(ForgeDirection direction)
{ {
return 0; return this.getMaxEnergyStored() - this.getEnergyStored();
} }
@Override @Override
public float getProvide(ForgeDirection direction) public float getProvide(ForgeDirection direction)
{ {
return 0; return this.getEnergyStored();
}
@Override
public EnumSet<ForgeDirection> getOutputDirections()
{
return EnumSet.allOf(ForgeDirection.class);
} }
} }

View file

@ -9,13 +9,13 @@ import universalelectricity.core.vector.Vector3;
* @author Calclavia * @author Calclavia
* *
*/ */
public class ThreadPathfinding extends Thread public class ThreadEMPathfinding extends Thread
{ {
private boolean isCompleted = false; private boolean isCompleted = false;
private PathfinderEMContractor pathfinder; private PathfinderEMContractor pathfinder;
private Vector3 start; private Vector3 start;
public ThreadPathfinding(PathfinderEMContractor pathfinder, Vector3 start) public ThreadEMPathfinding(PathfinderEMContractor pathfinder, Vector3 start)
{ {
this.pathfinder = pathfinder; this.pathfinder = pathfinder;
this.start = start; this.start = start;

View file

@ -53,7 +53,7 @@ public class TileEntityEMContractor extends TileEntityAdvanced implements IPacke
/** /**
* Pathfinding * Pathfinding
*/ */
private ThreadPathfinding thread; private ThreadEMPathfinding thread;
private PathfinderEMContractor pathfinder; private PathfinderEMContractor pathfinder;
private Set<EntityItem> pathfindingTrackers = new HashSet<EntityItem>(); private Set<EntityItem> pathfindingTrackers = new HashSet<EntityItem>();
private TileEntityEMContractor linked; private TileEntityEMContractor linked;
@ -141,25 +141,41 @@ public class TileEntityEMContractor extends TileEntityAdvanced implements IPacke
if (!this.suck) if (!this.suck)
{ {
if (this.linked != null && !this.linked.isInvalid()) if (this.linked != null && !this.linked.isInvalid())
{
if (this.ticks % (2 + this.worldObj.rand.nextInt(2)) == 0)
{ {
ResonantInduction.proxy.renderElectricShock(this.worldObj, new Vector3(this).translate(0.5), new Vector3(this).translate(new Vector3(this.getDirection())).translate(0.5), TileEntityTesla.dyeColors[dyeID]); ResonantInduction.proxy.renderElectricShock(this.worldObj, new Vector3(this).translate(0.5), new Vector3(this).translate(new Vector3(this.getDirection())).translate(0.5), TileEntityTesla.dyeColors[dyeID]);
}
if (this.pathfinder != null) if (this.pathfinder != null)
{ {
Vector3 lastTurn = null;
ForgeDirection lastDirection = null;
for (int i = 0; i < this.pathfinder.results.size(); i++) for (int i = 0; i < this.pathfinder.results.size(); i++)
{ {
Vector3 result = this.pathfinder.results.get(i).clone(); Vector3 result = this.pathfinder.results.get(i).clone();
if (TileEntityEMContractor.canBePath(this.worldObj, result)) if (TileEntityEMContractor.canBePath(this.worldObj, result))
{ {
if (i - 1 >= 0) if (i - 1 >= 0)
{ {
Vector3 prevResult = this.pathfinder.results.get(i - 1).clone(); Vector3 prevResult = this.pathfinder.results.get(i - 1).clone();
ResonantInduction.proxy.renderElectricShock(this.worldObj, prevResult.clone().translate(0.5), result.clone().translate(0.5), TileEntityTesla.dyeColors[dyeID]);
Vector3 difference = prevResult.clone().difference(result); Vector3 difference = prevResult.clone().difference(result);
final ForgeDirection direction = difference.toForgeDirection(); final ForgeDirection direction = difference.toForgeDirection();
if (this.ticks % (2 + this.worldObj.rand.nextInt(2)) == 0)
{
ResonantInduction.proxy.renderElectricShock(this.worldObj, prevResult.clone().translate(0.5), result.clone().translate(0.5), TileEntityTesla.dyeColors[dyeID]);
}
if (lastTurn == null || direction != lastDirection)
{
lastTurn = result;
lastDirection = direction;
}
AxisAlignedBB bounds = AxisAlignedBB.getAABBPool().getAABB(result.x, result.y, result.z, result.x + 1, result.y + 1, result.z + 1); AxisAlignedBB bounds = AxisAlignedBB.getAABBPool().getAABB(result.x, result.y, result.z, result.x + 1, result.y + 1, result.z + 1);
List<EntityItem> entities = this.worldObj.getEntitiesWithinAABB(EntityItem.class, bounds); List<EntityItem> entities = this.worldObj.getEntitiesWithinAABB(EntityItem.class, bounds);
@ -538,7 +554,7 @@ public class TileEntityEMContractor extends TileEntityAdvanced implements IPacke
{ {
if (TileEntityEMContractor.canBePath(this.worldObj, start) && TileEntityEMContractor.canBePath(this.worldObj, target)) if (TileEntityEMContractor.canBePath(this.worldObj, start) && TileEntityEMContractor.canBePath(this.worldObj, target))
{ {
this.thread = new ThreadPathfinding(new PathfinderEMContractor(this.worldObj, target), start); this.thread = new ThreadEMPathfinding(new PathfinderEMContractor(this.worldObj, target), start);
this.thread.start(); this.thread.start();
} }
} }

View file

@ -159,7 +159,7 @@ public class FXElectricBolt extends EntityFX
*/ */
for (int i = 1; i < splitAmount; i++) for (int i = 1; i < splitAmount; i++)
{ {
Vector3 newOffset = segment.difference.getPerpendicular().rotate(this.rand.nextFloat() * 360, segment.difference).scale((this.rand.nextFloat() - 0.5F) * offset); Vector3 newOffset = segment.difference.getPerpendicular().rotate(this.rand.nextFloat() * 360, segment.difference).clone().scale((this.rand.nextFloat() - 0.5F) * offset);
Vector3 basePoint = startPoint.clone().translate(subSegment.clone().scale(i)); Vector3 basePoint = startPoint.clone().translate(subSegment.clone().scale(i));
newPoints[i] = new BoltPoint(basePoint, newOffset); newPoints[i] = new BoltPoint(basePoint, newOffset);
@ -178,7 +178,7 @@ public class FXElectricBolt extends EntityFX
if ((i != 0) && (this.rand.nextFloat() < splitChance)) if ((i != 0) && (this.rand.nextFloat() < splitChance))
{ {
Vector3 splitrot = next.difference.xCrossProduct().rotate(this.rand.nextFloat() * 360, next.difference); Vector3 splitrot = next.difference.xCrossProduct().rotate(this.rand.nextFloat() * 360, next.difference);
Vector3 diff = next.difference.clone().rotate((this.rand.nextFloat() * 0.66F + 0.33F) * splitAngle, splitrot).scale(splitLength); Vector3 diff = next.difference.clone().rotate((this.rand.nextFloat() * 0.66F + 0.33F) * splitAngle, splitrot).clone().scale(splitLength);
this.maxSplitID += 1; this.maxSplitID += 1;
this.parentIDMap.put(this.maxSplitID, next.splitID); this.parentIDMap.put(this.maxSplitID, next.splitID);
BoltSegment split = new BoltSegment(newPoints[i], new BoltPoint(newPoints[(i + 1)].base, newPoints[(i + 1)].offset.clone().translate(diff)), segment.alpha / 2f, next.id, this.maxSplitID); BoltSegment split = new BoltSegment(newPoints[i], new BoltPoint(newPoints[(i + 1)].base, newPoints[(i + 1)].offset.clone().translate(diff)), segment.alpha / 2f, next.id, this.maxSplitID);
@ -303,10 +303,7 @@ public class FXElectricBolt extends EntityFX
if (segment != null && segment.id <= renderlength) if (segment != null && segment.id <= renderlength)
{ {
double renderWidth = this.boltWidth * ((new Vector3(player).distance(segment.start) / 5f + 1f) * (1 + segment.alpha) * 0.5f); double renderWidth = this.boltWidth * ((new Vector3(player).distance(segment.start) / 5f + 1f) * (1 + segment.alpha) * 0.5f);
renderWidth = Math.min(this.boltWidth, Math.max(renderWidth, 0));
if (segment.difference.getMagnitude() > 0 && segment.difference.getMagnitude() != Double.NaN && segment.difference.getMagnitude() != Double.POSITIVE_INFINITY && renderWidth > 0 && renderWidth != Double.NaN && renderWidth != Double.POSITIVE_INFINITY)
{
Vector3 diffPrev = playerVector.crossProduct(segment.prevDiff).scale(renderWidth / segment.sinPrev); Vector3 diffPrev = playerVector.crossProduct(segment.prevDiff).scale(renderWidth / segment.sinPrev);
Vector3 diffNext = playerVector.crossProduct(segment.nextDiff).scale(renderWidth / segment.sinNext); Vector3 diffNext = playerVector.crossProduct(segment.nextDiff).scale(renderWidth / segment.sinNext);
Vector3 startVec = segment.start; Vector3 startVec = segment.start;
@ -327,7 +324,6 @@ public class FXElectricBolt extends EntityFX
/** /**
* Render the bolts balls. * Render the bolts balls.
*/ */
if (segment.next == null) if (segment.next == null)
{ {
Vector3 roundEnd = segment.end.clone().translate(segment.difference.clone().normalize().scale(renderWidth)); Vector3 roundEnd = segment.end.clone().translate(segment.difference.clone().normalize().scale(renderWidth));
@ -353,7 +349,6 @@ public class FXElectricBolt extends EntityFX
} }
} }
} }
}
tessellator.draw(); tessellator.draw();
@ -425,7 +420,7 @@ public class FXElectricBolt extends EntityFX
Vector3 prevDiffNorm = this.prev.difference.clone().normalize(); Vector3 prevDiffNorm = this.prev.difference.clone().normalize();
Vector3 diffNorm = this.difference.clone().normalize(); Vector3 diffNorm = this.difference.clone().normalize();
this.prevDiff = diffNorm.clone().translate(prevDiffNorm).normalize(); this.prevDiff = diffNorm.clone().translate(prevDiffNorm).normalize();
this.sinPrev = Math.sin(diffNorm.anglePreNorm(prevDiffNorm.scale(-1)) / 2); this.sinPrev = Math.sin(diffNorm.anglePreNorm(prevDiffNorm.clone().scale(-1)) / 2);
} }
else else
{ {
@ -438,7 +433,7 @@ public class FXElectricBolt extends EntityFX
Vector3 nextDiffNorm = this.next.difference.clone().normalize(); Vector3 nextDiffNorm = this.next.difference.clone().normalize();
Vector3 diffNorm = this.difference.clone().normalize(); Vector3 diffNorm = this.difference.clone().normalize();
this.nextDiff = diffNorm.clone().translate(nextDiffNorm).normalize(); this.nextDiff = diffNorm.clone().translate(nextDiffNorm).normalize();
this.sinNext = Math.sin(diffNorm.anglePreNorm(nextDiffNorm.scale(-1)) / 2); this.sinNext = Math.sin(diffNorm.anglePreNorm(nextDiffNorm.clone().scale(-1)) / 2);
} }
else else
{ {

View file

@ -5,6 +5,7 @@ package resonantinduction.render;
import java.util.Random; import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
@ -87,8 +88,9 @@ public class RenderBattery extends TileEntitySpecialRenderer
for (int slot = 0; slot < 4; slot++) for (int slot = 0; slot < 4; slot++)
{ {
Vector3 sideVec = new Vector3(t).modifyPositionFromSide(correctSide(direction)); Vector3 sideVec = new Vector3(t).modifyPositionFromSide(correctSide(direction));
Block block = Block.blocksList[sideVec.getBlockID(t.worldObj)];
if (!t.worldObj.isAirBlock((int) sideVec.x, (int) sideVec.y, (int) sideVec.z)) if (block != null && block.isOpaqueCube())
{ {
continue; continue;
} }

View file

@ -84,7 +84,6 @@ public class TileEntityTesla extends TileEntityUniversalElectrical implements IT
super.updateEntity(); super.updateEntity();
boolean doPacketUpdate = this.getEnergyStored() > 0; boolean doPacketUpdate = this.getEnergyStored() > 0;
TileEntity tileEntity = this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord - 1, this.zCoord);
/** /**
* Only transfer if it is the bottom controlling Tesla tower. * Only transfer if it is the bottom controlling Tesla tower.
@ -121,7 +120,7 @@ public class TileEntityTesla extends TileEntityUniversalElectrical implements IT
/** /**
* Make sure Tesla is not part of this tower. * Make sure Tesla is not part of this tower.
*/ */
if (!this.connectedTeslas.contains(tesla) && tesla.canReceive(this) && tileEntity != tesla && !(tileEntity instanceof TileEntityBattery && ((TileEntityBattery) tileEntity).structure.locations.contains(new Vector3((TileEntity) tesla)))) if (!this.connectedTeslas.contains(tesla) && tesla.canReceive(this))
{ {
if (tesla instanceof TileEntityTesla) if (tesla instanceof TileEntityTesla)
{ {
@ -220,11 +219,13 @@ public class TileEntityTesla extends TileEntityUniversalElectrical implements IT
} }
/** /**
* Draws power from furnace below it. TODO: MAKE UNIVERSAL * Draws power from furnace below it.
* *
* @author Calclavia * @author Calclavia
*/ */
if (tileEntity instanceof TileEntityFurnace) TileEntity tileEntity = this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord - 1, this.zCoord);
if (tileEntity instanceof TileEntityFurnace && this.getRequest(ForgeDirection.DOWN) > 0)
{ {
TileEntityFurnace furnaceTile = (TileEntityFurnace) tileEntity; TileEntityFurnace furnaceTile = (TileEntityFurnace) tileEntity;
@ -272,10 +273,11 @@ public class TileEntityTesla extends TileEntityUniversalElectrical implements IT
BlockFurnace.updateFurnaceBlockState(furnaceTile.furnaceBurnTime > 0, furnaceTile.worldObj, furnaceTile.xCoord, furnaceTile.yCoord, furnaceTile.zCoord); BlockFurnace.updateFurnaceBlockState(furnaceTile.furnaceBurnTime > 0, furnaceTile.worldObj, furnaceTile.xCoord, furnaceTile.yCoord, furnaceTile.zCoord);
} }
} }
}
else if (tileEntity instanceof TileEntityBattery && this.canReceive) if (this.ticks % 20 == 0)
{ {
this.transfer(((TileEntityBattery) tileEntity).removeEnergy(TRANSFER_CAP, true), true); this.produce();
}
} }
if (!this.worldObj.isRemote && this.getEnergyStored() > 0 != doPacketUpdate) if (!this.worldObj.isRemote && this.getEnergyStored() > 0 != doPacketUpdate)
@ -561,15 +563,20 @@ public class TileEntityTesla extends TileEntityUniversalElectrical implements IT
@Override @Override
public float getRequest(ForgeDirection direction) public float getRequest(ForgeDirection direction)
{ {
return 0; return this.getMaxEnergyStored() - this.getEnergyStored();
} }
@Override @Override
public float getProvide(ForgeDirection direction) public float getProvide(ForgeDirection direction)
{
if (direction != ForgeDirection.UP && direction != ForgeDirection.DOWN)
{ {
return this.getEnergyStored(); return this.getEnergyStored();
} }
return 0;
}
@Override @Override
public float getMaxEnergyStored() public float getMaxEnergyStored()
{ {