aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java')
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
new file mode 100644
index 0000000000..41b6a74aef
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -0,0 +1,283 @@
+package gregtech.api.multitileentity.machine;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.base.BaseTickableMultiTileEntity;
+import gregtech.api.util.GT_Utility;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidTank;
+
+import static com.google.common.primitives.Ints.saturatedCast;
+
+public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
+ protected int mParallel = 1;
+ protected long mStoredEnergy = 0;
+ protected FluidTankGT[] mTanksInput = GT_Values.emptyFluidTankGT, mTanksOutput = GT_Values.emptyFluidTankGT;
+ protected ItemStack[] mOutputItems = GT_Values.emptyItemStackArray;
+ protected FluidStack[] mOutputFluids = GT_Values.emptyFluidStack;
+
+ protected ItemStack[] mInventory = GT_Values.emptyItemStackArray;
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.machine.basic";
+ }
+
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound aNBT) {
+ super.writeMultiTileNBT(aNBT);
+
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ if (aNBT.hasKey(NBT.PARALLEL)) mParallel = Math.max(1, aNBT.getInteger(NBT.PARALLEL));
+
+ mInventory = getDefaultInventory(aNBT);
+ if(mInventory != null) {
+ final NBTTagList tList = aNBT.getTagList(NBT.INV_LIST, 10);
+ for (int i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final int tSlot = tNBT.getShort("s");
+ if (tSlot >= 0 && tSlot < mInventory.length) mInventory[tSlot] = GT_Utility.loadItem(tNBT);
+ }
+ }
+ /* Tanks */
+ long tCapacity = 1000;
+ if (aNBT.hasKey(NBT.TANK_CAPACITY)) tCapacity = saturatedCast(aNBT.getLong(NBT.TANK_CAPACITY));
+
+ mTanksInput = new FluidTankGT[getFluidInputCount()];
+ mTanksOutput = new FluidTankGT[getFluidOutputCount()];
+ mOutputFluids = new FluidStack[getFluidOutputCount()];
+ mOutputItems = new ItemStack[getItemOutputCount()];
+
+ // TODO: See if we need the adjustable map here `.setCapacity(mRecipes, mParallel * 2L)` in place of the `setCapacityMultiplier`
+ for (int i = 0; i < mTanksInput.length; i++) mTanksInput[i] = new FluidTankGT(tCapacity).setCapacityMultiplier(mParallel * 2L).readFromNBT(aNBT, NBT.TANK_IN + i);
+ for (int i = 0; i < mTanksOutput.length; i++) mTanksOutput[i] = new FluidTankGT().readFromNBT(aNBT, NBT.TANK_OUT + i);
+ for (int i = 0; i < mOutputFluids.length; i++) mOutputFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(NBT.FLUID_OUT + "." + i));
+ for (int i = 0; i < mOutputItems.length; i++) mOutputItems[i] = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(NBT.INV_OUT + "." + i));
+
+ }
+
+ /*
+ * Fluids
+ */
+
+
+ /**
+ * The number of fluid (input) slots available for this machine
+ */
+ public int getFluidInputCount() {
+ return 2;
+ }
+
+ /**
+ * The number of fluid (output) slots available for this machine
+ */
+ public int getFluidOutputCount() {
+ return 2;
+ }
+
+ public ItemStack[] getDefaultInventory(NBTTagCompound aNBT) {
+ final int tSize = Math.max(0, aNBT.getShort(NBT.INV_SIZE));
+ return tSize > 0 ? new ItemStack[tSize] : GT_Values.emptyItemStackArray;
+ }
+
+ @Override
+ public ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass) {
+ return new ITexture[0];
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {
+
+ }
+
+ @Override
+ public String getInventoryName() {
+ final String name = getCustomName();
+ if(name != null) return name;
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID());
+ return tRegistry == null ? getClass().getName() : tRegistry.getLocal(getMultiTileEntityID());
+ }
+
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer aPlayer) {
+ return playerOwnsThis(aPlayer, false) && mTickTimer > 40 &&
+ getTileEntityOffset(0, 0, 0) == this &&
+ aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64 && allowInteraction(aPlayer);
+ }
+
+
+ @Override
+ public boolean isLiquidInput(byte aSide) {
+ return aSide != mFacing;
+ }
+
+ @Override
+ public boolean isLiquidOutput(byte aSide) {
+ return aSide != mFacing;
+ }
+
+
+ @Override
+ protected IFluidTank[] getFluidTanks(byte aSide) {
+ final boolean fluidInput = isLiquidInput(aSide);
+ final boolean fluidOutput = isLiquidOutput(aSide);
+
+ if(fluidInput && fluidOutput) {
+ final IFluidTank[] rTanks = new IFluidTank[ mTanksInput.length + mTanksOutput.length];
+ System.arraycopy(mTanksInput, 0, rTanks, 0, mTanksInput.length);
+ System.arraycopy(mTanksOutput, 0, rTanks, mTanksInput.length, mTanksOutput.length);
+ return rTanks;
+ } else if(fluidInput) {
+ return mTanksInput;
+ } else if(fluidOutput) {
+ return mTanksOutput;
+ }
+ return GT_Values.emptyFluidTank;
+ }
+
+ @Override
+ public IFluidTank getFluidTankFillable(byte aSide, FluidStack aFluidToFill) {
+ if(!isLiquidInput(aSide)) return null;
+ for (FluidTankGT tankGT : mTanksInput) if (tankGT.contains(aFluidToFill)) return tankGT;
+// if (!mRecipes.containsInput(aFluidToFill, this, slot(mRecipes.mInputItemsCount + mRecipes.mOutputItemsCount))) return null;
+ for (FluidTankGT fluidTankGT : mTanksInput) if (fluidTankGT.isEmpty()) return fluidTankGT;
+ return null;
+ }
+
+ @Override
+ protected IFluidTank getFluidTankDrainable(byte aSide, FluidStack aFluidToDrain) {
+ if(!isLiquidOutput(aSide)) return null;
+ for (FluidTankGT fluidTankGT : mTanksOutput)
+ if (aFluidToDrain == null ? fluidTankGT.has() : fluidTankGT.contains(aFluidToDrain))
+ return fluidTankGT;
+
+ return null;
+ }
+
+ /*
+ * Energy
+ */
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isUniversalEnergyStored(long aEnergyAmount) {
+ return getUniversalEnergyStored() >= aEnergyAmount;
+ }
+
+ @Override
+ public long getUniversalEnergyStored() {
+ return mStoredEnergy;
+ }
+
+ @Override
+ public long getUniversalEnergyCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ return 1;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ return 1;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ return 1;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ return 1;
+ }
+
+
+ public boolean isEnergyInputSide(byte aSide) {
+ return true;
+ }
+
+ public boolean isEnergyOutputSide(byte aSide) {
+ return true;
+ }
+
+ @Override
+ public boolean inputEnergyFrom(byte aSide) {
+ if (aSide == GT_Values.SIDE_UNKNOWN) return true;
+ if (aSide >= 0 && aSide < 6) {
+ if(isInvalid()) return false;
+ if (!getCoverBehaviorAtSideNew(aSide).letsEnergyIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false;
+ if (isEnetInput()) return isEnergyInputSide(aSide);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean outputsEnergyTo(byte aSide) {
+ if (aSide == GT_Values.SIDE_UNKNOWN) return true;
+ if (aSide >= 0 && aSide < 6) {
+ if (isInvalid()) return false;
+ if (!getCoverBehaviorAtSideNew(aSide).letsEnergyOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false;
+ if (isEnetOutput()) return isEnergyOutputSide(aSide);
+ }
+ return false;
+ }
+
+ /*
+ * Inventory
+ */
+
+ @Override public boolean hasInventoryBeenModified() {
+ return mInventoryChanged;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * The number of item (input) slots available for this machine
+ */
+ public int getItemInputCount() {
+ return 2;
+ }
+
+ /**
+ * The number of item (output) slots available for this machine
+ */
+ public int getItemOutputCount() {
+ return 2;
+ }
+
+}