package com.amadornes.framez.compat.ae2;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.api.config.AccessRestriction;
import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.networking.GridFlags;
import appeng.api.networking.GridNotification;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridBlock;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.energy.IAEPowerStorage;
import appeng.api.util.AECableType;
import appeng.api.util.AEColor;
import appeng.api.util.DimensionalCoord;
import com.amadornes.framez.api.modifier.IMotorModifier;
import com.amadornes.framez.api.modifier.IMotorModifierPower;
import com.amadornes.framez.api.movement.IMotor;
import com.amadornes.jtraits.ITrait;
import com.amadornes.jtraits.JTrait;
public class MotorModifierAE2 implements IMotorModifierPower {
@Override
public String getType() {
return "ae2";
}
@Override
public boolean isCompatibleWith(IMotorModifier mod) {
return true;
}
@Override
public boolean isValidCombination(Collection<IMotorModifier> combination) {
return true;
}
@Override
public Class<? extends ITrait> getTraitClass() {
return TMotorAE2.class;
}
public static abstract class TMotorAE2 extends JTrait<IMotor> implements IMotor, IAEPowerStorage, IGridHost, IGridBlock {
private IGridNode node = null;
@Override
public EnumSet<GridFlags> getFlags() {
return EnumSet.copyOf(Arrays.asList(GridFlags.CANNOT_CARRY));
}
@Override
public boolean isWorldAccessible() {
return true;
}
@Override
public DimensionalCoord getLocation() {
return new DimensionalCoord(getWorld(), getX(), getY(), getZ());
}
@Override
public AEColor getGridColor() {
return AEColor.Transparent;
}
@Override
public void onGridNotification(GridNotification notification) {
}
@Override
public void setNetworkStatus(IGrid grid, int channelsInUse) {
}
@Override
public EnumSet<ForgeDirection> getConnectableSides() {
return EnumSet.copyOf(Arrays.asList(ForgeDirection.VALID_DIRECTIONS));
}
@Override
public IGridHost getMachine() {
return this;
}
@Override
public void gridChanged() {
}
@Override
public ItemStack getMachineRepresentation() {
return new ItemStack(Blocks.stone);
}
@Override
public IGridNode getGridNode(ForgeDirection dir) {
// if (getWorld() != null && !getWorld().isRemote) {
// if (node == null)
// node = AEApi.instance().createGridNode(this);
// node.updateState();
// }
return node;
}
@Override
public AECableType getCableConnectionType(ForgeDirection dir) {
// if (node != null)
// for (IGridNode n : node.getGrid().getNodes())
// if (n.getMachine() instanceof IPartCable && getLocation().copy().add(dir, 1).equals(n.getGridBlock().getLocation()))
// return n.getMachine().getCableConnectionType(dir.getOpposite());
return AECableType.SMART;
}
@Override
public void securityBreak() {
}
@Override
public double injectAEPower(double amt, Actionable mode) {
return amt - injectPower(amt, mode == Actionable.MODULATE);
}
@Override
public double extractAEPower(double amt, Actionable mode, PowerMultiplier usePowerMultiplier) {
return 0;
}
@Override
public double getIdlePowerUsage() {
return 0;
}
@Override
public double getAEMaxPower() {
return getEnergyBufferSize(); // FIXME
}
@Override
public double getAECurrentPower() {
return getEnergyBuffer(); // FIXME
}
@Override
public boolean isAEPublicPowerStorage() {
return false;
}
@Override
public AccessRestriction getPowerFlow() {
return AccessRestriction.WRITE;
}
@Override
public void onFirstTick() {
// FIXME _super.onFirstTick();
if (getWorld() != null && !getWorld().isRemote) {
if (node == null)
node = AEApi.instance().createGridNode(this);
node.updateState();
}
}
@Override
public void onUnload() {
// FIXME _super.onUnload();
if (node != null)
node.destroy();
}
public double getTotalStored() {
double nodePower = 0;
if (node != null) {
for (IGridNode n : node.getGrid().getNodes()) {
if (n != node) {
IGridHost host = n.getGridBlock().getMachine();
if (host instanceof IAEPowerStorage) {
IAEPowerStorage storage = (IAEPowerStorage) host;
if (storage.isAEPublicPowerStorage()
&& (storage.getPowerFlow() == AccessRestriction.READ || storage.getPowerFlow() == AccessRestriction.READ_WRITE))
nodePower += storage.getAECurrentPower();
}
}
}
}
return Math.min(getEnergyBuffer() + nodePower, getEnergyBufferSize());// FIXME
}
}
}