Fixed #247 - Transformer not transferring energy

This commit is contained in:
Calclavia 2014-02-21 22:11:35 +08:00
parent 2ab0cf924d
commit cbaf9884e6
7 changed files with 76 additions and 51 deletions

View file

@ -22,6 +22,7 @@ public class MultipartElectrical implements IPartFactory
public MultipartElectrical()
{
MultiPartRegistry.registerParts(this, PART_TYPES);
MultipartGenerator.registerPassThroughInterface("universalelectricity.api.electricity.IVoltageOutput");
MultipartGenerator.registerTrait("universalelectricity.api.energy.IConductor", "resonantinduction.electrical.wire.trait.TraitConductor");
MultipartGenerator.registerTrait("cofh.api.energy.IEnergyHandler", "resonantinduction.electrical.wire.trait.TraitEnergyHandler");
MultipartGenerator.registerTrait("ic2.api.energy.tile.IEnergySink", "resonantinduction.electrical.wire.trait.TraitEnergySink");

View file

@ -8,6 +8,9 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.prefab.part.PartFace;
import resonantinduction.electrical.Electrical;
import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.UniversalClass;
import universalelectricity.api.UniversalElectricity;
import universalelectricity.api.electricity.IElectricalNetwork;
import universalelectricity.api.electricity.IVoltageInput;
import universalelectricity.api.electricity.IVoltageOutput;
@ -17,10 +20,7 @@ import universalelectricity.api.vector.VectorHelper;
import calclavia.lib.utility.WrenchUtility;
import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Vector3;
import codechicken.multipart.JNormalOcclusion;
import codechicken.multipart.TFacePart;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -30,11 +30,12 @@ import cpw.mods.fml.relauncher.SideOnly;
* @author Calclavia
*
*/
@UniversalClass
public class PartTransformer extends PartFace implements IVoltageOutput, IEnergyInterface
{
/** Step the voltage up */
private boolean stepUp;
private boolean stepUp = true;
/** Amount to mulitply the step by (up x2. down /2) */
public byte multiplier = 2;
@ -97,7 +98,7 @@ public class PartTransformer extends PartFace implements IVoltageOutput, IEnergy
public void save(NBTTagCompound nbt)
{
super.save(nbt);
nbt.setBoolean("stepUp", this.stepUp);
nbt.setBoolean("stepUp", stepUp);
nbt.setByte("multiplier", multiplier);
}
@ -116,22 +117,24 @@ public class PartTransformer extends PartFace implements IVoltageOutput, IEnergy
@Override
public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive)
{
if (from == this.getFacing().getOpposite())
if (from == getAbsoluteFacing())
{
TileEntity entity = VectorHelper.getTileEntityFromSide(this.world(), new universalelectricity.api.vector.Vector3(this.x(), this.y(), this.z()), this.getFacing());
if (entity instanceof IEnergyInterface)
TileEntity tile = VectorHelper.getTileEntityFromSide(this.world(), new universalelectricity.api.vector.Vector3(x(), y(), z()), from.getOpposite());
if (CompatibilityModule.isHandler(tile))
{
if (entity instanceof IVoltageInput)
if (tile instanceof IVoltageInput)
{
long voltage = this.getVoltageOutput(from.getOpposite());
if (voltage != ((IVoltageInput) entity).getVoltageInput(from))
if (voltage != ((IVoltageInput) tile).getVoltageInput(from))
{
((IVoltageInput) entity).onWrongVoltage(from, voltage);
((IVoltageInput) tile).onWrongVoltage(from, voltage);
}
}
return ((IEnergyInterface) entity).onReceiveEnergy(from, receive, doReceive);
}
return CompatibilityModule.receiveEnergy(tile, from, receive, doReceive);
}
}
return 0;
}
@ -143,28 +146,36 @@ public class PartTransformer extends PartFace implements IVoltageOutput, IEnergy
}
@Override
public long getVoltageOutput(ForgeDirection side)
public long getVoltageOutput(ForgeDirection from)
{
if (side == this.getFacing())
if (from == getAbsoluteFacing().getOpposite())
{
TileEntity entity = VectorHelper.getTileEntityFromSide(this.world(), new universalelectricity.api.vector.Vector3(this.x(), this.y(), this.z()), this.getFacing().getOpposite());
if (entity instanceof IConductor && ((IConductor) entity).getNetwork() instanceof IElectricalNetwork)
TileEntity inputTile = VectorHelper.getTileEntityFromSide(this.world(), new universalelectricity.api.vector.Vector3(x(), y(), z()), getAbsoluteFacing());
long inputVoltage = UniversalElectricity.DEFAULT_VOLTAGE;
if (inputTile instanceof IConductor)
{
long voltage = ((IElectricalNetwork) ((IConductor) entity).getNetwork()).getVoltage();
if (this.stepUp())
{
return voltage * this.multiplier;
}
else if (voltage > 0)
{
return voltage / this.multiplier;
}
IConductor conductor = (IConductor) ((IConductor) inputTile).getInstance(placementSide);
if (conductor != null)
if (conductor.getNetwork() instanceof IElectricalNetwork)
inputVoltage = ((IElectricalNetwork) conductor.getNetwork()).getVoltage();
}
else if (entity instanceof IVoltageOutput)
else if (inputTile instanceof IVoltageOutput)
{
return ((IVoltageOutput) entity).getVoltageOutput(side);
inputVoltage = ((IVoltageOutput) inputTile).getVoltageOutput(from);
}
if (inputVoltage <= 0)
inputVoltage = UniversalElectricity.DEFAULT_VOLTAGE;
if (this.stepUp())
return inputVoltage * (this.multiplier + 2);
else
return inputVoltage / (this.multiplier + 2);
}
return 0;
}
@ -185,16 +196,18 @@ public class PartTransformer extends PartFace implements IVoltageOutput, IEnergy
WrenchUtility.damageWrench(player, player.inventory.getCurrentItem(), x(), y(), z());
facing = (byte) ((facing + 1) % 4);
sendDescUpdate();
tile().notifyPartChange(this);
}
return true;
}
return false;
}
stepUp = !stepUp;
if (!world().isRemote)
player.addChatMessage("Transformer set to step " + (stepUp ? "up" : "down") + ".");
return true;
}
}

View file

@ -408,11 +408,11 @@ public class PartFlatWire extends PartAdvancedWire implements TFacePart, JNormal
BlockCoord pos = new BlockCoord(tile()).offset(absSide);
/** Look for an external wire connection. */
TileMultipart t = MultipartUtility.getMultipartTile(world(), pos);
TileMultipart tileMultiPart = MultipartUtility.getMultipartTile(world(), pos);
if (t != null && r != -1)
if (tileMultiPart != null && r != -1)
{
TMultiPart tp = t.partMap(this.side);
TMultiPart tp = tileMultiPart.partMap(this.side);
if (this.canConnectTo(tp, ForgeDirection.getOrientation(absSide)))
{
@ -422,8 +422,17 @@ public class PartFlatWire extends PartAdvancedWire implements TFacePart, JNormal
if (tp instanceof PartFlatWire && ((PartFlatWire) tp).canConnectTo(this, ForgeDirection.getOrientation(absSide).getOpposite()) && ((PartFlatWire) tp).maskOpen(otherR))
{
// We found a wire! Merge connection.
this.connections[absSide] = tp;
this.getNetwork().merge(((PartFlatWire) tp).getNetwork());
connections[absSide] = tp;
getNetwork().merge(((PartFlatWire) tp).getNetwork());
return true;
}
/**
* Check for a micro-energy block
*/
if (canConnectTo(tp))
{
connections[absSide] = tp;
return true;
}
}

View file

@ -170,27 +170,29 @@ public class TraitConductor extends TileMultipart implements IConductor
}
@Override
public IConnector<IEnergyNetwork> getInstance(ForgeDirection from)
public IConductor getInstance(ForgeDirection from)
{
/**
* Try out different sides to try to inject energy into.
*/
if (this.partMap(from.ordinal()) == null)
if (partMap(from.ordinal()) instanceof IConductor)
{
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TMultiPart part = this.partMap(dir.ordinal());
return (IConductor) partMap(from.ordinal());
}
if (this.ueInterfaces.contains(part))
{
return ((IConductor) part).getInstance(from);
}
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TMultiPart part = this.partMap(dir.ordinal());
if (this.ueInterfaces.contains(part))
{
return (IConductor) ((IConductor) part).getInstance(from);
}
}
if (partMap(PartMap.CENTER.ordinal()) instanceof IConductor)
{
return (IConnector<IEnergyNetwork>) partMap(PartMap.CENTER.ordinal());
return (IConductor) (IConnector<IEnergyNetwork>) partMap(PartMap.CENTER.ordinal());
}
return null;

View file

@ -11,9 +11,9 @@ import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.Settings;
import resonantinduction.core.TabRI;
import resonantinduction.core.prefab.fluid.ItemBlockFluidContainer;
import resonantinduction.mechanical.belt.BlockConveyorBelt;
import resonantinduction.mechanical.belt.TileConveyorBelt;
import resonantinduction.mechanical.fluid.pipe.ItemBlockFluidContainer;
import resonantinduction.mechanical.fluid.pipe.ItemPipe;
import resonantinduction.mechanical.fluid.tank.BlockTank;
import resonantinduction.mechanical.fluid.tank.TileTank;

View file

@ -1,4 +1,4 @@
package resonantinduction.core.prefab.fluid;
package resonantinduction.mechanical.fluid.pipe;
import java.util.List;
@ -14,8 +14,8 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import resonantinduction.core.prefab.fluid.TileFluidNetwork;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.fluid.pipe.EnumPipeMaterial;
import resonantinduction.mechanical.fluid.tank.TileTank;
import universalelectricity.api.energy.UnitDisplay;
import universalelectricity.api.energy.UnitDisplay.Unit;

View file

@ -11,8 +11,8 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import resonantinduction.core.prefab.fluid.BlockFluidNetwork;
import resonantinduction.core.prefab.fluid.ItemBlockFluidContainer;
import resonantinduction.core.render.RIBlockRenderingHandler;
import resonantinduction.mechanical.fluid.pipe.ItemBlockFluidContainer;
import universalelectricity.api.UniversalElectricity;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.FluidUtility;