/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.statements; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyConnection; import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyProvider; import cofh.api.energy.IEnergyReceiver; import buildcraft.api.statements.IStatementContainer; import buildcraft.api.statements.IStatementParameter; import buildcraft.api.statements.ITriggerInternal; import buildcraft.api.transport.IPipeTile; import buildcraft.core.lib.utils.StringUtils; public class TriggerEnergy extends BCStatement implements ITriggerInternal { public static class Neighbor { public TileEntity tile; public ForgeDirection side; public Neighbor(TileEntity tile, ForgeDirection side) { this.tile = tile; this.side = side; } } private final boolean high; public TriggerEnergy(boolean high) { super("buildcraft:energyStored" + (high ? "high" : "low")); this.high = high; } @Override public String getDescription() { return StringUtils.localize("gate.trigger.machine.energyStored." + (high ? "high" : "low")); } private boolean isTriggeredEnergyHandler(IEnergyConnection connection, ForgeDirection side) { int energyStored, energyMaxStored; if (connection instanceof IEnergyHandler) { energyStored = ((IEnergyHandler) connection).getEnergyStored(side); energyMaxStored = ((IEnergyHandler) connection).getMaxEnergyStored(side); } else if (connection instanceof IEnergyProvider) { energyStored = ((IEnergyProvider) connection).getEnergyStored(side); energyMaxStored = ((IEnergyProvider) connection).getMaxEnergyStored(side); } else if (connection instanceof IEnergyReceiver) { energyStored = ((IEnergyReceiver) connection).getEnergyStored(side); energyMaxStored = ((IEnergyReceiver) connection).getMaxEnergyStored(side); } else { return false; } if (energyMaxStored > 0) { float level = (float) energyStored / (float) energyMaxStored; if (high) { return level > 0.95F; } else { return level < 0.05F; } } return false; } protected static boolean isTriggered(Object tile, ForgeDirection side) { return (tile instanceof IEnergyHandler || tile instanceof IEnergyProvider || tile instanceof IEnergyReceiver) && (((IEnergyConnection) tile).canConnectEnergy(side.getOpposite())); } protected boolean isActive(Object tile, ForgeDirection side) { if (isTriggered(tile, side)) { return isTriggeredEnergyHandler((IEnergyConnection) tile, side.getOpposite()); } return false; } public static boolean isTriggeringPipe(TileEntity tile) { if (tile instanceof IPipeTile) { IPipeTile pipeTile = (IPipeTile) tile; if (pipeTile.getPipeType() == IPipeTile.PipeType.POWER && pipeTile.getPipe() instanceof IEnergyHandler) { return true; } } return false; } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister iconRegister) { icon = iconRegister.registerIcon("buildcraftcore:triggers/trigger_energy_storage_" + (high ? "high" : "low")); } @Override public boolean isTriggerActive(IStatementContainer source, IStatementParameter[] parameters) { // Internal check if (isTriggeringPipe(source.getTile())) { return isActive(((IPipeTile) source.getTile()).getPipe(), ForgeDirection.UNKNOWN); } Neighbor triggeringNeighbor = getTriggeringNeighbor(source.getTile()); if (triggeringNeighbor != null) { return isActive(triggeringNeighbor.tile, triggeringNeighbor.side); } return false; } public static Neighbor getTriggeringNeighbor(TileEntity parent) { if (parent instanceof IPipeTile) { for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { TileEntity tile = ((IPipeTile) parent).getNeighborTile(side); if (tile != null && isTriggered(tile, side)) { return new Neighbor(tile, side); } } } else { for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { TileEntity tile = parent.getWorldObj().getTileEntity( parent.xCoord + side.offsetX, parent.yCoord + side.offsetY, parent.zCoord + side.offsetZ ); if (tile != null && isTriggered(tile, side)) { return new Neighbor(tile, side); } } } return null; } }