178 lines
7 KiB
Java
178 lines
7 KiB
Java
|
package gregtech.api.util;
|
||
|
|
||
|
import gregtech.api.GregTech_API;
|
||
|
import gregtech.api.interfaces.IRedstoneCircuitBlock;
|
||
|
import cpw.mods.fml.relauncher.Side;
|
||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||
|
|
||
|
/**
|
||
|
* Redstone Circuit Control Code
|
||
|
*
|
||
|
* This should make everything possible what a Redstone Computer or BuildCraft Gate could do.
|
||
|
* It is intended to use this similar to BC-Gates (for acquiring Data) and RP Logic Gates.
|
||
|
* You could write an extremely specified and complex Logic Gate, which works only for you Setup, like
|
||
|
* with ComputerCraft, but you would have to write an extra Mod to add that, as it doesn't work Ingame.
|
||
|
*
|
||
|
* One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan
|
||
|
* Inventories for specific Items using that. Luckily the Buttons in the GUI enable Copy/Paste of
|
||
|
* ItemID+MetaData to Integer, including the WildCard Damage Value when you use rightclick to place it.
|
||
|
* You just need to use @GT_Utility.stackToInt(ItemStack aStack) to get it.
|
||
|
*
|
||
|
* All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity.
|
||
|
*/
|
||
|
public abstract class GT_CircuitryBehavior {
|
||
|
/**
|
||
|
* @param aIndex 0 - 1023 are my own Indices, so use other Numbers!
|
||
|
*/
|
||
|
public GT_CircuitryBehavior(int aIndex) {
|
||
|
GregTech_API.sCircuitryBehaviors.put(aIndex, this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initializes the Parameters of this Circuit, all Parameters have been set to 0 right before calling this
|
||
|
* @param aCircuitData, The Data Storage you can use (8 Slots)
|
||
|
* @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
|
||
|
*/
|
||
|
public abstract void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
|
||
|
|
||
|
/**
|
||
|
* Validates the Parameters of this Circuit when a value has been changed by the GUI
|
||
|
* Also called right after @initParameters and when the Chunk reloads
|
||
|
* @param aCircuitData, The Data Storage you can use (8 Slots and only the first 4 are User definable)
|
||
|
* @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
|
||
|
*/
|
||
|
public abstract void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
|
||
|
|
||
|
/**
|
||
|
* Called every tick if the Block has enough Energy and if the Block is Active
|
||
|
* @param aCircuitData, The Data Storage you can use (8 Slots)
|
||
|
* @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
|
||
|
*/
|
||
|
public abstract void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
|
||
|
|
||
|
/**
|
||
|
* If the ItemStack should be displayed. Parameters are between 0 and 3.
|
||
|
*/
|
||
|
public abstract boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex);
|
||
|
|
||
|
/*****************
|
||
|
* GUI Functions *
|
||
|
*****************/
|
||
|
|
||
|
/**
|
||
|
* The Name of the Gate for the GUI
|
||
|
*/
|
||
|
@SideOnly(Side.CLIENT)
|
||
|
public abstract String getName();
|
||
|
|
||
|
/**
|
||
|
* The Description of the Gate for the GUI
|
||
|
*/
|
||
|
@SideOnly(Side.CLIENT)
|
||
|
public abstract String getDescription();
|
||
|
|
||
|
/**
|
||
|
* The Description of the Data Field for the GUI
|
||
|
*/
|
||
|
@SideOnly(Side.CLIENT)
|
||
|
public abstract String getDataDescription(int[] aCircuitData, int aCircuitDataIndex);
|
||
|
|
||
|
/**
|
||
|
* How the Integer should be displayed in the GUI.
|
||
|
* null means, that it just displays as regular Number.
|
||
|
*/
|
||
|
@SideOnly(Side.CLIENT)
|
||
|
public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************
|
||
|
* Useful Utility Functions *
|
||
|
****************************/
|
||
|
|
||
|
/**
|
||
|
* returns if there is Redstone applied to any of the valid Inputs (OR)
|
||
|
*/
|
||
|
public static final boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns if there is Redstone applied to all the valid Inputs (AND)
|
||
|
*/
|
||
|
public static final boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
if (aRedstoneCircuitBlock.getInputRedstone(i) == 0) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns if there is Redstone applied to exactly one of the valid Inputs (XOR)
|
||
|
*/
|
||
|
public static final boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
int tRedstoneAmount = 0;
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) {
|
||
|
tRedstoneAmount++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return tRedstoneAmount == 1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns the strongest incoming RS-Power
|
||
|
*/
|
||
|
public static final byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
byte tRedstoneAmount = 0;
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
tRedstoneAmount = (byte)Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
|
||
|
}
|
||
|
}
|
||
|
return tRedstoneAmount;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns the weakest incoming non-zero RS-Power
|
||
|
*/
|
||
|
public static final byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
|
||
|
byte tRedstoneAmount = 15;
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
if (aRedstoneCircuitBlock.getInputRedstone(i) > 0)
|
||
|
tRedstoneAmount = (byte)Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
|
||
|
}
|
||
|
}
|
||
|
return tRedstoneAmount;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns the weakest incoming RS-Power
|
||
|
*/
|
||
|
public static final byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
|
||
|
if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
|
||
|
byte tRedstoneAmount = 15;
|
||
|
for (byte i = 0; i < 6; i++) {
|
||
|
if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
|
||
|
tRedstoneAmount = (byte)Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
|
||
|
}
|
||
|
}
|
||
|
return tRedstoneAmount;
|
||
|
}
|
||
|
}
|