aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api
diff options
context:
space:
mode:
authorBlueWeabo <ilia.iliev2005@gmail.com>2023-04-01 17:06:06 +0300
committerGitHub <noreply@github.com>2023-04-01 16:06:06 +0200
commit655cc902d3df19a1ac2bfaa38cc928ed629d0171 (patch)
tree25e34b45705b8473e20af3f9b92af25cc87a1e0d /src/main/java/gregtech/api
parenta01d019ed97101936210f16c7a362d852f081f09 (diff)
downloadGT5-Unofficial-655cc902d3df19a1ac2bfaa38cc928ed629d0171.tar.gz
GT5-Unofficial-655cc902d3df19a1ac2bfaa38cc928ed629d0171.tar.bz2
GT5-Unofficial-655cc902d3df19a1ac2bfaa38cc928ed629d0171.zip
Implement Power Logic, Pollution Logic and Processing Logic for MuTEs and many other things (#1823)
* update bs 2 * fuel consumption and energy implementation. clean up * don't register XD * some clean up * coke oven work * semi-working coke oven somehow i broke the activating of the multiblock * power logic * PowerLogic * clean up, saving loading nbt * small cleanup and pollution * pollution working :P * Energy mostly working, wallsharing * processing logic * fix npe and deregister * review requests * missed one * remove extra 0
Diffstat (limited to 'src/main/java/gregtech/api')
-rw-r--r--src/main/java/gregtech/api/enums/GT_Values.java19
-rw-r--r--src/main/java/gregtech/api/enums/TickTime.java10
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java74
-rw-r--r--src/main/java/gregtech/api/logic/PollutionLogic.java17
-rw-r--r--src/main/java/gregtech/api/logic/PowerLogic.java130
-rw-r--r--src/main/java/gregtech/api/logic/ProcessingLogic.java97
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java8
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java16
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java8
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java38
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java5
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java (renamed from src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java)232
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java (renamed from src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java)4
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java (renamed from src/main/java/gregtech/api/multitileentity/base/BaseTickableMultiTileEntity.java)68
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java7
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java751
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java1008
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java202
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPowerController.java44
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlock_Stackable.java7
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java107
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java27
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java94
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java (renamed from src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java)15
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java54
28 files changed, 2078 insertions, 1012 deletions
diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java
index 14cca69f05..d06e70b0b5 100644
--- a/src/main/java/gregtech/api/enums/GT_Values.java
+++ b/src/main/java/gregtech/api/enums/GT_Values.java
@@ -232,7 +232,7 @@ public class GT_Values {
// Machines
ACTIVE = "gt.active", // Boolean
FLUID_OUT = "gt.fluidout", // Output Fluid
- ITEM_OUT = "gt,itemout", // Output Item
+ ITEM_OUT = "gt.itemout", // Output Item
PARALLEL = "gt.parallel", // Number
TANK_CAPACITY = "gt.tankcap", // Number
TANK_IN = "gt.tank.in.", // FluidStack
@@ -242,6 +242,14 @@ public class GT_Values {
INV_OUTPUT_SIZE = "gt.invsize.out", // Number
INV_INPUT_LIST = "gt.invlist.in", // NBT List
INV_OUTPUT_LIST = "gt.invlist.out", // NBT List
+ VOLTAGE = "gt.voltage", // Number
+ AMPERAGE = "gt.amperage", // Number
+ STORED_ENERGY = "gt.stored.energy", // Number
+ MAXIMUM_ENERGY = "gt.maximum.energy", // Number
+ EUT_CONSUMPTION = "gt.eut.consumption", // Number
+ BURN_TIME_LEFT = "gt.burn.time.left", // Number
+ TOTAL_BURN_TIME = "gt.total.burn.time", // Number
+ ALLOWED_WORK = "gt.allowed.work", // Boolean
// MultiBlock
STRUCTURE_OK = "gt.structure.ok", ROTATION = "gt.eRotation", FLIP = "gt.eFlip", TARGET = "gt.target", // Boolean
@@ -255,6 +263,15 @@ public class GT_Values {
UPGRADE_INVENTORY_NAME = "gt.invname.upg", // String
UPGRADE_INVENTORIES_INPUT = "gt.invlist.upg.in", // NBT List
UPGRADE_INVENTORIES_OUTPUT = "gt.invlist.upg.out", // NBT List
+ SEPARATE_INPUTS = "gt.separate.inputs", // Boolean
+
+ // Logic
+ POWER_LOGIC = "gt.power.logic", // NBT Tag
+ POWER_LOGIC_STORED_ENERGY = "gt.power.logic.stored.energy", // Number
+ POWER_LOGIC_ENERGY_CAPACITY = "gt.power.logic.energy.capacity", // Number
+ POWER_LOGIC_VOLTAGE = "gt.power.logic.voltage", // Number
+ POWER_LOGIC_AMPERAGE = "gt.power.logic.voltage", // Number
+ POWER_LOGIC_TYPE = "gt.power.logic.type", // Number
empty_ = "";
}
diff --git a/src/main/java/gregtech/api/enums/TickTime.java b/src/main/java/gregtech/api/enums/TickTime.java
new file mode 100644
index 0000000000..28c68e172f
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TickTime.java
@@ -0,0 +1,10 @@
+package gregtech.api.enums;
+
+public class TickTime {
+
+ public static final int TICK = 1;
+ public static final int SECOND = TICK * 20;
+ public static final int MINUTE = SECOND * 60;
+ public static final int HOUR = MINUTE * 60;
+ public static final int DAY = HOUR * 24;
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java
index 4fcfc861bb..92d2482014 100644
--- a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java
@@ -5,6 +5,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyReceiver;
import gregtech.api.GregTech_API;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
import gregtech.api.util.GT_Utility;
import ic2.api.energy.tile.IEnergySink;
@@ -58,37 +60,49 @@ public interface IEnergyConnected extends IColoredTileEntity {
*/
public static long emitEnergyToNetwork(long aVoltage, long aAmperage, IEnergyConnected aEmitter) {
long rUsedAmperes = 0;
- if (aEmitter instanceof IHasWorldObjectAndCoords) {
- IHasWorldObjectAndCoords emitterTile = (IHasWorldObjectAndCoords) aEmitter;
- for (byte i = 0, j = 0; i < 6 && aAmperage > rUsedAmperes; i++) {
- if (aEmitter.outputsEnergyTo(i)) {
- j = GT_Utility.getOppositeSide(i);
- final TileEntity tTileEntity = emitterTile.getTileEntityAtSide(i);
- if (tTileEntity instanceof IEnergyConnected) {
- if (aEmitter.getColorization() >= 0) {
- final byte tColor = ((IEnergyConnected) tTileEntity).getColorization();
- if (tColor >= 0 && tColor != aEmitter.getColorization()) continue;
- }
- rUsedAmperes += ((IEnergyConnected) tTileEntity)
- .injectEnergyUnits(j, aVoltage, aAmperage - rUsedAmperes);
+ if (!(aEmitter instanceof IHasWorldObjectAndCoords)) {
+ return 0;
+ }
+
+ IHasWorldObjectAndCoords emitterTile = (IHasWorldObjectAndCoords) aEmitter;
+ for (byte i = 0, j = 0; i < 6 && aAmperage > rUsedAmperes; i++) {
+ if (!aEmitter.outputsEnergyTo(i)) {
+ continue;
+ }
- } else if (tTileEntity instanceof IEnergySink) {
- if (((IEnergySink) tTileEntity)
- .acceptsEnergyFrom((TileEntity) aEmitter, ForgeDirection.getOrientation(j))) {
- while (aAmperage > rUsedAmperes && ((IEnergySink) tTileEntity).getDemandedEnergy() > 0
- && ((IEnergySink) tTileEntity)
- .injectEnergy(ForgeDirection.getOrientation(j), aVoltage, aVoltage)
- < aVoltage)
- rUsedAmperes++;
- }
- } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver) {
- final ForgeDirection tDirection = ForgeDirection.getOrientation(i).getOpposite();
- final int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100);
- if (((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, true) == rfOut) {
- ((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, false);
- rUsedAmperes++;
- }
- }
+ j = GT_Utility.getOppositeSide(i);
+ final TileEntity tTileEntity = emitterTile.getTileEntityAtSide(i);
+ if (tTileEntity instanceof PowerLogicHost) {
+ PowerLogicHost host = (PowerLogicHost) tTileEntity;
+
+ PowerLogic logic = host.getPowerLogic(j);
+ if (logic == null || logic.isEnergyReceiver()) {
+ continue;
+ }
+
+ rUsedAmperes += logic.injectEnergy(aVoltage, aAmperage - rUsedAmperes);
+ } else if (tTileEntity instanceof IEnergyConnected) {
+ if (aEmitter.getColorization() >= 0) {
+ final byte tColor = ((IEnergyConnected) tTileEntity).getColorization();
+ if (tColor >= 0 && tColor != aEmitter.getColorization()) continue;
+ }
+ rUsedAmperes += ((IEnergyConnected) tTileEntity)
+ .injectEnergyUnits(j, aVoltage, aAmperage - rUsedAmperes);
+
+ } else if (tTileEntity instanceof IEnergySink) {
+ if (((IEnergySink) tTileEntity)
+ .acceptsEnergyFrom((TileEntity) aEmitter, ForgeDirection.getOrientation(j))) {
+ while (aAmperage > rUsedAmperes && ((IEnergySink) tTileEntity).getDemandedEnergy() > 0
+ && ((IEnergySink) tTileEntity)
+ .injectEnergy(ForgeDirection.getOrientation(j), aVoltage, aVoltage) < aVoltage)
+ rUsedAmperes++;
+ }
+ } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver) {
+ final ForgeDirection tDirection = ForgeDirection.getOrientation(i).getOpposite();
+ final int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100);
+ if (((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, true) == rfOut) {
+ ((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, false);
+ rUsedAmperes++;
}
}
}
diff --git a/src/main/java/gregtech/api/logic/PollutionLogic.java b/src/main/java/gregtech/api/logic/PollutionLogic.java
new file mode 100644
index 0000000000..8e1172e105
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/PollutionLogic.java
@@ -0,0 +1,17 @@
+package gregtech.api.logic;
+
+public class PollutionLogic {
+
+ private int pollutionAmount;
+
+ public PollutionLogic() {}
+
+ public PollutionLogic setPollutionAmount(int pollutionAmount) {
+ this.pollutionAmount = pollutionAmount;
+ return this;
+ }
+
+ public int getPollutionAmount() {
+ return pollutionAmount;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/PowerLogic.java b/src/main/java/gregtech/api/logic/PowerLogic.java
new file mode 100644
index 0000000000..8044a2f979
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/PowerLogic.java
@@ -0,0 +1,130 @@
+package gregtech.api.logic;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values.NBT;
+
+public class PowerLogic {
+
+ public static int NONE = 0;
+ public static int RECEIVER = 1;
+ public static int EMITTER = 2;
+ public static int BOTH = RECEIVER | EMITTER;
+ private long storedEnergy = 0;
+ private long energyCapacity = 0;
+ private long voltage = 0;
+ private long amperage = 0;
+ private int type = 0;
+
+ public PowerLogic() {}
+
+ public PowerLogic setMaxVoltage(long voltage) {
+ this.voltage = voltage;
+ return this;
+ }
+
+ public PowerLogic setEnergyCapacity(long energyCapacity) {
+ this.energyCapacity = energyCapacity;
+ return this;
+ }
+
+ public PowerLogic setAmperage(long amperage) {
+ this.amperage = amperage;
+ return this;
+ }
+
+ public PowerLogic setType(int type) {
+ this.type = type;
+ return this;
+ }
+
+ public boolean addEnergyUnsafe(long totalEUAdded) {
+ if (storedEnergy + totalEUAdded >= energyCapacity) {
+ return false;
+ }
+
+ storedEnergy += totalEUAdded;
+ return true;
+ }
+
+ public boolean addEnergy(long voltage, long amperage) {
+ if (voltage > this.voltage) {
+ return false;
+ }
+
+ return addEnergyUnsafe(voltage * amperage);
+ }
+
+ public boolean addEnergy(long voltage) {
+ return addEnergy(voltage, 1);
+ }
+
+ public long injectEnergy(long voltage, long availableAmperage) {
+ long usedAmperes = 0;
+ while (addEnergy(voltage, 1) && usedAmperes < amperage) {
+ usedAmperes++;
+ }
+
+ return usedAmperes;
+ }
+
+ public boolean removeEnergyUnsafe(long totalEURemoved) {
+ if (storedEnergy - totalEURemoved < 0) {
+ return false;
+ }
+
+ storedEnergy -= totalEURemoved;
+ return true;
+ }
+
+ public boolean removeEnergy(long voltage, long amperage) {
+ if (voltage > this.voltage) {
+ return false;
+ }
+
+ return removeEnergyUnsafe(voltage * amperage);
+ }
+
+ public boolean removeEnergy(long voltage) {
+ return removeEnergy(voltage, 1);
+ }
+
+ public long getCapacity() {
+ return energyCapacity;
+ }
+
+ public long getVoltage() {
+ return voltage;
+ }
+
+ public long getStoredEnergy() {
+ return storedEnergy;
+ }
+
+ public boolean isEnergyReceiver() {
+ return (type & RECEIVER) > 0;
+ }
+
+ public boolean isEnergyEmitter() {
+ return (type & EMITTER) > 0;
+ }
+
+ public void writeToNBT(NBTTagCompound nbt) {
+ NBTTagCompound powerLogic = new NBTTagCompound();
+ powerLogic.setLong(NBT.POWER_LOGIC_ENERGY_CAPACITY, energyCapacity);
+ powerLogic.setLong(NBT.POWER_LOGIC_STORED_ENERGY, storedEnergy);
+ powerLogic.setLong(NBT.POWER_LOGIC_AMPERAGE, amperage);
+ powerLogic.setLong(NBT.POWER_LOGIC_VOLTAGE, voltage);
+ powerLogic.setInteger(NBT.POWER_LOGIC_TYPE, type);
+ nbt.setTag(NBT.POWER_LOGIC, powerLogic);
+ }
+
+ public void loadFromNBT(NBTTagCompound nbt) {
+ NBTTagCompound powerLogic = nbt.getCompoundTag(NBT.POWER_LOGIC);
+ energyCapacity = powerLogic.getLong(NBT.POWER_LOGIC_ENERGY_CAPACITY);
+ storedEnergy = powerLogic.getLong(NBT.POWER_LOGIC_STORED_ENERGY);
+ amperage = powerLogic.getLong(NBT.POWER_LOGIC_AMPERAGE);
+ voltage = powerLogic.getLong(NBT.POWER_LOGIC_VOLTAGE);
+ type = powerLogic.getInteger(NBT.POWER_LOGIC_TYPE);
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java
new file mode 100644
index 0000000000..fa0d285401
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java
@@ -0,0 +1,97 @@
+package gregtech.api.logic;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.util.GT_Recipe.GT_Recipe_Map;
+
+public abstract class ProcessingLogic {
+
+ protected GT_Recipe_Map recipeMap;
+ protected ItemStack[] inputItems;
+ protected ItemStack[] outputItems;
+ protected ItemStack[] currentOutputItems;
+ protected FluidStack[] inputFluids;
+ protected FluidStack[] outputFluids;
+ protected FluidStack[] currentOutputFluids;
+ protected long eut;
+ protected long duration;
+
+ public ProcessingLogic() {}
+
+ public ProcessingLogic setInputItems(ItemStack... itemInputs) {
+ this.inputItems = itemInputs;
+ return this;
+ }
+
+ public ProcessingLogic setInputFluids(FluidStack... fluidInputs) {
+ this.inputFluids = fluidInputs;
+ return this;
+ }
+
+ public ProcessingLogic setOutputItems(ItemStack... itemOutputs) {
+ this.outputItems = itemOutputs;
+ return this;
+ }
+
+ public ProcessingLogic setOutputFluids(FluidStack... fluidOutputs) {
+ this.outputFluids = fluidOutputs;
+ return this;
+ }
+
+ public ProcessingLogic setCurrentOutputItems(ItemStack... currentOutputItems) {
+ this.currentOutputItems = currentOutputItems;
+ return this;
+ }
+
+ public ProcessingLogic setCurrentOutputFluids(FluidStack... currentOutputFluids) {
+ this.currentOutputFluids = currentOutputFluids;
+ return this;
+ }
+
+ public ProcessingLogic setRecipeMap(GT_Recipe_Map recipeMap) {
+ this.recipeMap = recipeMap;
+ return this;
+ }
+
+ public ProcessingLogic setDuration(long duration) {
+ this.duration = duration;
+ return this;
+ }
+
+ public ProcessingLogic setEut(long eut) {
+ this.eut = eut;
+ return this;
+ }
+
+ /**
+ * Clears everything stored in the Processing Logic other than the Recipe map used
+ */
+ public ProcessingLogic clear() {
+ this.inputItems = null;
+ this.inputFluids = null;
+ this.outputItems = null;
+ this.outputFluids = null;
+ this.eut = 0;
+ this.duration = 0;
+ return this;
+ }
+
+ public abstract boolean process();
+
+ public ItemStack[] getOutputItems() {
+ return outputItems;
+ }
+
+ public FluidStack[] getOutputFluids() {
+ return outputFluids;
+ }
+
+ public long getDuration() {
+ return duration;
+ }
+
+ public long getEut() {
+ return eut;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java
new file mode 100644
index 0000000000..657efbb74d
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java
@@ -0,0 +1,8 @@
+package gregtech.api.logic.interfaces;
+
+import gregtech.api.logic.PollutionLogic;
+
+public interface PollutionLogicHost {
+
+ PollutionLogic getPollutionLogic();
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java
new file mode 100644
index 0000000000..8e504674aa
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java
@@ -0,0 +1,16 @@
+package gregtech.api.logic.interfaces;
+
+import gregtech.api.logic.PowerLogic;
+
+public interface PowerLogicHost {
+
+ PowerLogic getPowerLogic(byte side);
+
+ default boolean isEnergyReceiver() {
+ return false;
+ }
+
+ default boolean isEnergyEmitter() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java
new file mode 100644
index 0000000000..55418208b0
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java
@@ -0,0 +1,8 @@
+package gregtech.api.logic.interfaces;
+
+import gregtech.api.logic.ProcessingLogic;
+
+public interface ProcessingLogicHost {
+
+ ProcessingLogic getProcessingLogic();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
index 84cbdfb529..195fed3100 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
@@ -8,9 +8,11 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.Tuple;
import gregtech.api.enums.Materials;
-import gregtech.api.multitileentity.base.BaseMultiTileEntity;
-import gregtech.api.multitileentity.multiblock.casing.AdvancedCasing;
+import gregtech.api.multitileentity.base.MultiTileEntity;
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
import gregtech.api.util.GT_Util;
+import gregtech.common.tileentities.casings.upgrade.InventoryUpgrade;
public class MultiTileEntityClassContainer {
@@ -19,9 +21,9 @@ public class MultiTileEntityClassContainer {
private String mCategoryName;
public final short mID;
- public Class<? extends BaseMultiTileEntity> mClass;
+ public Class<? extends MultiTileEntity> mClass;
public MultiTileEntityBlock mBlock;
- public BaseMultiTileEntity mCanonicalTileEntity;
+ public MultiTileEntity mCanonicalTileEntity;
public NBTTagCompound mParameters;
// These have defaults
@@ -30,7 +32,7 @@ public class MultiTileEntityClassContainer {
public boolean mHidden = false;
public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID,
- Class<? extends BaseMultiTileEntity> aClass) {
+ Class<? extends MultiTileEntity> aClass) {
/* Start the Builder */
mRegistry = new WeakReference<>(aRegistry);
mID = (short) aID;
@@ -127,14 +129,13 @@ public class MultiTileEntityClassContainer {
}
public MultiTileEntityClassContainer tier(int aTier) {
- verifyDescendentOf(AdvancedCasing.class);
-
+ verifyDescendentOfMultiple(true, UpgradeCasing.class, FunctionalCasing.class);
mParameters.setInteger(NBT.TIER, aTier);
return this;
}
public MultiTileEntityClassContainer upgradeInventorySize(int aSize) {
- verifyDescendentOf(AdvancedCasing.class);
+ verifyDescendentOf(InventoryUpgrade.class);
mParameters.setInteger(NBT.UPGRADE_INVENTORY_SIZE, aSize);
return this;
@@ -161,4 +162,25 @@ public class MultiTileEntityClassContainer {
"Expected a descendent of " + cls.getName() + " got " + mClass.getName() + " instead.");
}
}
+
+ private void verifyDescendentOfMultiple(boolean onlyOne, Class<?>... classes) {
+ boolean atLeastOne = false;
+ String classNames = "";
+ for (Class<?> cls : classes) {
+ classNames += cls.getName() + " ";
+ if (!onlyOne) {
+ verifyDescendentOf(cls);
+ atLeastOne = true;
+ } else {
+ if (cls.isAssignableFrom(mClass)) {
+ atLeastOne = true;
+ }
+ }
+ }
+
+ if (!atLeastOne) {
+ throw new IllegalArgumentException(
+ "Expected a descendent of any of these " + classNames + " got " + mClass.getName() + " instead.");
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
index 589f7ef8a6..9fc35963b3 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
@@ -25,7 +25,7 @@ import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
import cpw.mods.fml.common.registry.GameRegistry;
import gregtech.api.GregTech_API;
import gregtech.api.enums.GT_Values;
-import gregtech.api.multitileentity.base.BaseMultiTileEntity;
+import gregtech.api.multitileentity.base.MultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Util;
@@ -75,6 +75,7 @@ public class MultiTileEntityRegistry {
"The MultiTileEntity Registry must be initialised during Preload Phase and not before");
mNameInternal = aNameInternal;
mBlock = aBlock;
+ GT_FML_LOGGER.info(aNameInternal + " " + Block.getIdFromBlock(aBlock) + "This is the answer");
mBlock.mMultiTileEntityRegistry = this;
REGISTRIES.put(new ItemStack(Item.getItemFromBlock(aBlock), 1, GT_Values.W), this);
NAMED_REGISTRIES.put(mNameInternal, this);
@@ -96,7 +97,7 @@ public class MultiTileEntityRegistry {
return NAMED_REGISTRIES.get(aRegistryName);
}
- public MultiTileEntityClassContainer create(int aID, Class<? extends BaseMultiTileEntity> aClass) {
+ public MultiTileEntityClassContainer create(int aID, Class<? extends MultiTileEntity> aClass) {
return new MultiTileEntityClassContainer(this, aID, aClass);
}
diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
index 06ae77afe1..fdf72b4eab 100644
--- a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
@@ -27,7 +27,6 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
-import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.Explosion;
@@ -50,16 +49,12 @@ import gregtech.api.enums.Textures;
import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.IIconContainer;
import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
-import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
import gregtech.api.metatileentity.CoverableTileEntity;
import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
import gregtech.api.multitileentity.MultiTileEntityClassContainer;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
-import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
-import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade;
import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.net.GT_Packet_New;
import gregtech.api.objects.GT_ItemStack;
@@ -72,69 +67,68 @@ import gregtech.api.util.GT_Utility;
import gregtech.common.render.GT_MultiTexture;
import gregtech.common.render.IRenderedBlock;
-public abstract class BaseMultiTileEntity extends CoverableTileEntity
- implements IMultiTileEntity, IHasWorldObjectAndCoords, IRenderedBlock, IGregtechWailaProvider {
+public abstract class MultiTileEntity extends CoverableTileEntity implements IMultiTileEntity, IRenderedBlock {
- public IIconContainer[] mTextures = emptyIconContainerArray;
+ public IIconContainer[] textures = emptyIconContainerArray;
// public IIconContainer[] mTexturesFront = emptyIconContainerArray;
// Makes a Bounding Box without having to constantly specify the Offset Coordinates.
protected static final float[] PX_BOX = { 0, 0, 0, 1, 1, 1 };
- public Materials mMaterial = Materials._NULL;
- protected final boolean mIsTicking; // If this TileEntity is ticking at all
+ public Materials material = Materials._NULL;
+ protected final boolean isTicking; // If this TileEntity is ticking at all
// This Variable checks if this TileEntity should refresh when the Block is being set. That way you
// can turn this check off any time you need it.
- protected boolean mShouldRefresh = true;
+ protected boolean shouldRefresh = true;
- protected boolean mDoesBlockUpdate = false; // This Variable is for a buffered Block Update.
- protected boolean mForceFullSelectionBoxes = false; // This Variable is for forcing the Selection Box to be full.
- protected boolean mNeedsUpdate = false;
- protected boolean mInventoryChanged = false;
- protected boolean mIsPainted = false;
- protected byte mFacing = SIDE_WEST; // Default to WEST, so it renders facing Left in the inventory
- protected byte mColor;
- protected int mRGBa = GT_Values.UNCOLORED;
- private short mMTEID = GT_Values.W, mMTERegistry = GT_Values.W;
- private String mCustomName = null;
- private String mOwnerName = "";
- private UUID mOwnerUuid = GT_Utility.defaultUuid;
- private boolean mLockUpgrade = false;
+ protected boolean needsBlockUpdate = false; // This Variable is for a buffered Block Update.
+ protected boolean forceFullSelectionBox = false; // This Variable is for forcing the Selection Box to be full.
+ protected boolean needsUpdate = false;
+ protected boolean hasInventoryChanged = false;
+ protected boolean isPainted = false;
+ protected byte facing = SIDE_WEST; // Default to WEST, so it renders facing Left in the inventory
+ protected byte color;
+ protected int rgba = GT_Values.UNCOLORED;
+ private short mteID = GT_Values.W, mteRegistry = GT_Values.W;
+ private String customName = null;
+ private String ownerName = "";
+ private UUID ownerUUID = GT_Utility.defaultUuid;
+ private boolean lockUpgrade = false;
- public BaseMultiTileEntity(boolean mIsTicking) {
- this.mIsTicking = mIsTicking;
+ public MultiTileEntity(boolean isTicking) {
+ this.isTicking = isTicking;
}
@Override
public short getMultiTileEntityID() {
- return mMTEID;
+ return mteID;
}
@Override
public short getMultiTileEntityRegistryID() {
- return mMTERegistry;
+ return mteRegistry;
}
@Override
- public void onRegistrationFirst(MultiTileEntityRegistry aRegistry, short aID) {
+ public void onRegistrationFirst(MultiTileEntityRegistry registry, short id) {
GameRegistry.registerTileEntity(getClass(), getTileEntityName());
}
@Override
- public void initFromNBT(NBTTagCompound aNBT, short aMTEID, short aMTERegistry) {
+ public void initFromNBT(NBTTagCompound nbt, short mteID, short mteRegistry) {
// Set ID and Registry ID.
- mMTEID = aMTEID;
- mMTERegistry = aMTERegistry;
+ this.mteID = mteID;
+ this.mteRegistry = mteRegistry;
// Read the Default Parameters from NBT.
- if (aNBT != null) readFromNBT(aNBT);
+ if (nbt != null) readFromNBT(nbt);
}
@Override
- public void loadTextureNBT(NBTTagCompound aNBT) {
+ public void loadTextureNBT(NBTTagCompound nbt) {
// Loading the registry
- final String textureName = aNBT.getString(NBT.TEXTURE);
- mTextures = new IIconContainer[] {
+ final String textureName = nbt.getString(NBT.TEXTURE);
+ textures = new IIconContainer[] {
new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/bottom"),
new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/top"),
new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/side"), };
@@ -145,54 +139,54 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
// Loading an instance
final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry
.getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID());
- if (tCanonicalTileEntity instanceof BaseMultiTileEntity)
- mTextures = ((BaseMultiTileEntity) tCanonicalTileEntity).mTextures;
+ if (tCanonicalTileEntity instanceof MultiTileEntity)
+ textures = ((MultiTileEntity) tCanonicalTileEntity).textures;
}
@Override
- public void readFromNBT(NBTTagCompound aNBT) {
+ public void readFromNBT(NBTTagCompound nbt) {
// Check if this is a World/Chunk Loading Process calling readFromNBT.
- if (mMTEID == GT_Values.W || mMTERegistry == GT_Values.W) {
+ if (mteID == GT_Values.W || mteRegistry == GT_Values.W) {
// Yes it is, so read the ID Tags first.
- mMTEID = aNBT.getShort(NBT.MTE_ID);
- mMTERegistry = aNBT.getShort(NBT.MTE_REG);
+ mteID = nbt.getShort(NBT.MTE_ID);
+ mteRegistry = nbt.getShort(NBT.MTE_REG);
// And add additional Default Parameters, in case the Mod updated with new ones.
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mMTERegistry);
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mteRegistry);
if (tRegistry != null) {
- final MultiTileEntityClassContainer tClass = tRegistry.getClassContainer(mMTEID);
+ final MultiTileEntityClassContainer tClass = tRegistry.getClassContainer(mteID);
if (tClass != null) {
// Add the Default Parameters. Useful for things that differ between different tiers/types of the
// same machine
- aNBT = GT_Util.fuseNBT(aNBT, tClass.mParameters);
+ nbt = GT_Util.fuseNBT(nbt, tClass.mParameters);
}
}
}
// read the Coords if it has them.
- if (aNBT.hasKey("x")) xCoord = aNBT.getInteger("x");
- if (aNBT.hasKey("y")) yCoord = aNBT.getInteger("y");
- if (aNBT.hasKey("z")) zCoord = aNBT.getInteger("z");
+ if (nbt.hasKey("x")) xCoord = nbt.getInteger("x");
+ if (nbt.hasKey("y")) yCoord = nbt.getInteger("y");
+ if (nbt.hasKey("z")) zCoord = nbt.getInteger("z");
// read the custom Name.
- if (aNBT.hasKey(NBT.DISPAY)) mCustomName = aNBT.getCompoundTag(NBT.DISPAY).getString(NBT.CUSTOM_NAME);
+ if (nbt.hasKey(NBT.DISPAY)) customName = nbt.getCompoundTag(NBT.DISPAY).getString(NBT.CUSTOM_NAME);
// And now everything else.
try {
- if (aNBT.hasKey(NBT.MATERIAL)) mMaterial = Materials.get(aNBT.getString(NBT.MATERIAL));
- if (aNBT.hasKey(NBT.COLOR)) mRGBa = aNBT.getInteger(NBT.COLOR);
+ if (nbt.hasKey(NBT.MATERIAL)) material = Materials.get(nbt.getString(NBT.MATERIAL));
+ if (nbt.hasKey(NBT.COLOR)) rgba = nbt.getInteger(NBT.COLOR);
- mOwnerName = aNBT.getString(NBT.OWNER);
+ ownerName = nbt.getString(NBT.OWNER);
try {
- mOwnerUuid = UUID.fromString(aNBT.getString(NBT.OWNER_UUID));
+ ownerUUID = UUID.fromString(nbt.getString(NBT.OWNER_UUID));
} catch (IllegalArgumentException e) {
- mOwnerUuid = null;
+ ownerUUID = null;
}
- if (aNBT.hasKey(NBT.LOCK_UPGRADE)) mLockUpgrade = aNBT.getBoolean(NBT.LOCK_UPGRADE);
- if (aNBT.hasKey(NBT.FACING)) mFacing = aNBT.getByte(NBT.FACING);
+ if (nbt.hasKey(NBT.LOCK_UPGRADE)) lockUpgrade = nbt.getBoolean(NBT.LOCK_UPGRADE);
+ if (nbt.hasKey(NBT.FACING)) facing = nbt.getByte(NBT.FACING);
- readCoverNBT(aNBT);
- readMultiTileNBT(aNBT);
+ readCoverNBT(nbt);
+ readMultiTileNBT(nbt);
- if (GregTech_API.sBlockIcons == null && aNBT.hasKey(NBT.TEXTURE)) {
- loadTextureNBT(aNBT);
+ if (GregTech_API.sBlockIcons == null && nbt.hasKey(NBT.TEXTURE)) {
+ loadTextureNBT(nbt);
} else {
copyTextures();
}
@@ -214,10 +208,10 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
public final void writeToNBT(NBTTagCompound aNBT) {
super.writeToNBT(aNBT);
// write the IDs
- aNBT.setShort(NBT.MTE_ID, mMTEID);
- aNBT.setShort(NBT.MTE_REG, mMTERegistry);
+ aNBT.setShort(NBT.MTE_ID, mteID);
+ aNBT.setShort(NBT.MTE_REG, mteRegistry);
// write the Custom Name
- if (GT_Utility.isStringValid(mCustomName)) {
+ if (GT_Utility.isStringValid(customName)) {
final NBTTagCompound displayNBT;
if (aNBT.hasKey(NBT.DISPAY)) {
displayNBT = aNBT.getCompoundTag(NBT.DISPAY);
@@ -225,15 +219,15 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
displayNBT = new NBTTagCompound();
aNBT.setTag(NBT.DISPAY, displayNBT);
}
- displayNBT.setString(NBT.CUSTOM_NAME, mCustomName);
+ displayNBT.setString(NBT.CUSTOM_NAME, customName);
}
// write the rest
try {
- aNBT.setString(NBT.OWNER, mOwnerName);
- aNBT.setString(NBT.OWNER_UUID, mOwnerUuid == null ? "" : mOwnerUuid.toString());
- aNBT.setBoolean(NBT.LOCK_UPGRADE, mLockUpgrade);
- aNBT.setByte(NBT.FACING, mFacing);
+ aNBT.setString(NBT.OWNER, ownerName);
+ aNBT.setString(NBT.OWNER_UUID, ownerUUID == null ? "" : ownerUUID.toString());
+ aNBT.setBoolean(NBT.LOCK_UPGRADE, lockUpgrade);
+ aNBT.setByte(NBT.FACING, facing);
writeCoverNBT(aNBT, false);
writeMultiTileNBT(aNBT);
@@ -278,19 +272,19 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public boolean canUpdate() {
- return mIsTicking && mShouldRefresh;
+ return isTicking && shouldRefresh;
}
@Override
public boolean shouldRefresh(Block aOldBlock, Block aNewBlock, int aOldMeta, int aNewMeta, World aWorld, int aX,
int aY, int aZ) {
- return mShouldRefresh || aOldBlock != aNewBlock;
+ return shouldRefresh || aOldBlock != aNewBlock;
}
@Override
public void updateEntity() {
super.updateEntity();
- if (mDoesBlockUpdate) doBlockUpdate();
+ if (needsBlockUpdate) doBlockUpdate();
}
public void doBlockUpdate() {
@@ -310,7 +304,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
OPOS[tSide]);
}
}
- mDoesBlockUpdate = false;
+ needsBlockUpdate = false;
}
@Override
@@ -387,17 +381,17 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
public ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass) {
// Top, bottom or side
aSide = (byte) Math.min(aSide, 2);
- return new ITexture[] { TextureFactory.of(mTextures[aSide], GT_Util.getRGBaArray(mRGBa)) };
+ return new ITexture[] { TextureFactory.of(textures[aSide], GT_Util.getRGBaArray(rgba)) };
}
@Override
public void setCustomName(String aName) {
- mCustomName = aName;
+ customName = aName;
}
@Override
public String getCustomName() {
- return GT_Utility.isStringValid(mCustomName) ? mCustomName : null;
+ return GT_Utility.isStringValid(customName) ? customName : null;
}
@Override
@@ -434,7 +428,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public byte getFrontFacing() {
- return mFacing;
+ return facing;
}
/**
@@ -445,7 +439,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public boolean setMainFacing(byte aSide) {
if (!isValidFacing(aSide)) return false;
- mFacing = aSide;
+ facing = aSide;
issueClientUpdate();
issueBlockUpdate();
@@ -465,12 +459,12 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public int getPaint() {
- return this.mRGBa;
+ return this.rgba;
}
@Override
public byte getBackFacing() {
- return GT_Utility.getOppositeSide(mFacing);
+ return GT_Utility.getOppositeSide(facing);
}
@Override
@@ -567,10 +561,10 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
*/
@Override
public void issueTextureUpdate() {
- if (!mIsTicking) {
+ if (!isTicking) {
markBlockForUpdate();
} else {
- mNeedsUpdate = true;
+ needsUpdate = true;
}
}
@@ -588,7 +582,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
protected void markBlockForUpdate() {
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
// worldObj.func_147479_m(xCoord, yCoord, zCoord);
- mNeedsUpdate = false;
+ needsUpdate = false;
}
public boolean box(Block aBlock, float[] aBox) {
@@ -609,7 +603,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public void setShouldRefresh(boolean aShouldRefresh) {
- mShouldRefresh = aShouldRefresh;
+ shouldRefresh = aShouldRefresh;
}
/**
@@ -630,7 +624,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
*/
@Override
public final void issueBlockUpdate() {
- if (mIsTicking) mDoesBlockUpdate = true;
+ if (isTicking) needsBlockUpdate = true;
else doBlockUpdate();
}
@@ -668,14 +662,14 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool() {
- if (mForceFullSelectionBoxes) return box();
+ if (forceFullSelectionBox) return box();
return box(shrunkBox());
}
@Override
public ItemStack getPickBlock(MovingObjectPosition aTarget) {
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mMTERegistry);
- return tRegistry == null ? null : tRegistry.getItem(mMTEID, writeItemNBT(new NBTTagCompound()));
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mteRegistry);
+ return tRegistry == null ? null : tRegistry.getItem(mteID, writeItemNBT(new NBTTagCompound()));
}
@Override
@@ -683,30 +677,30 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public String getOwnerName() {
- if (GT_Utility.isStringInvalid(mOwnerName)) return "Player";
- return mOwnerName;
+ if (GT_Utility.isStringInvalid(ownerName)) return "Player";
+ return ownerName;
}
@Override
public String setOwnerName(String aName) {
- if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player";
- return mOwnerName = aName;
+ if (GT_Utility.isStringInvalid(aName)) return ownerName = "Player";
+ return ownerName = aName;
}
@Override
public UUID getOwnerUuid() {
- return mOwnerUuid;
+ return ownerUUID;
}
@Override
public void setOwnerUuid(UUID uuid) {
- mOwnerUuid = uuid;
+ ownerUUID = uuid;
}
@Override
public boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, byte aSide,
float aHitX, float aHitY, float aHitZ) {
- mFacing = getSideForPlayerPlacing(aPlayer, mFacing, getValidFacings());
+ facing = getSideForPlayerPlacing(aPlayer, facing, getValidFacings());
onFacingChange();
return true;
}
@@ -955,25 +949,25 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely) {
- if (aCheckPrecicely || privateAccess() || (mOwnerName.length() == 0))
- if ((mOwnerName.length() == 0) && isServerSide()) {
+ if (aCheckPrecicely || privateAccess() || (ownerName.length() == 0))
+ if ((ownerName.length() == 0) && isServerSide()) {
setOwnerName(aPlayer.getDisplayName());
setOwnerUuid(aPlayer.getUniqueID());
} else return !privateAccess() || aPlayer.getDisplayName().equals("Player")
- || mOwnerName.equals("Player")
- || mOwnerName.equals(aPlayer.getDisplayName());
+ || ownerName.equals("Player")
+ || ownerName.equals(aPlayer.getDisplayName());
return true;
}
@Override
public boolean privateAccess() {
- return mLockUpgrade;
+ return lockUpgrade;
}
/**
* @return a Packet containing all Data which has to be synchronised to the Client - Override as needed
*/
- public GT_Packet_New getClientDataPacket() {
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(
0,
@@ -982,8 +976,8 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
zCoord,
getMultiTileEntityRegistryID(),
getMultiTileEntityID(),
- (byte) ((mFacing & 7) | (mRedstone ? 16 : 0)),
- mColor);
+ (byte) ((facing & 7) | (mRedstone ? 16 : 0)),
+ color);
packet.setCoverData(
getCoverInfoAtSide((byte) 0).getCoverID(),
@@ -999,24 +993,6 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
| ((mSidedRedstone[3] > 0) ? 8 : 0)
| ((mSidedRedstone[4] > 0) ? 16 : 0)
| ((mSidedRedstone[5] > 0) ? 32 : 0)));
-
- if (this instanceof IMTE_HasModes) {
- final IMTE_HasModes mteModes = (IMTE_HasModes) this;
- packet.setModes(mteModes.getMode(), mteModes.getAllowedModes());
- }
- if (this instanceof IMultiBlockPart) {
- final IMultiBlockPart mtePart = (IMultiBlockPart) this;
- if (mtePart.getTargetPos() != null) {
- final ChunkCoordinates aTarget = mtePart.getTargetPos();
- packet.setTargetPos(aTarget.posX, (short) aTarget.posY, aTarget.posZ);
- }
- packet.setInventoryIndex(mtePart.getLockedInventoryIndex());
- }
- if (this instanceof InventoryUpgrade) {
- String tName = ((InventoryUpgrade) this).getInventoryName();
- packet.setInventoryName(tName);
- }
-
return packet;
}
@@ -1039,7 +1015,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
issueTextureUpdate();
switch (aEventID) {
case GregTechTileClientEvents.CHANGE_COMMON_DATA:
- mFacing = (byte) (aValue & 7);
+ facing = (byte) (aValue & 7);
// mActive = ((aValue & 8) != 0);
mRedstone = ((aValue & 16) != 0);
// mLockUpgrade = ((aValue&32) != 0);
@@ -1050,7 +1026,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
break;
case GregTechTileClientEvents.CHANGE_COLOR:
if (aValue > 16 || aValue < 0) aValue = 0;
- mColor = (byte) aValue;
+ color = (byte) aValue;
break;
case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT:
mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0);
@@ -1110,15 +1086,17 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
if (aLogLevel > 2) {
tList.add(
"MultiTileRegistry-ID: " + EnumChatFormatting.BLUE
- + mMTERegistry
+ + mteRegistry
+ EnumChatFormatting.RESET
+ " MultiTile-ID: "
+ EnumChatFormatting.BLUE
- + mMTEID
+ + mteID
+ EnumChatFormatting.RESET);
}
if (joinedIc2Enet) tList.add("Joined IC2 ENet");
+ tList.add("Energy: " + getUniversalEnergyStored() + "/" + getUniversalEnergyCapacity());
+
addDebugInfo(aPlayer, aLogLevel, tList);
return tList;
@@ -1240,12 +1218,12 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
}
@Override
- public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ public boolean decreaseStoredEnergyUnits(long energy, boolean ignoreTooLittleEnergy) {
return false;
}
@Override
- public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ public boolean increaseStoredEnergyUnits(long energy, boolean ignoreTooMuchEnergy) {
return false;
}
@@ -1376,7 +1354,7 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity
@Override
public void markInventoryBeenModified() {
- mInventoryChanged = true;
+ hasInventoryChanged = true;
}
/*
diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java
index 29a24f9715..a4007ec85e 100644
--- a/src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java
@@ -9,11 +9,11 @@ import gregtech.api.net.GT_Packet_SendCoverData;
import gregtech.api.util.ISerializableObject;
import gregtech.common.covers.CoverInfo;
-public abstract class BaseNontickableMultiTileEntity extends BaseMultiTileEntity {
+public abstract class NonTickableMultiTileEntity extends MultiTileEntity {
boolean mConstructed = false; // Keeps track of whether this TE has been constructed and placed in the world
- public BaseNontickableMultiTileEntity() {
+ public NonTickableMultiTileEntity() {
super(false);
}
diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseTickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
index 0f124ae36e..25a9edd9ac 100644
--- a/src/main/java/gregtech/api/multitileentity/base/BaseTickableMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
@@ -10,68 +10,66 @@ import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_OnNeighborB
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Util;
-public abstract class BaseTickableMultiTileEntity extends BaseMultiTileEntity implements IMTE_OnNeighborBlockChange {
+public abstract class TickableMultiTileEntity extends MultiTileEntity implements IMTE_OnNeighborBlockChange {
/** Variable for seeing if the Tick Function is called right now. */
- public boolean mIsRunningTick = false;
+ public boolean isRunningTick = false;
/** Gets set to true when the Block received a Block Update. */
- public boolean mBlockUpdated = false;
+ public boolean blockUpdated = false;
/** Timer Value */
- protected long mTimer = 0;
+ protected long timer = 0;
/** Variable for updating Data to the Client */
- private boolean mSendClientData = false;
+ private boolean sendClientData = false;
- public BaseTickableMultiTileEntity() {
+ public TickableMultiTileEntity() {
super(true);
}
@Override
public final void updateEntity() {
- mIsRunningTick = true;
+ isRunningTick = true;
final boolean isServerSide = isServerSide();
try {
- if (mTimer++ == 0) {
+ if (timer++ == 0) {
markDirty();
GT_Util.markChunkDirty(this);
onFirstTick(isServerSide);
}
- if (!isDead()) onPreTick(mTimer, isServerSide);
- if (!isDead()) {
- mTimer++;
- super.updateEntity();
+ if (isDead()) {
+ return;
}
- if (!isServerSide) {
- if (mNeedsUpdate) {
- worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
- // worldObj.func_147479_m(xCoord, yCoord, zCoord);
- mNeedsUpdate = false;
- }
+ onPreTick(timer, isServerSide);
+ timer++;
+ super.updateEntity();
+ if (!isServerSide && needsUpdate) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
}
- if (!isDead()) onTick(mTimer, isServerSide);
- if (!isDead() && isServerSide && mTimer > 2 && mSendClientData) {
+ onTick(timer, isServerSide);
+ if (isServerSide && timer > 2 && sendClientData) {
sendClientData(null);
}
- if (!isDead()) onPostTick(mTimer, isServerSide);
+ onPostTick(timer, isServerSide);
} catch (Throwable e) {
GT_FML_LOGGER.error("UpdateEntity Failed", e);
e.printStackTrace(GT_Log.err);
try {
- onTickFailed(mTimer, isServerSide);
+ onTickFailed(timer, isServerSide);
} catch (Throwable e2) {
GT_FML_LOGGER.error("UpdateEntity:onTickFailed Failed", e);
}
}
- mIsRunningTick = false;
+ isRunningTick = false;
}
@Override
public void sendClientData(EntityPlayerMP aPlayer) {
- if (mSendClientData) {
+ if (sendClientData) {
GT_FML_LOGGER.info("Sending client data");
super.sendClientData(aPlayer);
- mSendClientData = false;
+ sendClientData = false;
}
}
@@ -85,33 +83,27 @@ public abstract class BaseTickableMultiTileEntity extends BaseMultiTileEntity im
}
/** The first part of the Tick. */
- public void onPreTick(long aTick, boolean isServerSide) {
- /* Do nothing */
- }
+ public void onPreTick(long aTick, boolean isServerSide) {}
/** The regular Tick. */
- public void onTick(long aTimer, boolean isServerSide) {
- /* Do nothing */
+ public void onTick(long tick, boolean isServerSide) {
+
}
/** The absolute last part of the Tick. */
- public void onPostTick(long aTick, boolean isServerSide) {
- /* Do nothing */
- }
+ public void onPostTick(long aTick, boolean isServerSide) {}
/** Gets called when there is an Exception happening during one of the Tick Functions. */
- public void onTickFailed(long aTimer, boolean isServerSide) {
- /* Do nothing */
- }
+ public void onTickFailed(long aTimer, boolean isServerSide) {}
@Override
public void onNeighborBlockChange(World aWorld, Block aBlock) {
- mBlockUpdated = true;
+ blockUpdated = true;
}
@Override
public void issueClientUpdate() {
- mSendClientData = true;
+ sendClientData = true;
}
@Override
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
new file mode 100644
index 0000000000..be74ca3ef2
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
@@ -0,0 +1,19 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileCasing {
+
+ CokeOven(0),
+ NONE(GT_Values.W);
+
+ private final short meta;
+
+ GT_MultiTileCasing(int meta) {
+ this.meta = (short) meta;
+ }
+
+ public short getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java
new file mode 100644
index 0000000000..0fc8f3dafd
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java
@@ -0,0 +1,19 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileMachine {
+
+ CokeOven(0),
+ NONE(GT_Values.W);
+
+ private final short meta;
+
+ GT_MultiTileMachine(int meta) {
+ this.meta = (short) meta;
+ }
+
+ public short getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
index 22409563d9..21e1328d27 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
@@ -3,8 +3,9 @@ package gregtech.api.multitileentity.interfaces;
import net.minecraft.util.ChunkCoordinates;
import net.minecraftforge.fluids.FluidStack;
-public interface IMultiBlockController
- extends IMultiTileEntity, IMultiBlockFluidHandler, IMultiBlockInventory, IMultiBlockEnergy {
+import gregtech.api.logic.PowerLogic;
+
+public interface IMultiBlockController extends IMultiTileEntity, IMultiBlockFluidHandler, IMultiBlockInventory {
boolean checkStructure(boolean aForceReset);
@@ -29,4 +30,6 @@ public interface IMultiBlockController
void unregisterInventory(String aName, String aID, int aType);
void changeInventoryName(String aName, String aID, int aType);
+
+ PowerLogic getPowerLogic(IMultiBlockPart part, byte side);
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
new file mode 100644
index 0000000000..babb85d118
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface IMultiTileMachine {
+
+ void setBooleans(int booleans);
+
+ int getBooleans();
+
+ void setSound(byte soundEvent, int soundEventValue);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
index 3739854893..a3d94bd97c 100644
--- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -1,49 +1,99 @@
package gregtech.api.multitileentity.machine;
import static com.google.common.primitives.Ints.saturatedCast;
+import static gregtech.api.enums.GT_Values.B;
import static gregtech.api.enums.GT_Values.emptyIconContainerArray;
+import java.util.ArrayList;
+
import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidTank;
import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.SoundResource;
import gregtech.api.enums.Textures;
+import gregtech.api.enums.TickTime;
import gregtech.api.fluid.FluidTankGT;
import gregtech.api.interfaces.IIconContainer;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.PollutionLogic;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.logic.interfaces.PollutionLogicHost;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
-import gregtech.api.multitileentity.base.BaseTickableMultiTileEntity;
+import gregtech.api.multitileentity.base.TickableMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileMachine;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
+import gregtech.client.GT_SoundLoop;
+import gregtech.common.GT_Pollution;
+
+public abstract class MultiTileBasicMachine extends TickableMultiTileEntity implements IMultiTileMachine {
-public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
+ protected static final int ACTIVE = B[0];
+ protected static final int TICKS_BETWEEN_RECIPE_CHECKS = 5 * TickTime.SECOND;
+ protected static final int POLLUTION_TICK = TickTime.SECOND;
+ protected static final byte INTERRUPT_SOUND_INDEX = 8;
+ protected static final byte PROCESS_START_SOUND_INDEX = 1;
protected static final IItemHandlerModifiable EMPTY_INVENTORY = new ItemStackHandler(0);
private static final String TEXTURE_LOCATION = "multitileentity/machines/";
- public IIconContainer[] mTexturesInactive = emptyIconContainerArray;
- public IIconContainer[] mTexturesActive = emptyIconContainerArray;
-
- protected int mParallel = 1;
- protected boolean mActive = false;
- protected long mStoredEnergy = 0;
- protected FluidTankGT[] mTanksInput = GT_Values.emptyFluidTankGT, mTanksOutput = GT_Values.emptyFluidTankGT;
- protected FluidStack[] mOutputFluids = GT_Values.emptyFluidStack;
-
- protected IItemHandlerModifiable mInputInventory = EMPTY_INVENTORY;
- protected IItemHandlerModifiable mOutputInventory = EMPTY_INVENTORY;
- protected boolean mOutputInventoryChanged = false;
+ public IIconContainer[] texturesInactive = emptyIconContainerArray;
+ public IIconContainer[] texturesActive = emptyIconContainerArray;
+
+ protected int maxParallel = 1;
+ protected boolean active = false;
+ protected long storedEnergy = 0;
+ protected long voltage = 0;
+ protected long amperage = 2;
+ protected long eut = 0;
+ protected int tier = 0;
+ protected long maxProgressTime = 0;
+ protected long progressTime = 0;
+ protected long burnTime = 0;
+ protected long totalBurnTime = 0;
+ protected FluidTankGT[] inputTanks = GT_Values.emptyFluidTankGT;
+ protected FluidTankGT[] outputTanks = GT_Values.emptyFluidTankGT;
+ protected FluidStack[] fluidsToOutput = GT_Values.emptyFluidStack;
+ protected ItemStack[] itemsToOutput = GT_Values.emptyItemStackArray;
+
+ protected IItemHandlerModifiable inputInventory = EMPTY_INVENTORY;
+ protected IItemHandlerModifiable outputInventory = EMPTY_INVENTORY;
+ protected boolean outputInventoryChanged = false;
+ private boolean powerShutDown = false;
+ private boolean wasEnabled = false;
+ private boolean canWork = true;
+ private boolean isElectric = true;
+ private boolean isSteam = false;
+ private boolean acceptsFuel = false;
+ private boolean isWireless = false;
+ private byte soundEvent = 0;
+ private int soundEventValue = 0;
+
+ @SideOnly(Side.CLIENT)
+ protected GT_SoundLoop activitySoundLoop;
@Override
public String getTileEntityName() {
@@ -51,20 +101,49 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
}
@Override
- public void writeMultiTileNBT(NBTTagCompound aNBT) {
- super.writeMultiTileNBT(aNBT);
- if (mParallel > 0) aNBT.setInteger(NBT.PARALLEL, mParallel);
- if (mActive) aNBT.setBoolean(NBT.ACTIVE, mActive);
- if (mInputInventory != null && mInputInventory.getSlots() > 0)
- writeInventory(aNBT, mInputInventory, NBT.INV_INPUT_LIST);
- if (mOutputInventory != null && mOutputInventory.getSlots() > 0)
- writeInventory(aNBT, mOutputInventory, NBT.INV_OUTPUT_LIST);
- for (int i = 0; i < mTanksInput.length; i++) mTanksInput[i].writeToNBT(aNBT, NBT.TANK_IN + i);
- for (int i = 0; i < mTanksOutput.length; i++) mTanksOutput[i].writeToNBT(aNBT, NBT.TANK_OUT + i);
- if (mOutputFluids != null && mOutputFluids.length > 0) writeFluids(aNBT, mOutputFluids, NBT.FLUID_OUT);
- }
-
- protected void writeFluids(NBTTagCompound aNBT, FluidStack[] fluids, String fluidListTag) {
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ if (maxParallel > 0) {
+ nbt.setInteger(NBT.PARALLEL, maxParallel);
+ }
+
+ if (active) {
+ nbt.setBoolean(NBT.ACTIVE, active);
+ }
+
+ if (inputInventory != null && inputInventory.getSlots() > 0) {
+ writeInventory(nbt, inputInventory, NBT.INV_INPUT_LIST);
+ }
+
+ if (outputInventory != null && outputInventory.getSlots() > 0) {
+ writeInventory(nbt, outputInventory, NBT.INV_OUTPUT_LIST);
+ }
+
+ for (int i = 0; i < inputTanks.length; i++) {
+ inputTanks[i].writeToNBT(nbt, NBT.TANK_IN + i);
+ }
+
+ for (int i = 0; i < outputTanks.length; i++) {
+ outputTanks[i].writeToNBT(nbt, NBT.TANK_OUT + i);
+ }
+
+ if (fluidsToOutput != null && fluidsToOutput.length > 0) {
+ writeFluids(nbt, fluidsToOutput, NBT.FLUID_OUT);
+ }
+
+ if (itemsToOutput != null) {
+ saveItemsToOutput(nbt);
+ }
+
+ nbt.setInteger(NBT.TIER, tier);
+ nbt.setLong(NBT.EUT_CONSUMPTION, eut);
+ nbt.setLong(NBT.BURN_TIME_LEFT, burnTime);
+ nbt.setLong(NBT.TOTAL_BURN_TIME, totalBurnTime);
+ nbt.setBoolean(NBT.ALLOWED_WORK, canWork);
+ nbt.setBoolean(NBT.ACTIVE, active);
+ }
+
+ protected void writeFluids(NBTTagCompound nbt, FluidStack[] fluids, String fluidListTag) {
if (fluids != null && fluids.length > 0) {
final NBTTagList tList = new NBTTagList();
for (final FluidStack tFluid : fluids) {
@@ -74,54 +153,89 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
tList.appendTag(tag);
}
}
- aNBT.setTag(fluidListTag, tList);
+ nbt.setTag(fluidListTag, tList);
}
}
- protected void writeInventory(NBTTagCompound aNBT, IItemHandlerModifiable inv, String invListTag) {
+ protected void writeInventory(NBTTagCompound nbt, IItemHandlerModifiable inv, String invListTag) {
if (inv != null && inv.getSlots() > 0) {
final NBTTagList tList = new NBTTagList();
- for (int tSlot = 0; tSlot < inv.getSlots(); tSlot++) {
- final ItemStack tStack = inv.getStackInSlot(tSlot);
+ for (int slot = 0; slot < inv.getSlots(); slot++) {
+ final ItemStack tStack = inv.getStackInSlot(slot);
if (tStack != null) {
final NBTTagCompound tag = new NBTTagCompound();
- tag.setByte("s", (byte) tSlot);
+ tag.setByte("s", (byte) slot);
tStack.writeToNBT(tag);
tList.appendTag(tag);
}
}
- aNBT.setTag(invListTag, tList);
+ nbt.setTag(invListTag, tList);
}
}
+ protected void saveItemsToOutput(NBTTagCompound aNBT) {
+ final NBTTagList nbtList = new NBTTagList();
+ for (int slot = 0; slot < itemsToOutput.length; slot++) {
+ final ItemStack itemStack = itemsToOutput[slot];
+ if (itemStack != null) {
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) slot);
+ itemStack.writeToNBT(tag);
+ nbtList.appendTag(tag);
+ }
+ }
+ aNBT.setTag(NBT.ITEM_OUT, nbtList);
+ }
+
@Override
- public void readMultiTileNBT(NBTTagCompound aNBT) {
- super.readMultiTileNBT(aNBT);
- if (aNBT.hasKey(NBT.PARALLEL)) mParallel = Math.max(1, aNBT.getInteger(NBT.PARALLEL));
- if (aNBT.hasKey(NBT.ACTIVE)) mActive = aNBT.getBoolean(NBT.ACTIVE);
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ if (nbt.hasKey(NBT.PARALLEL)) {
+ maxParallel = Math.max(1, nbt.getInteger(NBT.PARALLEL));
+ }
+
+ if (nbt.hasKey(NBT.ACTIVE)) {
+ active = nbt.getBoolean(NBT.ACTIVE);
+ }
/* Inventories */
- mInputInventory = new ItemStackHandler(Math.max(aNBT.getInteger(NBT.INV_INPUT_SIZE), 0));
- mOutputInventory = new ItemStackHandler(Math.max(aNBT.getInteger(NBT.INV_OUTPUT_SIZE), 0));
- loadInventory(aNBT, mInputInventory, NBT.INV_INPUT_LIST);
- loadInventory(aNBT, mOutputInventory, NBT.INV_OUTPUT_LIST);
+ inputInventory = new ItemStackHandler(Math.max(nbt.getInteger(NBT.INV_INPUT_SIZE), 0));
+ outputInventory = new ItemStackHandler(Math.max(nbt.getInteger(NBT.INV_OUTPUT_SIZE), 0));
+ loadInventory(nbt, inputInventory, NBT.INV_INPUT_LIST);
+ loadInventory(nbt, outputInventory, NBT.INV_OUTPUT_LIST);
/* Tanks */
- long tCapacity = 1000;
- if (aNBT.hasKey(NBT.TANK_CAPACITY)) tCapacity = saturatedCast(aNBT.getLong(NBT.TANK_CAPACITY));
+ long capacity = 1000;
+ if (nbt.hasKey(NBT.TANK_CAPACITY)) {
+ capacity = saturatedCast(nbt.getLong(NBT.TANK_CAPACITY));
+ }
- mTanksInput = new FluidTankGT[getFluidInputCount()];
- mTanksOutput = new FluidTankGT[getFluidOutputCount()];
- mOutputFluids = new FluidStack[getFluidOutputCount()];
+ inputTanks = new FluidTankGT[getFluidInputCount()];
+ outputTanks = new FluidTankGT[getFluidOutputCount()];
+ fluidsToOutput = new FluidStack[getFluidOutputCount()];
// 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 < inputTanks.length; i++) {
+ inputTanks[i] = new FluidTankGT(capacity).setCapacityMultiplier(maxParallel * 2L)
+ .readFromNBT(nbt, NBT.TANK_IN + i);
+ }
+ for (int i = 0; i < outputTanks.length; i++) {
+ outputTanks[i] = new FluidTankGT().readFromNBT(nbt, NBT.TANK_OUT + i);
+ }
+
+ for (int i = 0; i < fluidsToOutput.length; i++) {
+ fluidsToOutput[i] = FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag(NBT.FLUID_OUT + "." + i));
+ }
+
+ loadItemsToOutput(nbt);
+
+ tier = nbt.getInteger(NBT.TIER);
+ eut = nbt.getLong(NBT.EUT_CONSUMPTION);
+ burnTime = nbt.getLong(NBT.BURN_TIME_LEFT);
+ totalBurnTime = nbt.getLong(NBT.TOTAL_BURN_TIME);
+ canWork = nbt.getBoolean(NBT.ALLOWED_WORK);
+ active = nbt.getBoolean(NBT.ACTIVE);
}
protected void loadInventory(NBTTagCompound aNBT, IItemHandlerModifiable inv, String invListTag) {
@@ -133,25 +247,35 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
}
}
+ protected void loadItemsToOutput(NBTTagCompound aNBT) {
+ final NBTTagList tList = aNBT.getTagList(NBT.ITEM_OUT, 10);
+ itemsToOutput = new ItemStack[tList.tagCount()];
+ for (int i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final int tSlot = tNBT.getByte("s");
+ if (tSlot >= 0 && tSlot < itemsToOutput.length) itemsToOutput[tSlot] = GT_Utility.loadItem(tNBT);
+ }
+ }
+
@Override
public void loadTextureNBT(NBTTagCompound aNBT) {
// Loading the registry
final String textureName = aNBT.getString(NBT.TEXTURE);
- mTextures = new IIconContainer[] {
+ textures = new IIconContainer[] {
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/bottom"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/top"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/left"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/front"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/right"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/side") };
- mTexturesInactive = new IIconContainer[] {
+ texturesInactive = new IIconContainer[] {
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/bottom"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/top"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/left"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/front"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/right"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/inactive/back") };
- mTexturesActive = new IIconContainer[] {
+ texturesActive = new IIconContainer[] {
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/active/bottom"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/active/top"),
new Textures.BlockIcons.CustomIcon(TEXTURE_LOCATION + textureName + "/overlay/active/left"),
@@ -166,20 +290,33 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry
.getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID());
if (tCanonicalTileEntity instanceof MultiTileBasicMachine) {
- mTextures = ((MultiTileBasicMachine) tCanonicalTileEntity).mTextures;
- mTexturesInactive = ((MultiTileBasicMachine) tCanonicalTileEntity).mTexturesInactive;
- mTexturesActive = ((MultiTileBasicMachine) tCanonicalTileEntity).mTexturesActive;
+ textures = ((MultiTileBasicMachine) tCanonicalTileEntity).textures;
+ texturesInactive = ((MultiTileBasicMachine) tCanonicalTileEntity).texturesInactive;
+ texturesActive = ((MultiTileBasicMachine) tCanonicalTileEntity).texturesActive;
} else {
- mTextures = mTexturesInactive = mTexturesActive = emptyIconContainerArray;
+ textures = texturesInactive = texturesActive = emptyIconContainerArray;
}
}
@Override
public ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass) {
+ if (aSide != facing) {
+ return new ITexture[] { TextureFactory
+ .of(textures[GT_Values.FACING_ROTATIONS[facing][aSide]], GT_Util.getRGBaArray(rgba)) };
+ }
return new ITexture[] {
- TextureFactory.of(mTextures[GT_Values.FACING_ROTATIONS[mFacing][aSide]], GT_Util.getRGBaArray(mRGBa)),
- TextureFactory.of(
- (mActive ? mTexturesActive : mTexturesInactive)[GT_Values.FACING_ROTATIONS[mFacing][aSide]]) };
+ TextureFactory.of(textures[GT_Values.FACING_ROTATIONS[facing][aSide]], GT_Util.getRGBaArray(rgba)),
+ TextureFactory
+ .of((active ? texturesActive : texturesInactive)[GT_Values.FACING_ROTATIONS[facing][aSide]]) };
+ }
+
+ @Override
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
+ final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
+ int booleans = getBooleans();
+ packet.setBooleans(booleans);
+ packet.setSoundEvent(soundEvent, soundEventValue);
+ return packet;
}
/*
@@ -221,12 +358,12 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
@Override
public boolean isLiquidInput(byte aSide) {
- return aSide != mFacing;
+ return aSide != facing;
}
@Override
public boolean isLiquidOutput(byte aSide) {
- return aSide != mFacing;
+ return aSide != facing;
}
@Override
@@ -235,14 +372,14 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
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);
+ final IFluidTank[] rTanks = new IFluidTank[inputTanks.length + outputTanks.length];
+ System.arraycopy(inputTanks, 0, rTanks, 0, inputTanks.length);
+ System.arraycopy(outputTanks, 0, rTanks, inputTanks.length, outputTanks.length);
return rTanks;
} else if (fluidInput) {
- return mTanksInput;
+ return inputTanks;
} else if (fluidOutput) {
- return mTanksOutput;
+ return outputTanks;
}
return GT_Values.emptyFluidTank;
}
@@ -250,127 +387,483 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity {
@Override
public IFluidTank getFluidTankFillable(byte aSide, FluidStack aFluidToFill) {
if (!isLiquidInput(aSide)) return null;
- for (FluidTankGT tankGT : mTanksInput) if (tankGT.contains(aFluidToFill)) return tankGT;
+ for (FluidTankGT tankGT : inputTanks) 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;
+ for (FluidTankGT fluidTankGT : inputTanks) if (fluidTankGT.isEmpty()) return fluidTankGT;
return null;
}
@Override
protected IFluidTank getFluidTankDrainable(byte aSide, FluidStack aFluidToDrain) {
if (!isLiquidOutput(aSide)) return null;
- for (FluidTankGT fluidTankGT : mTanksOutput)
+ for (FluidTankGT fluidTankGT : outputTanks)
if (aFluidToDrain == null ? fluidTankGT.has() : fluidTankGT.contains(aFluidToDrain)) return fluidTankGT;
return null;
}
/*
- * Energy
+ * Inventory
*/
@Override
- public boolean isEnetInput() {
- return true;
+ public boolean hasInventoryBeenModified() {
+ // True if the input inventory has changed
+ return hasInventoryChanged;
}
- @Override
- public boolean isEnetOutput() {
- return true;
+ public void markOutputInventoryBeenModified() {
+ outputInventoryChanged = true;
}
- @Override
- public boolean isUniversalEnergyStored(long aEnergyAmount) {
- return getUniversalEnergyStored() >= aEnergyAmount;
+ public boolean hasOutputInventoryBeenModified() {
+ // True if the output inventory has changed
+ return outputInventoryChanged;
}
- @Override
- public long getUniversalEnergyStored() {
- return mStoredEnergy;
+ public void markInputInventoryBeenModified() {
+ hasInventoryChanged = true;
}
@Override
- public long getUniversalEnergyCapacity() {
- return 0;
+ public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
+ return false;
}
@Override
- public long getOutputAmperage() {
- return 1;
+ public int getInventoryStackLimit() {
+ return 64;
}
+ // #region Machine
+
@Override
- public long getOutputVoltage() {
- return 1;
+ public void onPostTick(long tick, boolean isServerSide) {
+ if (isServerSide) {
+ runMachine(tick);
+ } else {
+ doActivitySound(getActivitySoundLoop());
+ }
}
- @Override
- public long getInputAmperage() {
- return 1;
+ /**
+ * Runs only on server side
+ *
+ * @param tick The current tick of the machine
+ */
+ protected void runMachine(long tick) {
+ if (acceptsFuel() && isActive()) {
+ if (!consumeFuel()) {
+ stopMachine();
+ return;
+ }
+ }
+
+ if (hasThingsToDo()) {
+ markDirty();
+ runningTick(tick);
+ } else {
+ if (tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled() || hasInventoryBeenModified()) {
+ if (isAllowedToWork()) {
+ wasEnabled = false;
+ if (checkRecipe()) {
+ setActive(true);
+ setSound(GregTechTileClientEvents.START_SOUND_LOOP, PROCESS_START_SOUND_INDEX);
+ updateSlots();
+ markDirty();
+ issueClientUpdate();
+ }
+ }
+ }
+ }
}
- @Override
- public long getInputVoltage() {
- return 1;
+ /**
+ * Runs only on server side
+ *
+ * @param tick The current tick of the machine
+ */
+ protected void runningTick(long tick) {
+ if (this instanceof PowerLogicHost) {
+ consumeEnergy();
+ }
+
+ if (maxProgressTime > 0 && ++progressTime >= maxProgressTime) {
+ progressTime = 0;
+ maxProgressTime = 0;
+ outputItems();
+ outputFluids();
+ if (isAllowedToWork()) {
+ if (!checkRecipe()) {
+ setActive(false);
+ issueClientUpdate();
+ }
+ }
+ updateSlots();
+ }
+
+ if (this instanceof PollutionLogicHost && tick % POLLUTION_TICK == 0) {
+ doPollution();
+ }
+ emitEnergy();
+ }
+
+ /**
+ * Runs only on server side
+ */
+ protected boolean checkRecipe() {
+ if (!(this instanceof ProcessingLogicHost)) {
+ return false;
+ }
+ ProcessingLogic logic = ((ProcessingLogicHost) this).getProcessingLogic();
+ logic.clear();
+ boolean result = logic.setInputItems(inputInventory.getStacks().toArray(new ItemStack[0]))
+ .setCurrentOutputItems(outputInventory.getStacks().toArray(new ItemStack[0])).process();
+ setDuration(logic.getDuration());
+ setEut(logic.getEut());
+ setItemOutputs(logic.getOutputItems());
+ setFluidOutputs(logic.getOutputFluids());
+ return result;
+ }
+
+ /**
+ * Runs only on server side
+ */
+ protected void doPollution() {
+ PollutionLogic logic = ((PollutionLogicHost) this).getPollutionLogic();
+
+ if (logic == null) {
+ return;
+ }
+
+ GT_Pollution.addPollution(getWorld(), getXCoord() >> 4, getZCoord() >> 4, logic.getPollutionAmount());
+ }
+
+ /**
+ * Runs only on server side
+ */
+ protected void emitEnergy() {}
+
+ /**
+ * Runs only on server side
+ */
+ protected void consumeEnergy() {
+ PowerLogic logic = ((PowerLogicHost) this).getPowerLogic(GT_Values.SIDE_UNKNOWN);
+
+ if (logic == null) {
+ return;
+ }
+
+ if (logic.removeEnergyUnsafe(eut)) {
+ stopMachine();
+ }
+ }
+
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ switch (aIndex) {
+ case PROCESS_START_SOUND_INDEX:
+ if (getProcessStartSound() != null)
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ break;
+ case INTERRUPT_SOUND_INDEX:
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ break;
+ }
+ }
+
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == PROCESS_START_SOUND_INDEX) {
+ if (getProcessStartSound() != null)
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ }
+
+ protected ResourceLocation getProcessStartSound() {
+ return null;
+ }
+
+ protected int getTimeBetweenProcessSounds() {
+ return 100;
}
- public boolean isEnergyInputSide(byte aSide) {
+ protected void doActivitySound(ResourceLocation activitySound) {
+ if (isActive() && activitySound != null) {
+ if (activitySoundLoop == null) {
+ activitySoundLoop = new GT_SoundLoop(activitySound, this, false, true);
+ Minecraft.getMinecraft().getSoundHandler().playSound(activitySoundLoop);
+ }
+ } else {
+ if (activitySoundLoop != null) {
+ activitySoundLoop = null;
+ }
+ }
+ }
+
+ protected ResourceLocation getActivitySoundLoop() {
+ return null;
+ }
+
+ protected void outputItems() {
+ if (itemsToOutput == null) {
+ return;
+ }
+ for (ItemStack item : itemsToOutput) {
+ int index = 0;
+ while (item != null && item.stackSize > 0 && index < outputInventory.getSlots()) {
+ item = outputInventory.insertItem(index++, item.copy(), false);
+ }
+ }
+ itemsToOutput = null;
+ }
+
+ protected void outputFluids() {
+ if (fluidsToOutput == null) {
+ return;
+ }
+ for (FluidStack fluid : fluidsToOutput) {
+ tryToFillTanks(fluid, outputTanks);
+ }
+ }
+
+ protected void tryToFillTanks(FluidStack fluid, FluidTankGT... tanks) {
+ for (FluidTankGT tank : tanks) {
+ if (tank.canFillAll(fluid)) {
+ tank.add(fluid.amount, fluid);
+ }
+ }
+ }
+
+ public long getProgress() {
+ return progressTime;
+ }
+
+ public long getMaxProgress() {
+ return maxProgressTime;
+ }
+
+ public boolean increaseProgress(int aProgressAmountInTicks) {
+ progressTime += aProgressAmountInTicks;
return true;
}
- public boolean isEnergyOutputSide(byte aSide) {
+ public boolean hasThingsToDo() {
+ return getMaxProgress() > 0;
+ }
+
+ public boolean hasWorkJustBeenEnabled() {
+ return wasEnabled;
+ }
+
+ public void enableWorking() {
+ wasEnabled = true;
+ canWork = true;
+ }
+
+ public void disableWorking() {
+ canWork = false;
+ }
+
+ public boolean wasShutdown() {
+ return powerShutDown;
+ }
+
+ public boolean isAllowedToWork() {
+ return canWork;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ protected boolean isElectric() {
+ return isElectric;
+ }
+
+ protected void setElectric(boolean isElectric) {
+ this.isElectric = isElectric;
+ }
+
+ protected boolean isSteam() {
+ return isSteam;
+ }
+
+ protected void setSteam(boolean isSteam) {
+ this.isSteam = isSteam;
+ }
+
+ protected boolean acceptsFuel() {
+ return acceptsFuel;
+ }
+
+ protected void setFuel(boolean acceptsFuel) {
+ this.acceptsFuel = acceptsFuel;
+ }
+
+ protected boolean isWireless() {
+ return isWireless;
+ }
+
+ protected void setWireless(boolean isWireless) {
+ this.isWireless = isWireless;
+ }
+
+ protected boolean drainEut(long eut) {
+ return decreaseStoredEnergyUnits(eut, false);
+ }
+
+ protected boolean generateEut(long eut) {
+ return increaseStoredEnergyUnits(eut, true);
+ }
+
+ protected boolean isGenerator() {
+ return false;
+ }
+
+ protected boolean consumeFuel() {
+ if (isActive() && burnTime <= 0) {
+ for (int i = 0; i < inputInventory.getSlots(); i++) {
+ if (inputInventory.getStackInSlot(i) != null) {
+ int checkBurnTime = TileEntityFurnace.getItemBurnTime(inputInventory.getStackInSlot(i)) / 10;
+ if (checkBurnTime <= 0) continue;
+ inputInventory.getStackInSlot(i).stackSize--;
+ burnTime = checkBurnTime;
+ totalBurnTime = checkBurnTime;
+ break;
+ }
+ }
+ updateSlots();
+ }
+
+ if (--burnTime < 0) {
+ burnTime = 0;
+ totalBurnTime = 0;
+ return false;
+ }
+
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 (!getCoverInfoAtSide(aSide).letsEnergyIn()) return false;
- if (isEnetInput()) return isEnergyInputSide(aSide);
+ protected void addDebugInfo(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ if (isElectric()) {
+ list.add(
+ "Energy: " + EnumChatFormatting.GOLD
+ + getUniversalEnergyStored()
+ + "/"
+ + getUniversalEnergyCapacity());
+ }
+
+ if (acceptsFuel()) {
+ list.add("Fuel: " + EnumChatFormatting.GOLD + burnTime + "/" + totalBurnTime);
}
- 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 (!getCoverInfoAtSide(aSide).letsEnergyOut()) return false;
- if (isEnetOutput()) return isEnergyOutputSide(aSide);
+ protected void stopMachine() {
+ progressTime = 0;
+ setActive(false);
+ disableWorking();
+ setSound(GregTechTileClientEvents.STOP_SOUND_LOOP, INTERRUPT_SOUND_INDEX);
+ issueClientUpdate();
+ }
+
+ protected void updateSlots() {
+ for (int i = 0; i < inputInventory.getSlots(); i++) {
+ ItemStack item = inputInventory.getStackInSlot(i);
+ if (item != null && item.stackSize <= 0) {
+ inputInventory.setStackInSlot(i, null);
+ }
}
- return false;
}
- /*
- * Inventory
+ /**
+ * Must always be a positive. If the multi generates Eu/t isGenerator() should be overridden to true
*/
+ protected void setEut(long eut) {
+ if (eut < 0) {
+ eut = -eut;
+ }
- @Override
- public boolean hasInventoryBeenModified() {
- // True if the input inventory has changed
- return mInventoryChanged;
+ this.eut = eut;
}
- public void markOutputInventoryBeenModified() {
- mOutputInventoryChanged = true;
+ protected void setDuration(long duration) {
+ if (duration < 0) {
+ duration = -duration;
+ }
+
+ maxProgressTime = duration;
}
- public boolean hasOutputInventoryBeenModified() {
- // True if the output inventory has changed
- return mOutputInventoryChanged;
+ @Override
+ public int getBooleans() {
+ int booleans = 0;
+ if (isActive()) {
+ booleans |= ACTIVE;
+ }
+ return booleans;
}
@Override
- public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
- return false;
+ public void setBooleans(int booleans) {
+ if ((booleans & ACTIVE) == ACTIVE) {
+ setActive(true);
+ }
+ }
+
+ protected boolean hasItemInput() {
+ return true;
+ }
+
+ protected boolean hasItemOutput() {
+ return true;
+ }
+
+ protected boolean hasFluidInput() {
+ return true;
+ }
+
+ protected boolean hasFluidOutput() {
+ return true;
+ }
+
+ protected void setItemOutputs(ItemStack... outputs) {
+ itemsToOutput = outputs;
+ }
+
+ protected void setFluidOutputs(FluidStack... outputs) {
+ fluidsToOutput = outputs;
}
@Override
- public int getInventoryStackLimit() {
- return 64;
+ public void setSound(byte soundEvent, int soundEventValue) {
+ this.soundEvent = soundEvent;
+ this.soundEventValue = soundEventValue;
+ if (isClientSide()) {
+ switch (soundEventValue) {
+ case PROCESS_START_SOUND_INDEX:
+ if (getProcessStartSound() != null) GT_Utility.doSoundAtClient(
+ getProcessStartSound(),
+ getTimeBetweenProcessSounds(),
+ 1.0F,
+ getXCoord(),
+ getYCoord(),
+ getZCoord());
+ break;
+ case INTERRUPT_SOUND_INDEX:
+ GT_Utility.doSoundAtClient(
+ SoundResource.IC2_MACHINES_INTERRUPT_ONE,
+ 100,
+ 1.0F,
+ getXCoord(),
+ getYCoord(),
+ getZCoord());
+ break;
+ }
+ }
}
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java
index 8eefc28a71..f5f36a7b0f 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java
@@ -15,12 +15,14 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
+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.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
@@ -36,20 +38,26 @@ import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.IAlignment;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
import com.gtnewhorizons.modularui.api.forge.ListItemHandler;
import com.gtnewhorizons.modularui.api.screen.*;
import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
import com.gtnewhorizons.modularui.common.widget.Scrollable;
@@ -61,48 +69,58 @@ import cpw.mods.fml.common.network.NetworkRegistry;
import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GT_Values.NBT;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.TextureSet;
+import gregtech.api.fluid.FluidTankGT;
import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.IDescribable;
-import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
import gregtech.api.multitileentity.MultiTileEntityContainer;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
-import gregtech.api.multitileentity.interfaces.IMultiBlockFluidHandler;
-import gregtech.api.multitileentity.interfaces.IMultiBlockInventory;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips;
import gregtech.api.multitileentity.machine.MultiTileBasicMachine;
-import gregtech.api.multitileentity.multiblock.casing.AdvancedCasing;
-import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade;
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.casings.upgrade.InventoryUpgrade;
-public abstract class MultiBlockController<T extends MultiBlockController<T>> extends MultiTileBasicMachine
- implements IAlignment, IConstructable, IMultiBlockController, IDescribable, IMachineProgress,
- IMultiBlockFluidHandler, IMultiBlockInventory, IMTE_AddToolTips {
+public abstract class MultiBlockController<T extends MultiBlockController<T>> extends MultiTileBasicMachine implements
+ IAlignment, IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable {
- private static final int TICKS_BETWEEN_RECIPE_CHECKS = 100;
private static final Map<Integer, GT_Multiblock_Tooltip_Builder> tooltip = new ConcurrentHashMap<>();
- private final List<AdvancedCasing> mUpgradeCasings = new ArrayList<AdvancedCasing>();
+ private final List<UpgradeCasing> upgradeCasings = new ArrayList<>();
+ private final List<FunctionalCasing> functionalCasings = new ArrayList<>();
protected BuildState buildState = new BuildState();
protected Map<String, String> multiBlockInputInventoryNames = new LinkedHashMap<>();
protected Map<String, String> multiBlockOutputInventoryNames = new LinkedHashMap<>();
+ protected Map<String, String> multiBlockInputInventoryToTankLink = new LinkedHashMap<>();
protected Map<String, IItemHandlerModifiable> multiBlockInputInventory = new LinkedHashMap<>();
protected Map<String, IItemHandlerModifiable> multiBlockOutputInventory = new LinkedHashMap<>();
- protected int mMaxProgressTime = 0;
- private int mProgressTime = 0;
- private boolean mStructureOkay = false, mStructureChanged = false;
- private boolean mWorks = true, mWorkUpdate = false, mWasShutdown = false, mActive = false, mSeparateInputs = true;
- private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT;
- private IAlignmentLimits mLimits = getInitialAlignmentLimits();
- private ItemStack[] mItemsToOutput;
- private String mInventory;
+ protected Map<String, String> multiBlockInputTankNames = new LinkedHashMap<>();
+ protected Map<String, String> multiBlockOutputTankNames = new LinkedHashMap<>();
+ protected Map<String, FluidTankGT> multiBlockInputTank = new LinkedHashMap<>();
+ protected Map<String, FluidTankGT> multiBlockOutputTank = new LinkedHashMap<>();
+
+ private boolean structureOkay = false, structureChanged = false;
+ private ExtendedFacing extendedFacing = ExtendedFacing.DEFAULT;
+ private IAlignmentLimits limits = getInitialAlignmentLimits();
+ private String inventoryName;
+ private String tankName;
+ protected boolean separateInputs = false;
+ protected boolean voidExcess = false;
+ protected boolean batchMode = false;
+ protected boolean recipeLock = false;
// A list of sides
// Each side has a list of parts that have a cover that need to be ticked
@@ -143,117 +161,95 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
* <p>
* NOTE: If using `buildState` be sure to `startBuilding()` and either `endBuilding()` or `failBuilding()`
*/
- public abstract boolean checkMachine();
-
- /**
- * Checks the Recipe
- */
- public abstract boolean checkRecipe(ItemStack aStack);
+ public boolean checkMachine() {
+ double sum = 0;
+ for (FunctionalCasing casing : functionalCasings) {
+ sum += casing.getPartTier();
+ }
+ tier = (int) Math.floor(sum / functionalCasings.size());
+ // Maximum Energy stores will have a cap of 2 minute work time of current voltage
+ return tier > 0;
+ }
@Override
- public void writeMultiTileNBT(NBTTagCompound aNBT) {
- super.writeMultiTileNBT(aNBT);
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
- aNBT.setBoolean(NBT.STRUCTURE_OK, mStructureOkay);
- aNBT.setByte(NBT.ROTATION, (byte) mExtendedFacing.getRotation().getIndex());
- aNBT.setByte(NBT.FLIP, (byte) mExtendedFacing.getFlip().getIndex());
+ nbt.setBoolean(NBT.STRUCTURE_OK, structureOkay);
+ nbt.setByte(NBT.ROTATION, (byte) extendedFacing.getRotation().getIndex());
+ nbt.setByte(NBT.FLIP, (byte) extendedFacing.getFlip().getIndex());
- saveUpgradeInventoriesToNBT(aNBT);
- saveItemsToOutput(aNBT);
+ saveUpgradeInventoriesToNBT(nbt);
}
- private void saveUpgradeInventoriesToNBT(NBTTagCompound aNBT) {
- final NBTTagList tListInputInvs = new NBTTagList();
- multiBlockInputInventory.forEach((tID, tInv) -> {
- if (tID.equals("controller")) {} else {
+ private void saveUpgradeInventoriesToNBT(NBTTagCompound nbt) {
+ final NBTTagList inputInvList = new NBTTagList();
+ multiBlockInputInventory.forEach((id, inv) -> {
+ if (!id.equals("controller")) {
final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, tID);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockInputInventoryNames.get(tID));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, tInv.getSlots());
- writeInventory(tTag, tInv, NBT.INV_INPUT_LIST);
- tListInputInvs.appendTag(tTag);
+ tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
+ tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockInputInventoryNames.get(id));
+ tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
+ writeInventory(tTag, inv, NBT.INV_INPUT_LIST);
+ inputInvList.appendTag(tTag);
}
});
- final NBTTagList tListOutputInvs = new NBTTagList();
- multiBlockOutputInventory.forEach((tID, tInv) -> {
- if (tID.equals("controller")) {} else {
+ final NBTTagList outputInvList = new NBTTagList();
+ multiBlockOutputInventory.forEach((id, inv) -> {
+ if (!id.equals("controller")) {
final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, tID);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockOutputInventoryNames.get(tID));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, tInv.getSlots());
- writeInventory(tTag, tInv, NBT.INV_OUTPUT_LIST);
- tListOutputInvs.appendTag(tTag);
+ tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
+ tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockOutputInventoryNames.get(id));
+ tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
+ writeInventory(tTag, inv, NBT.INV_OUTPUT_LIST);
+ outputInvList.appendTag(tTag);
}
});
- aNBT.setTag(NBT.UPGRADE_INVENTORIES_INPUT, tListInputInvs);
- aNBT.setTag(NBT.UPGRADE_INVENTORIES_OUTPUT, tListOutputInvs);
- }
-
- private void saveItemsToOutput(NBTTagCompound aNBT) {
- final NBTTagList tList = new NBTTagList();
- for (int tSlot = 0; tSlot < mItemsToOutput.length; tSlot++) {
- final ItemStack tStack = mItemsToOutput[tSlot];
- if (tStack != null) {
- final NBTTagCompound tag = new NBTTagCompound();
- tag.setByte("s", (byte) tSlot);
- tStack.writeToNBT(tag);
- tList.appendTag(tag);
- }
- }
- aNBT.setTag(NBT.ITEM_OUT, tList);
+ nbt.setTag(NBT.UPGRADE_INVENTORIES_INPUT, inputInvList);
+ nbt.setTag(NBT.UPGRADE_INVENTORIES_OUTPUT, outputInvList);
}
@Override
- public void readMultiTileNBT(NBTTagCompound aNBT) {
- super.readMultiTileNBT(aNBT);
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
// Multiblock inventories are a collection of inventories. The first inventory is the default internal
// inventory, and the others are added by inventory extending blocks.
- if (mInputInventory != null) multiBlockInputInventory.put("controller", mInputInventory);
- if (mOutputInventory != null) multiBlockOutputInventory.put("controller", mOutputInventory);
+ if (inputInventory != null) multiBlockInputInventory.put("controller", inputInventory);
+ if (outputInventory != null) multiBlockOutputInventory.put("controller", outputInventory);
- mStructureOkay = aNBT.getBoolean(NBT.STRUCTURE_OK);
- mExtendedFacing = ExtendedFacing.of(
+ structureOkay = nbt.getBoolean(NBT.STRUCTURE_OK);
+ extendedFacing = ExtendedFacing.of(
ForgeDirection.getOrientation(getFrontFacing()),
- Rotation.byIndex(aNBT.getByte(NBT.ROTATION)),
- Flip.byIndex(aNBT.getByte(NBT.FLIP)));
-
- loadUpgradeInventoriesFromNBT(aNBT);
- loadItemsToOutput(aNBT);
- }
-
- private void loadUpgradeInventoriesFromNBT(NBTTagCompound aNBT) {
- final NBTTagList tListInput = aNBT.getTagList(NBT.UPGRADE_INVENTORIES_INPUT, 10);
- for (int i = 0; i < tListInput.tagCount(); i++) {
- final NBTTagCompound tNBT = tListInput.getCompoundTagAt(i);
- String invUUID = tNBT.getString(NBT.UPGRADE_INVENTORY_UUID);
- String invName = tNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
- int tInvSize = tNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- IItemHandlerModifiable tInv = new ItemStackHandler(tInvSize);
- loadInventory(tNBT, tInv, NBT.INV_INPUT_LIST);
- multiBlockInputInventory.put(invUUID, tInv);
+ Rotation.byIndex(nbt.getByte(NBT.ROTATION)),
+ Flip.byIndex(nbt.getByte(NBT.FLIP)));
+
+ loadUpgradeInventoriesFromNBT(nbt);
+ }
+
+ private void loadUpgradeInventoriesFromNBT(NBTTagCompound nbt) {
+ final NBTTagList listInputInventories = nbt.getTagList(NBT.UPGRADE_INVENTORIES_INPUT, 10);
+ for (int i = 0; i < listInputInventories.tagCount(); i++) {
+ final NBTTagCompound nbtInv = listInputInventories.getCompoundTagAt(i);
+ String invUUID = nbtInv.getString(NBT.UPGRADE_INVENTORY_UUID);
+ String invName = nbtInv.getString(NBT.UPGRADE_INVENTORY_NAME);
+ int invSize = nbtInv.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
+ IItemHandlerModifiable inv = new ItemStackHandler(invSize);
+ loadInventory(nbtInv, inv, NBT.INV_INPUT_LIST);
+ multiBlockInputInventory.put(invUUID, inv);
multiBlockInputInventoryNames.put(invUUID, invName);
}
- final NBTTagList tListOutput = aNBT.getTagList(NBT.UPGRADE_INVENTORIES_OUTPUT, 10);
- for (int i = 0; i < tListOutput.tagCount(); i++) {
- final NBTTagCompound tNBT = tListOutput.getCompoundTagAt(i);
- String invUUID = tNBT.getString(NBT.UPGRADE_INVENTORY_UUID);
- String invName = tNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
- int tInvSize = tNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- IItemHandlerModifiable tInv = new ItemStackHandler(tInvSize);
- loadInventory(tNBT, tInv, NBT.INV_OUTPUT_LIST);
- multiBlockOutputInventory.put(invUUID, tInv);
- multiBlockOutputInventoryNames.put(invUUID, invName);
- }
- }
- private void loadItemsToOutput(NBTTagCompound aNBT) {
- final NBTTagList tList = aNBT.getTagList(NBT.ITEM_OUT, 10);
- mItemsToOutput = new ItemStack[tList.tagCount()];
- for (int i = 0; i < tList.tagCount(); i++) {
- final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
- final int tSlot = tNBT.getByte("s");
- if (tSlot >= 0 && tSlot < mItemsToOutput.length) mItemsToOutput[tSlot] = GT_Utility.loadItem(tNBT);
+ final NBTTagList listOutputInventories = nbt.getTagList(NBT.UPGRADE_INVENTORIES_OUTPUT, 10);
+ for (int i = 0; i < listOutputInventories.tagCount(); i++) {
+ final NBTTagCompound nbtInv = listOutputInventories.getCompoundTagAt(i);
+ String invUUID = nbtInv.getString(NBT.UPGRADE_INVENTORY_UUID);
+ String invName = nbtInv.getString(NBT.UPGRADE_INVENTORY_NAME);
+ int invSize = nbtInv.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
+ IItemHandlerModifiable inv = new ItemStackHandler(invSize);
+ loadInventory(nbtInv, inv, NBT.INV_OUTPUT_LIST);
+ multiBlockOutputInventory.put(invUUID, inv);
+ multiBlockOutputInventoryNames.put(invUUID, invName);
}
}
@@ -273,6 +269,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
protected void addDebugInfo(EntityPlayer aPlayer, int aLogLevel, ArrayList<String> tList) {
+ super.addDebugInfo(aPlayer, aLogLevel, tList);
tList.add("Structure ok: " + checkStructure(false));
}
@@ -286,19 +283,19 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public boolean checkStructure(boolean aForceReset) {
- if (!isServerSide()) return mStructureOkay;
+ if (!isServerSide()) return structureOkay;
// Only trigger an update if forced (from onPostTick, generally), or if the structure has changed
- if ((mStructureChanged || aForceReset)) {
- mStructureOkay = checkMachine();
+ if ((structureChanged || aForceReset)) {
+ structureOkay = checkMachine();
}
- mStructureChanged = false;
- return mStructureOkay;
+ structureChanged = false;
+ return structureOkay;
}
@Override
public void onStructureChange() {
- mStructureChanged = true;
+ structureChanged = true;
}
public final boolean checkPiece(String piece, Vec3Impl offset) {
@@ -329,7 +326,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
horizontalOffset,
verticalOffset,
depthOffset,
- !mStructureOkay);
+ !structureOkay);
}
public final boolean buildPiece(String piece, ItemStack trigger, boolean hintsOnly, Vec3Impl offset) {
@@ -353,6 +350,38 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
hintOnly);
}
+ protected final int survivalBuildPiece(String piece, ItemStack trigger, Vec3Impl offset, int elementBudget,
+ ISurvivalBuildEnvironment env, boolean check) {
+ return survivalBuildPiece(
+ piece,
+ trigger,
+ offset.get0(),
+ offset.get1(),
+ offset.get2(),
+ elementBudget,
+ env,
+ check);
+ }
+
+ protected final Integer survivalBuildPiece(String piece, ItemStack trigger, int horizontalOffset,
+ int verticalOffset, int depthOffset, int elementBudget, ISurvivalBuildEnvironment env, boolean check) {
+ return getCastedStructureDefinition().survivalBuild(
+ this,
+ trigger,
+ piece,
+ getWorld(),
+ getExtendedFacing(),
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementBudget,
+ env,
+ check);
+ }
+
@SuppressWarnings("unchecked")
private IStructureDefinition<MultiBlockController<T>> getCastedStructureDefinition() {
return (IStructureDefinition<MultiBlockController<T>>) getStructureDefinition();
@@ -360,16 +389,16 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public ExtendedFacing getExtendedFacing() {
- return mExtendedFacing;
+ return extendedFacing;
}
@Override
public void setExtendedFacing(ExtendedFacing newExtendedFacing) {
- if (mExtendedFacing != newExtendedFacing) {
+ if (extendedFacing != newExtendedFacing) {
onStructureChange();
- if (mStructureOkay) stopMachine();
- mExtendedFacing = newExtendedFacing;
- mStructureOkay = false;
+ if (structureOkay) stopMachine();
+ extendedFacing = newExtendedFacing;
+ structureOkay = false;
if (isServerSide()) {
StructureLibAPI.sendAlignment(
this,
@@ -423,9 +452,9 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
@Override
- public void onFirstTick(boolean aIsServerSide) {
- super.onFirstTick(aIsServerSide);
- if (aIsServerSide) {
+ public void onFirstTick(boolean isServerSide) {
+ super.onFirstTick(isServerSide);
+ if (isServerSide) {
checkStructure(true);
} else {
StructureLibAPI.queryAlignment(this);
@@ -451,57 +480,32 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
@Override
- public void onTick(long aTimer, boolean isServerSide) {
- // Tick all covers!
+ public void onTick(long timer, boolean isServerSide) {
if (!tickCovers()) {
return;
}
}
@Override
- public void onPostTick(long aTick, boolean aIsServerSide) {
- if (aIsServerSide) {
- if (aTick % 600 == 5) {
+ public void onPostTick(long tick, boolean isServerSide) {
+ if (isServerSide) {
+ if (tick % 600 == 5) {
clearSpecialLists();
// Recheck the structure every 30 seconds or so
if (!checkStructure(false)) checkStructure(true);
}
- if (mStructureOkay) {
- runMachine(aTick);
+ if (structureOkay) {
+ runMachine(tick);
} else {
stopMachine();
}
- }
- }
-
- protected void runMachine(long aTick) {
- if (mMaxProgressTime > 0) {
- markDirty();
- if (mMaxProgressTime > 0 && ++mProgressTime >= mMaxProgressTime) {
- mProgressTime = 0;
- mMaxProgressTime = 0;
- outputItems();
- if (isAllowedToWork()) {
- checkRecipe();
- }
- }
} else {
- if (aTick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled() || hasInventoryBeenModified()) {
- if (isAllowedToWork()) {
- if (checkRecipe()) {
- markDirty();
- }
- }
- }
+ doActivitySound(getActivitySoundLoop());
}
}
- protected boolean checkRecipe() {
- return checkRecipe(null);
- }
-
protected void clearSpecialLists() {
- mUpgradeCasings.clear();
+ upgradeCasings.clear();
}
@Override
@@ -517,7 +521,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID) {
- return aSide != mFacing;
+ return aSide != facing;
}
@Override
@@ -527,22 +531,22 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public IAlignmentLimits getAlignmentLimits() {
- return mLimits;
+ return limits;
}
protected void setAlignmentLimits(IAlignmentLimits mLimits) {
- this.mLimits = mLimits;
+ this.limits = mLimits;
}
// IMachineProgress
@Override
- public int getProgress() {
- return mProgressTime;
+ public long getProgress() {
+ return progressTime;
}
@Override
- public int getMaxProgress() {
- return mMaxProgressTime;
+ public long getMaxProgress() {
+ return maxProgressTime;
}
@Override
@@ -568,57 +572,16 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
return getMaxProgress() > 0;
}
- @Override
- public boolean hasWorkJustBeenEnabled() {
- return mWorkUpdate;
- }
-
- @Override
- public void enableWorking() {
- if (!mWorks) mWorkUpdate = true;
- mWorks = true;
- mWasShutdown = false;
- }
-
- @Override
- public void disableWorking() {
- mWorks = false;
- }
-
- @Override
- public boolean isAllowedToWork() {
- return mWorks;
- }
-
- @Override
- public boolean isActive() {
- return mActive;
- }
-
- @Override
- public void setActive(boolean aActive) {
- mActive = aActive;
- }
-
public boolean isSeparateInputs() {
- return mSeparateInputs;
+ return separateInputs;
}
public void setSeparateInputs(boolean aSeparateInputs) {
- mSeparateInputs = aSeparateInputs;
- }
-
- @Override
- public boolean wasShutdown() {
- return mWasShutdown;
+ separateInputs = aSeparateInputs;
}
// End IMachineProgress
- public void stopMachine() {
- disableWorking();
- }
-
protected IAlignmentLimits getInitialAlignmentLimits() {
return (d, r, f) -> !f.isVerticallyFliped();
}
@@ -672,7 +635,13 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
}
- public <S> IStructureElement<S> addMultiTileCasing(int aRegistryID, int aBlockMeta, int aModes) {
+ public <S> IStructureElement<S> addMultiTileCasing(String registryName, int meta, int modes) {
+ MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName);
+ int registryID = Block.getIdFromBlock(registry.mBlock);
+ return addMultiTileCasing(registryID, meta, modes);
+ }
+
+ public <S> IStructureElement<S> addMultiTileCasing(int registryID, int meta, int modes) {
return new IStructureElement<S>() {
private final short[] DEFAULT = new short[] { 255, 255, 255, 0 };
@@ -684,17 +653,15 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
if (!(tileEntity instanceof MultiBlockPart)) return false;
final MultiBlockPart part = (MultiBlockPart) tileEntity;
- if (aRegistryID != part.getMultiTileEntityRegistryID() || aBlockMeta != part.getMultiTileEntityID())
+ if (registryID != part.getMultiTileEntityRegistryID() || meta != part.getMultiTileEntityID())
return false;
final IMultiBlockController tTarget = part.getTarget(false);
if (tTarget != null && tTarget != MultiBlockController.this) return false;
- part.setTarget(MultiBlockController.this, aModes);
+ part.setTarget(MultiBlockController.this, modes);
- if (part instanceof AdvancedCasing) {
- mUpgradeCasings.add((AdvancedCasing) part);
- }
+ registerSpecialCasings(part);
return true;
}
@@ -716,9 +683,9 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public boolean placeBlock(S t, World world, int x, int y, int z, ItemStack trigger) {
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(aRegistryID);
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(registryID);
final MultiTileEntityContainer tContainer = tRegistry
- .getNewTileEntityContainer(world, x, y, z, aBlockMeta, null);
+ .getNewTileEntityContainer(world, x, y, z, meta, null);
if (tContainer == null) {
GT_FML_LOGGER.error("NULL CONTAINER");
return false;
@@ -730,7 +697,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
if (world.setBlock(x, y, z, tContainer.mBlock, 15 - tContainer.mBlockMetaData, 2)) {
tContainer.setMultiTile(world, x, y, z);
- ((MultiBlockPart) te).setTarget(MultiBlockController.this, aModes);
+ ((MultiBlockPart) te).setTarget(MultiBlockController.this, modes);
registerSpecialCasings((MultiBlockPart) te);
}
@@ -744,9 +711,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
};
}
- protected void registerSpecialCasings(MultiBlockPart aPart) {
- if (aPart instanceof AdvancedCasing) {
- mUpgradeCasings.add((AdvancedCasing) aPart);
+ protected void registerSpecialCasings(MultiBlockPart part) {
+ if (part instanceof UpgradeCasing) {
+ upgradeCasings.add((UpgradeCasing) part);
+ }
+ if (part instanceof FunctionalCasing) {
+ functionalCasings.add((FunctionalCasing) part);
}
}
@@ -771,7 +741,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
final IFluidTank tTank = getFluidTankFillable(aPart, (byte) aDirection.ordinal(), aFluid);
if (tTank == null) return 0;
final int rFilledAmount = tTank.fill(aFluid, aDoFill);
- if (rFilledAmount > 0 && aDoFill) mInventoryChanged = true;
+ if (rFilledAmount > 0 && aDoFill) hasInventoryChanged = true;
return rFilledAmount;
}
@@ -823,108 +793,25 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart) {
- if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return mTanksInput;
- if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return mTanksOutput;
+ if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return inputTanks;
+ if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return outputTanks;
return GT_Values.emptyFluidTank;
}
- /**
- * Energy - MultiBlock related Energy behavior
- */
- @Override
- public boolean isUniversalEnergyStored(MultiBlockPart aPart, long aEnergyAmount) {
- return getUniversalEnergyStored(aPart) >= aEnergyAmount;
- }
-
- @Override
- public long getUniversalEnergyStored(MultiBlockPart aPart) {
- return Math.min(getUniversalEnergyStored(), getUniversalEnergyCapacity());
- }
-
+ // #region Energy
@Override
- public long getUniversalEnergyCapacity(MultiBlockPart aPart) {
- return getUniversalEnergyCapacity();
- }
-
- @Override
- public long getOutputAmperage(MultiBlockPart aPart) {
- return getOutputAmperage();
- }
-
- @Override
- public long getOutputVoltage(MultiBlockPart aPart) {
- return getOutputVoltage();
- }
-
- @Override
- public long getInputAmperage(MultiBlockPart aPart) {
- return getInputAmperage();
- }
-
- @Override
- public long getInputVoltage(MultiBlockPart aPart) {
- return getInputVoltage();
- }
-
- @Override
- public boolean decreaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooLittleEnergy) {
- return decreaseStoredEnergyUnits(aEnergy, aIgnoreTooLittleEnergy);
- }
-
- @Override
- public boolean increaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooMuchEnergy) {
- return increaseStoredEnergyUnits(aEnergy, aIgnoreTooMuchEnergy);
- }
-
- @Override
- public boolean drainEnergyUnits(MultiBlockPart aPart, byte aSide, long aVoltage, long aAmperage) {
- return drainEnergyUnits(aSide, aVoltage, aAmperage);
- }
-
- @Override
- public long injectEnergyUnits(MultiBlockPart aPart, byte aSide, long aVoltage, long aAmperage) {
- return injectEnergyUnits(aSide, aVoltage, aAmperage);
- }
-
- @Override
- public long getAverageElectricInput(MultiBlockPart aPart) {
- return getAverageElectricInput();
- }
-
- @Override
- public long getAverageElectricOutput(MultiBlockPart aPart) {
- return getAverageElectricOutput();
- }
-
- @Override
- public long getStoredEU(MultiBlockPart aPart) {
- return getStoredEU();
- }
-
- @Override
- public long getEUCapacity(MultiBlockPart aPart) {
- return getEUCapacity();
- }
-
- @Override
- public boolean inputEnergyFrom(MultiBlockPart aPart, byte aSide) {
- if (aSide == GT_Values.SIDE_UNKNOWN) return true;
- if (aSide >= 0 && aSide < 6) {
- if (isInvalid()) return false;
- if (isEnetInput()) return isEnergyInputSide(aSide);
+ public PowerLogic getPowerLogic(IMultiBlockPart part, byte side) {
+ if (!(this instanceof PowerLogicHost)) {
+ return null;
}
- return false;
- }
- @Override
- public boolean outputsEnergyTo(MultiBlockPart aPart, byte aSide) {
- if (aSide == GT_Values.SIDE_UNKNOWN) return true;
- if (aSide >= 0 && aSide < 6) {
- if (isInvalid()) return false;
- if (isEnetOutput()) return isEnergyOutputSide(aSide);
+ if (part.getFrontFacing() != side) {
+ return null;
}
- return false;
+
+ return ((PowerLogicHost) this).getPowerLogic(side);
}
+ // #endregion Energy
/**
* Item - MultiBlock related Item behaviour.
@@ -985,7 +872,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart) {
if (isServerSide()) {
- for (AdvancedCasing tPart : mUpgradeCasings) {
+ for (UpgradeCasing tPart : upgradeCasings) {
if (!(tPart instanceof InventoryUpgrade)) continue;
tPart.issueClientUpdate();
}
@@ -1087,7 +974,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
if (tInv == null) return false;
final int tSlot = tInv.getRight();
- final IItemHandlerModifiable inv = tInv.getLeft();;
+ final IItemHandlerModifiable inv = tInv.getLeft();
return inv.getStackInSlot(tSlot) != null; // && allowPullStack(getBaseMetaTileEntity(), aIndex, (byte) aSide,
// aStack);
@@ -1243,33 +1130,115 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
return getInventoriesForInput().getStacks().toArray(new ItemStack[0]);
}
+ protected ItemStack[] getAllOutputItems() {
+ return getInventoriesForOutput().getStacks().toArray(new ItemStack[0]);
+ }
+
protected Iterable<Pair<ItemStack[], String>> getItemInputsForEachInventory() {
return multiBlockInputInventory.entrySet().stream()
.map((entry) -> Pair.of(entry.getValue().getStacks().toArray(new ItemStack[0]), entry.getKey()))
.collect(Collectors.toList());
}
- protected void setItemOutputs(ItemStack[] aItemOutputs, String aInventory) {
- mItemsToOutput = aItemOutputs;
- mInventory = aInventory;
+ protected void setItemOutputs(String inventory, ItemStack... itemOutputs) {
+ itemsToOutput = itemOutputs;
+ inventoryName = inventory;
}
- private void outputItems() {
- int index = 0;
- if (mItemsToOutput == null) {
+ @Override
+ protected void setItemOutputs(ItemStack... outputs) {
+ super.setItemOutputs(outputs);
+ inventoryName = null;
+ }
+
+ @Override
+ protected void outputItems() {
+ if (itemsToOutput == null) {
return;
}
- if (mInventory != null) {
- for (ItemStack tItem : mItemsToOutput) {
- multiBlockOutputInventory.getOrDefault(mInventory, getInventoriesForOutput())
- .insertItem(index++, tItem.copy(), false);
- }
+
+ IItemHandlerModifiable inv;
+ if (inventoryName != null) {
+ inv = multiBlockOutputInventory.getOrDefault(inventoryName, getInventoriesForOutput());
} else {
- for (ItemStack tItem : mItemsToOutput) {
- getInventoriesForOutput().insertItem(index++, tItem.copy(), false);
+ inv = getInventoriesForOutput();
+ }
+ for (ItemStack item : itemsToOutput) {
+ int index = 0;
+ while (item != null && item.stackSize > 0 && index < inv.getSlots()) {
+ item = inv.insertItem(index++, item.copy(), false);
+ }
+ }
+ itemsToOutput = null;
+ }
+
+ protected void setFluidOutputs(String tank, FluidStack... fluidOuputs) {
+ fluidsToOutput = fluidOuputs;
+ tankName = tank;
+ }
+
+ @Override
+ protected void setFluidOutputs(FluidStack... outputs) {
+ super.setFluidOutputs(outputs);
+ tankName = null;
+ }
+
+ @Override
+ protected void outputFluids() {
+ if (fluidsToOutput == null) {
+ return;
+ }
+
+ List<FluidTankGT> tanks = new ArrayList<>(multiBlockOutputTank.values());
+ for (FluidStack fluid : fluidsToOutput) {
+ int index = 0;
+ while (fluid != null && fluid.amount > 0 && index < tanks.size()) {
+ int filled = tanks.get(index++).fill(fluid, true);
+ fluid.amount -= filled;
+ }
+ }
+ }
+
+ @Override
+ protected void updateSlots() {
+ IItemHandlerModifiable inv = getInventoriesForInput();
+ for (int i = 0; i < inv.getSlots(); i++) {
+ if (inv.getStackInSlot(i).stackSize <= 0) {
+ inv.setStackInSlot(i, null);
}
}
- mItemsToOutput = null;
+ }
+
+ @Override
+ protected boolean checkRecipe() {
+ if (!(this instanceof ProcessingLogicHost)) {
+ return false;
+ }
+ ProcessingLogic logic = ((ProcessingLogicHost) this).getProcessingLogic();
+ logic.clear();
+ boolean result = false;
+ if (isSeparateInputs()) {
+ for (Pair<ItemStack[], String> inventory : getItemInputsForEachInventory()) {
+ IItemHandlerModifiable outputInventory = multiBlockOutputInventory
+ .getOrDefault(inventory.getLeft(), null);
+ result = logic.setInputItems(inventory.getLeft())
+ .setCurrentOutputItems(
+ outputInventory != null ? outputInventory.getStacks().toArray(new ItemStack[0]) : null)
+ .process();
+ if (result) {
+ inventoryName = inventory.getRight();
+ break;
+ }
+ logic.clear();
+ }
+ } else {
+ result = logic.setInputItems(getAllItemInputs()).setCurrentOutputItems(getAllOutputItems()).process();
+ }
+ setDuration(logic.getDuration());
+ setEut(logic.getEut());
+ setItemOutputs(logic.getOutputItems());
+ setFluidOutputs(logic.getOutputFluids());
+ return result;
}
/*
@@ -1283,7 +1252,19 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
@Override
public ModularWindow createWindow(UIBuildContext buildContext) {
System.out.println("MultiBlockController::createWindow");
- return super.createWindow(buildContext);
+ if (!useModularUI()) return null;
+
+ buildContext.setValidator(getValidator());
+ final ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight());
+ builder.setBackground(getGUITextureSet().getMainBackground());
+ builder.setGuiTint(getGUIColorization());
+ if (doesBindPlayerInventory()) {
+ bindPlayerInventoryUI(builder, buildContext);
+ }
+ addUIWidgets(builder, buildContext);
+ addTitleToUI(builder);
+ addCoverTabs(builder, buildContext);
+ return builder.build();
}
@Override
@@ -1297,88 +1278,135 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
@Override
- public void addGregTechLogo(ModularWindow.Builder builder) {
- builder.widget(
- new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()).setSize(17, 17).setPos(148, 60));
+ public int getGUIHeight() {
+ return 192;
+ }
+
+ protected Widget getGregTechLogo() {
+ return new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo()).setSize(17, 17);
}
@Override
public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
if (isServerSide()) {
- for (AdvancedCasing tPart : mUpgradeCasings) {
+ for (UpgradeCasing tPart : upgradeCasings) {
if (!(tPart instanceof InventoryUpgrade)) continue;
tPart.issueClientUpdate();
}
}
- builder.widget(
- new TabContainer()
- .setButtonSize(
- 20,
- 24)
- .addTabButton(
- new TabButton(0)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f))
- .addTooltip(getLocalName()).setPos(0, -20))
- .addTabButton(
- new TabButton(1)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f))
- .setPos(20, -20))
- .addTabButton(
- new TabButton(2)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f))
- .setPos(40, -20))
- .addTabButton(
- new TabButton(3)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f))
- .setPos(60, -20))
- .addTabButton(
- new TabButton(4)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f))
- .setPos(80, -20))
- .addPage(
- new MultiChildWidget().addChild(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
- .setPos(7, 4).setSize(160, 75)))
- .addPage(new MultiChildWidget().addChild(getItemInventoryInputGUI()))
- .addPage(new MultiChildWidget().addChild(getItemInventoryOutputGUI()))
- .addPage(new MultiChildWidget().addChild(getFluidInventoryInputGUI()))
- .addPage(new MultiChildWidget().addChild(getFluidInventoryOutputGUI())))
- .widget(new ItemDrawable(getStackForm(1)).asWidget().setSize(16, 16).setPos(2, -16))
- .widget(new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ITEM_IN).setSize(16, 16).setPos(22, -16))
- .widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ITEM_OUT).setSize(16, 16)
- .setPos(42, -16))
- .widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_FLUID_IN).setSize(16, 16)
- .setPos(62, -16))
- .widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_FLUID_OUT).setSize(16, 16)
- .setPos(82, -16));
+ int page = 0;
+ TabContainer tabs = new TabContainer().setButtonSize(20, 24);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ new ItemDrawable(getStackForm(1)).withFixedSize(16, 16).withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ new ItemDrawable(getStackForm(1)).withFixedSize(16, 16).withOffset(2, 4))
+ .addTooltip(getLocalName()).setPos(20 * (page - 1), -20))
+ .addPage(createMainPage().setSize(getGUIWidth(), getGUIHeight()));
+ if (hasItemInput()) {
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16).withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16).withOffset(2, 4))
+ .setPos(20 * (page - 1), -20))
+ .addPage(
+ new MultiChildWidget().addChild(getItemInventoryInputGUI())
+ .addChild(getGregTechLogo().setPos(147, 86))
+ .setSize(getGUIWidth(), getGUIHeight()));
+ }
+
+ if (hasItemOutput()) {
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16).withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16).withOffset(2, 4))
+ .setPos(20 * (page - 1), -20))
+ .addPage(
+ new MultiChildWidget().addChild(getItemInventoryOutputGUI())
+ .addChild(getGregTechLogo().setPos(147, 86))
+ .setSize(getGUIWidth(), getGUIHeight()));
+ }
+
+ if (hasFluidInput()) {
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16).withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16).withOffset(2, 4))
+ .setPos(20 * (page - 1), -20))
+ .addPage(
+ new MultiChildWidget().addChild(getFluidInventoryInputGUI())
+ .addChild(getGregTechLogo().setPos(147, 86))
+ .setSize(getGUIWidth(), getGUIHeight()));
+ }
+
+ if (hasFluidOutput()) {
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16).withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16).withOffset(2, 4))
+ .setPos(20 * (page - 1), -20))
+ .addPage(
+ new MultiChildWidget().addChild(getFluidInventoryOutputGUI())
+ .addChild(getGregTechLogo().setPos(147, 86))
+ .setSize(getGUIWidth(), getGUIHeight()));
+ }
+ builder.widget(tabs);
+ }
+
+ protected MultiChildWidget createMainPage() {
+ MultiChildWidget page = new MultiChildWidget();
+ page.addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK).setPos(7, 4).setSize(160, 75))
+ .addChild(createButtons());
+ return page;
+ }
+
+ protected MultiChildWidget createButtons() {
+ MultiChildWidget buttons = new MultiChildWidget();
+ buttons.setSize(16, 167).setPos(7, 86);
+ buttons.addChild(createPowerSwitchButton())
+ .addChild(new FakeSyncWidget.BooleanSyncer(() -> isAllowedToWork(), val -> {
+ if (val) enableWorking();
+ else disableWorking();
+ })).addChild(createVoidExcessButton())
+ .addChild(new FakeSyncWidget.BooleanSyncer(() -> voidExcess, val -> voidExcess = val))
+ .addChild(createInputSeparationButton())
+ .addChild(new FakeSyncWidget.BooleanSyncer(() -> separateInputs, val -> separateInputs = val))
+ .addChild(createBatchModeButton())
+ .addChild(new FakeSyncWidget.BooleanSyncer(() -> batchMode, val -> batchMode = val))
+ .addChild(createLockToSingleRecipeButton())
+ .addChild(new FakeSyncWidget.BooleanSyncer(() -> recipeLock, val -> recipeLock = val));
+
+ return buttons;
}
protected Widget getItemInventoryInputGUI() {
@@ -1391,7 +1419,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
.widget(new SlotWidget(inv, rows * 4 + column).setPos(column * 18, rows * 18).setSize(18, 18));
}
}
- return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7);
+ return scrollable.setSize(18 * 4 + 4, 18 * 5).setPos(52, 7);
}
protected Widget getItemInventoryOutputGUI() {
@@ -1404,7 +1432,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
.widget(new SlotWidget(inv, rows * 4 + column).setPos(column * 18, rows * 18).setSize(18, 18));
}
}
- return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7);
+ return scrollable.setSize(18 * 4 + 4, 18 * 5).setPos(52, 7);
}
protected IItemHandlerModifiable getInventoriesForInput() {
@@ -1416,7 +1444,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
protected Widget getFluidInventoryInputGUI() {
- final IFluidTank[] tanks = mTanksInput;
+ final IFluidTank[] tanks = inputTanks;
final Scrollable scrollable = new Scrollable().setVerticalScroll();
for (int rows = 0; rows * 4 < tanks.length; rows++) {
final int columnsToMake = Math.min(tanks.length - rows * 4, 4);
@@ -1429,7 +1457,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
}
protected Widget getFluidInventoryOutputGUI() {
- final IFluidTank[] tanks = mTanksOutput;
+ final IFluidTank[] tanks = outputTanks;
final Scrollable scrollable = new Scrollable().setVerticalScroll();
for (int rows = 0; rows * 4 < tanks.length; rows++) {
final int columnsToMake = Math.min(tanks.length - rows * 4, 4);
@@ -1439,6 +1467,174 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex
scrollable.widget(fluidSlot.setPos(column * 18, rows * 18).setSize(18, 18));
}
}
- return scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7);
+ return scrollable.setSize(18 * 4 + 4, 18 * 5).setPos(52, 7);
+ }
+
+ protected ButtonWidget createPowerSwitchButton() {
+ ButtonWidget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isAllowedToWork()) {
+ disableWorking();
+ } else {
+ enableWorking();
+ }
+ }).setPlayClickSound(true);
+ button.setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isAllowedToWork()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF);
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(144, 0).setSize(16, 16);
+ button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return button;
+ }
+
+ protected ButtonWidget createVoidExcessButton() {
+ ButtonWidget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isVoidExcessButtonEnabled()) {
+ voidExcess = !voidExcess;
+ }
+ }).setPlayClickSound(true);
+ button.setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isVoidExcessButtonEnabled()) {
+ if (isVoidExcessEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_OFF);
+ }
+ } else {
+ if (isVoidExcessEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ON_DISABLED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_OFF_DISABLED);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(54, 0).setSize(16, 16);
+ button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.void_excess"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return button;
+ }
+
+ protected boolean isVoidExcessEnabled() {
+ return voidExcess;
+ }
+
+ protected boolean isVoidExcessButtonEnabled() {
+ return true;
+ }
+
+ protected ButtonWidget createInputSeparationButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isInputSeparationButtonEnabled()) {
+ separateInputs = !separateInputs;
+ }
+ }).setPlayClickSound(true).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isInputSeparationButtonEnabled()) {
+ if (isInputSeparationEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF);
+ }
+ } else {
+ if (isInputSeparationEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(36, 0).setSize(16, 16);
+ button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return (ButtonWidget) button;
+ }
+
+ protected boolean isInputSeparationEnabled() {
+ return separateInputs;
+ }
+
+ protected boolean isInputSeparationButtonEnabled() {
+ return true;
+ }
+
+ protected ButtonWidget createBatchModeButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isBatchModeButtonEnabled()) {
+ batchMode = !batchMode;
+ }
+ }).setPlayClickSound(true).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (isBatchModeButtonEnabled()) {
+ if (isBatchModeEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF);
+ }
+ } else {
+ if (isBatchModeEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(18, 0).setSize(16, 16);
+ button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return (ButtonWidget) button;
+ }
+
+ protected boolean isBatchModeButtonEnabled() {
+ return true;
+ }
+
+ protected boolean isBatchModeEnabled() {
+ return batchMode;
+ }
+
+ protected ButtonWidget createLockToSingleRecipeButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (supportsSingleRecipeLocking()) {
+ recipeLock = !recipeLock;
+ }
+ }).setPlayClickSound(true).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (supportsSingleRecipeLocking()) {
+ if (isRecipeLockingEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED);
+ }
+ } else {
+ if (isRecipeLockingEnabled()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED);
+ }
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(0, 0).setSize(16, 16);
+ button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return (ButtonWidget) button;
+ }
+
+ protected boolean supportsSingleRecipeLocking() {
+ return false;
+ }
+
+ protected boolean isRecipeLockingEnabled() {
+ return recipeLock;
}
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
index 1c6c5a0e07..9d40732b74 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
@@ -50,18 +50,21 @@ import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Textures;
import gregtech.api.interfaces.IIconContainer;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
-import gregtech.api.multitileentity.base.BaseNontickableMultiTileEntity;
+import gregtech.api.multitileentity.base.NonTickableMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
import gregtech.common.covers.CoverInfo;
-public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
- implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes {
+public abstract class MultiBlockPart extends NonTickableMultiTileEntity
+ implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes, PowerLogicHost {
public static final int NOTHING = 0, ENERGY_IN = B[0], ENERGY_OUT = B[1], FLUID_IN = B[2], FLUID_OUT = B[3],
ITEM_IN = B[4], ITEM_OUT = B[5];
@@ -70,7 +73,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
Arrays.asList(NOTHING, ENERGY_IN, ENERGY_OUT, FLUID_IN, FLUID_OUT, ITEM_IN, ITEM_OUT));
protected ChunkCoordinates mTargetPos = null;
- protected IMultiBlockController mTarget = null;
+ protected IMultiBlockController target = null;
protected int mAllowedModes = NOTHING; // BITMASK - Modes allowed for this part
protected byte mMode = 0; // Mode selected for this part
@@ -99,10 +102,10 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
}
public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
- mTarget = aTarget;
- mTargetPos = (mTarget == null ? null : mTarget.getCoords());
+ target = aTarget;
+ mTargetPos = (target == null ? null : target.getCoords());
mAllowedModes = aAllowedModes;
- if (mTarget != null) registerCovers(mTarget);
+ if (target != null) registerCovers(target);
}
@Override
@@ -125,21 +128,22 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
public IMultiBlockController getTarget(boolean aCheckValidity) {
if (mTargetPos == null) return null;
- if (mTarget == null || mTarget.isDead()) {
+ if (target == null || target.isDead()) {
if (worldObj.blockExists(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ)) {
final TileEntity te = worldObj.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ);
if (te instanceof IMultiBlockController) {
- mTarget = (IMultiBlockController) te;
+ target = (IMultiBlockController) te;
// Register our covers with the controller
- registerCovers(mTarget);
+ registerCovers(target);
} else {
mTargetPos = null;
}
}
}
if (aCheckValidity) {
- return mTarget != null && mTarget.checkStructure(false) ? mTarget : null;
- } else return mTarget;
+ return target != null && target.checkStructure(false) ? target : null;
+ }
+ return target;
}
public void registerCovers(IMultiBlockController controller) {
@@ -219,6 +223,18 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
}
@Override
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
+ final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
+ packet.setModes(getMode(), getAllowedModes());
+ if (getTargetPos() != null) {
+ final ChunkCoordinates aTarget = getTargetPos();
+ packet.setTargetPos(aTarget.posX, (short) aTarget.posY, aTarget.posZ);
+ }
+ packet.setInventoryIndex(getLockedInventoryIndex());
+ return packet;
+ }
+
+ @Override
public void setLockedInventoryIndex(int aIndex) {
mLockedInventoryIndex = aIndex;
}
@@ -305,7 +321,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
public void loadTextureNBT(NBTTagCompound aNBT) {
// Loading the registry
final String textureName = aNBT.getString(NBT.TEXTURE);
- mTextures = new IIconContainer[] {
+ textures = new IIconContainer[] {
new Textures.BlockIcons.CustomIcon("multitileentity/multiblockparts/" + textureName + "/bottom"),
new Textures.BlockIcons.CustomIcon("multitileentity/multiblockparts/" + textureName + "/top"),
new Textures.BlockIcons.CustomIcon("multitileentity/multiblockparts/" + textureName + "/side"),
@@ -321,8 +337,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
// Loading an instance
final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry
.getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID());
- if (tCanonicalTileEntity instanceof MultiBlockPart)
- mTextures = ((MultiBlockPart) tCanonicalTileEntity).mTextures;
+ if (tCanonicalTileEntity instanceof MultiBlockPart) textures = ((MultiBlockPart) tCanonicalTileEntity).textures;
}
@Override
@@ -330,7 +345,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
// For normal parts - texture comes from BaseMTE; overlay based on current mode
// TODO(MTE) - For Advanced parts they might come from somewhere else
final ITexture baseTexture = TextureFactory.of(super.getTexture(aBlock, aSide, isActive, aRenderPass));
- if (mMode != 0 && aSide == mFacing) {
+ if (mMode != 0 && aSide == facing) {
if (mMode == getModeOrdinal(ITEM_IN)) return new ITexture[] { baseTexture,
TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) };
if (mMode == getModeOrdinal(ITEM_OUT)) return new ITexture[] { baseTexture,
@@ -418,7 +433,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
if (!modeSelected(FLUID_IN)) return 0;
final byte aSide = (byte) aDirection.ordinal();
if (aDirection != ForgeDirection.UNKNOWN
- && (aSide != mFacing || !coverLetsFluidIn(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
+ && (aSide != facing || !coverLetsFluidIn(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
return 0;
final IMultiBlockController controller = getTarget(true);
return controller == null ? 0 : controller.fill(this, aDirection, aFluidStack, aDoFill);
@@ -429,7 +444,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
if (!modeSelected(FLUID_OUT)) return null;
final byte aSide = (byte) aDirection.ordinal();
if (aDirection != ForgeDirection.UNKNOWN
- && (aSide != mFacing || !coverLetsFluidOut(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
+ && (aSide != facing || !coverLetsFluidOut(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
return null;
final IMultiBlockController controller = getTarget(true);
return controller == null ? null : controller.drain(this, aDirection, aFluidStack, aDoDrain);
@@ -443,7 +458,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
if (controller == null) return null;
final FluidStack aFluidStack = controller.getDrainableFluid(aSide);
if (aDirection != ForgeDirection.UNKNOWN
- && (aSide != mFacing || !coverLetsFluidOut(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
+ && (aSide != facing || !coverLetsFluidOut(aSide, aFluidStack == null ? null : aFluidStack.getFluid())))
return null;
return controller.drain(this, aDirection, aAmountToDrain, aDoDrain);
}
@@ -452,8 +467,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
public boolean canFill(ForgeDirection aDirection, Fluid aFluid) {
if (!modeSelected(FLUID_IN)) return false;
final byte aSide = (byte) aDirection.ordinal();
- if (aDirection != ForgeDirection.UNKNOWN && (aSide != mFacing || !coverLetsFluidIn(aSide, aFluid)))
- return false;
+ if (aDirection != ForgeDirection.UNKNOWN && (aSide != facing || !coverLetsFluidIn(aSide, aFluid))) return false;
final IMultiBlockController controller = getTarget(true);
return controller != null && controller.canFill(this, aDirection, aFluid);
}
@@ -462,7 +476,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
public boolean canDrain(ForgeDirection aDirection, Fluid aFluid) {
if (!modeSelected(FLUID_OUT)) return false;
final byte aSide = (byte) aDirection.ordinal();
- if (aDirection != ForgeDirection.UNKNOWN && (aSide != mFacing || !coverLetsFluidOut(aSide, aFluid)))
+ if (aDirection != ForgeDirection.UNKNOWN && (aSide != facing || !coverLetsFluidOut(aSide, aFluid)))
return false;
final IMultiBlockController controller = getTarget(true);
return controller != null && controller.canDrain(this, aDirection, aFluid);
@@ -471,7 +485,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection aDirection) {
final byte aSide = (byte) aDirection.ordinal();
- if (!modeSelected(FLUID_IN, FLUID_OUT) || (aSide != SIDE_UNKNOWN && aSide != mFacing))
+ if (!modeSelected(FLUID_IN, FLUID_OUT) || (aSide != SIDE_UNKNOWN && aSide != facing))
return GT_Values.emptyFluidTankInfo;
final IMultiBlockController controller = getTarget(true);
if (controller == null) return GT_Values.emptyFluidTankInfo;
@@ -485,145 +499,25 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
return GT_Values.emptyFluidTankInfo;
}
- /**
- * Energy - Depending on the part type - proxy to the multiblock controller, if we have one
- */
- @Override
- public boolean isEnetInput() {
- return modeSelected(ENERGY_IN);
- }
-
- @Override
- public boolean isEnetOutput() {
- return modeSelected(ENERGY_OUT);
- }
-
- @Override
- public boolean isUniversalEnergyStored(long aEnergyAmount) {
- if (!modeSelected(ENERGY_OUT, ENERGY_IN)) return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.isUniversalEnergyStored(this, aEnergyAmount);
- }
-
- @Override
- public long getUniversalEnergyStored() {
- if (!modeSelected(ENERGY_OUT, ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getUniversalEnergyStored(this) : 0;
- }
+ // #region Energy - Depending on the part type - proxy to the multiblock controller, if we have one
@Override
- public long getUniversalEnergyCapacity() {
- if (!modeSelected(ENERGY_OUT, ENERGY_IN)) return 0;
+ public PowerLogic getPowerLogic(byte side) {
final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getUniversalEnergyCapacity(this) : 0;
+ return controller.getPowerLogic(this, side);
}
@Override
- public long getOutputAmperage() {
- if (!modeSelected(ENERGY_OUT)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getOutputAmperage(this) : 0;
- }
-
- @Override
- public long getOutputVoltage() {
- if (!modeSelected(ENERGY_OUT)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getOutputVoltage(this) : 0;
- }
-
- @Override
- public long getInputAmperage() {
- if (!modeSelected(ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && hasMode(ENERGY_IN)) ? controller.getInputAmperage(this) : 0;
- }
-
- @Override
- public long getInputVoltage() {
- if (!modeSelected(ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && hasMode(ENERGY_IN)) ? controller.getInputVoltage(this) : 0;
- }
-
- @Override
- public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLittleEnergy) {
- if (!modeSelected(ENERGY_OUT)) return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && hasMode(ENERGY_OUT)
- && controller.decreaseStoredEnergyUnits(this, aEnergy, aIgnoreTooLittleEnergy);
- }
-
- @Override
- public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
- if (!modeSelected(ENERGY_IN)) return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && hasMode(ENERGY_IN)
- && controller.increaseStoredEnergyUnits(this, aEnergy, aIgnoreTooMuchEnergy);
- }
-
- @Override
- public boolean drainEnergyUnits(byte aSide, long aVoltage, long aAmperage) {
- if (!modeSelected(ENERGY_OUT) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsEnergyOut(aSide))))
- return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.drainEnergyUnits(this, aSide, aVoltage, aAmperage);
- }
-
- @Override
- public long injectEnergyUnits(byte aSide, long aVoltage, long aAmperage) {
- if (!modeSelected(ENERGY_IN) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsEnergyIn(aSide))))
- return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.injectEnergyUnits(this, aSide, aVoltage, aAmperage) : 0;
- }
-
- @Override
- public long getAverageElectricInput() {
- if (!modeSelected(ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getAverageElectricInput(this) : 0;
- }
-
- @Override
- public long getAverageElectricOutput() {
- if (!modeSelected(ENERGY_OUT)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getAverageElectricOutput(this) : 0;
- }
-
- @Override
- public long getStoredEU() {
- if (!modeSelected(ENERGY_OUT, ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getStoredEU(this) : 0;
- }
-
- @Override
- public long getEUCapacity() {
- if (!modeSelected(ENERGY_OUT, ENERGY_IN)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getEUCapacity(this) : 0;
- }
-
- @Override
- public boolean inputEnergyFrom(byte aSide) {
- if (!modeSelected(ENERGY_IN) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsEnergyIn(aSide))))
- return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.inputEnergyFrom(this, aSide);
+ public boolean isEnetInput() {
+ return modeSelected(ENERGY_IN);
}
@Override
- public boolean outputsEnergyTo(byte aSide) {
- if (!modeSelected(ENERGY_OUT) || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsEnergyOut(aSide))))
- return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.outputsEnergyTo(this, aSide);
+ public boolean isEnetOutput() {
+ return modeSelected(ENERGY_OUT);
}
- // End Energy
+ // #endregion
/**
* Inventory - Depending on the part type - proxy to the multiblock controller, if we have one
@@ -656,7 +550,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
@Override
public int[] getAccessibleSlotsFromSide(int aSide) {
- if (!modeSelected(ITEM_IN, ITEM_OUT) || (mFacing != SIDE_UNKNOWN && mFacing != aSide))
+ if (!modeSelected(ITEM_IN, ITEM_OUT) || (facing != SIDE_UNKNOWN && facing != aSide))
return GT_Values.emptyIntArray;
final IMultiBlockController controller = getTarget(true);
return controller != null ? controller.getAccessibleSlotsFromSide(this, (byte) aSide) : GT_Values.emptyIntArray;
@@ -665,7 +559,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
@Override
public boolean canInsertItem(int aSlot, ItemStack aStack, int aSide) {
if (!modeSelected(ITEM_IN, ITEM_OUT)
- || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsIn((byte) aSide, aSlot))))
+ || (facing != SIDE_UNKNOWN && (facing != aSide || !coverLetsItemsIn((byte) aSide, aSlot))))
return false;
final IMultiBlockController controller = getTarget(true);
return (controller != null && controller.canInsertItem(this, aSlot, aStack, (byte) aSide));
@@ -674,7 +568,7 @@ public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity
@Override
public boolean canExtractItem(int aSlot, ItemStack aStack, int aSide) {
if (!modeSelected(ITEM_IN, ITEM_OUT)
- || (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsOut((byte) aSide, aSlot))))
+ || (facing != SIDE_UNKNOWN && (facing != aSide || !coverLetsItemsOut((byte) aSide, aSlot))))
return false;
final IMultiBlockController controller = getTarget(true);
return (controller != null && controller.canExtractItem(this, aSlot, aStack, (byte) aSide));
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPowerController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPowerController.java
new file mode 100644
index 0000000000..0834c64b75
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPowerController.java
@@ -0,0 +1,44 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+
+public abstract class MultiBlockPowerController<T extends MultiBlockPowerController<T>> extends MultiBlockController<T>
+ implements PowerLogicHost {
+
+ public MultiBlockPowerController() {
+ super();
+ power = new PowerLogic().setType(PowerLogic.RECEIVER);
+ }
+
+ protected PowerLogic power;
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ power.writeToNBT(nbt);
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ power.loadFromNBT(nbt);
+ }
+
+ @Override
+ public PowerLogic getPowerLogic(byte side) {
+ return power;
+ }
+
+ @Override
+ public boolean checkMachine() {
+ boolean result = super.checkMachine();
+ power.setEnergyCapacity(GT_Values.V[tier] * 2 * 60 * 20);
+ power.setAmperage(2);
+ power.setMaxVoltage(GT_Values.V[tier]);
+ return result;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlock_Stackable.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlock_Stackable.java
index f40a993738..11d931433f 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlock_Stackable.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlock_Stackable.java
@@ -4,7 +4,7 @@ import net.minecraft.item.ItemStack;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
-public abstract class MultiBlock_Stackable<T extends MultiBlock_Stackable<T>> extends MultiBlockController<T> {
+public abstract class MultiBlock_Stackable<T extends MultiBlock_Stackable<T>> extends MultiBlockPowerController<T> {
protected static String STACKABLE_TOP = "STACKABLE_TOP";
protected static String STACKABLE_MIDDLE = "STACKABLE_MIDDLE";
@@ -103,6 +103,9 @@ public abstract class MultiBlock_Stackable<T extends MultiBlock_Stackable<T>> ex
if (stackCount < getMinStacks()) return buildState.failBuilding();
buildState.addOffset(getAfterLastStackOffset());
- return checkPiece(STACKABLE_TOP, buildState.stopBuilding());
+ if (!checkPiece(STACKABLE_TOP, buildState.stopBuilding())) {
+ return buildState.failBuilding();
+ }
+ return super.checkMachine();
}
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
new file mode 100644
index 0000000000..a391f503dc
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
@@ -0,0 +1,107 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+
+public class WallShareablePart extends MultiBlockPart {
+
+ protected List<ChunkCoordinates> targetPositions = new ArrayList<>();
+ protected List<IMultiBlockController> targets = new ArrayList<>();
+
+ @Override
+ public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
+ if (targets.size() > 1 || targetPositions.size() > 1) {
+ mAllowedModes = 0;
+ mMode = 0;
+ } else {
+ mAllowedModes = aAllowedModes;
+ }
+
+ if (aTarget == null) {
+ return;
+ }
+
+ targets.add(aTarget);
+ targetPositions.add(aTarget.getCoords());
+ }
+
+ @Override
+ public String getLockedInventory() {
+ issueClientUpdate();
+ if (targets.size() > 1 || targetPositions.size() > 1) {
+ return null;
+ }
+
+ IMultiBlockController controller = getTarget(false);
+ if (!getNameOfInventoryFromIndex(controller, mLockedInventoryIndex).equals(mLockedInventory)) {
+ mLockedInventory = getNameOfInventoryFromIndex(controller, mLockedInventoryIndex);
+ if (mLockedInventory.equals("all")) {
+ mLockedInventory = "";
+ }
+ }
+ return mLockedInventory.equals("") ? null : mLockedInventory;
+ }
+
+ @Override
+ public IMultiBlockController getTarget(boolean aCheckValidity) {
+ if (targets.size() > 1 || targetPositions.size() > 1 || targets.size() <= 0 || targetPositions.size() <= 0) {
+ return null;
+ }
+
+ target = targets.get(0);
+ mTargetPos = targetPositions.get(0);
+ return super.getTarget(aCheckValidity);
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multiTileEntity.casing.wallSharable";
+ }
+
+ @Override
+ public boolean breakBlock() {
+ for (ChunkCoordinates coordinates : targetPositions) {
+ IMultiBlockController target = getTarget(coordinates, false);
+ if (target == null) {
+ continue;
+ }
+ target.onStructureChange();
+ }
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded() {
+ for (byte tSide : ALL_VALID_SIDES) {
+ final TileEntity te = getTileEntityAtSide(tSide);
+ if (te instanceof MultiBlockPart) {
+ final IMultiBlockController tController = ((MultiBlockPart) te).getTarget(false);
+ if (tController != null) tController.onStructureChange();
+ } else if (te instanceof IMultiBlockController) {
+ ((IMultiBlockController) te).onStructureChange();
+ }
+ }
+ }
+
+ public IMultiBlockController getTarget(ChunkCoordinates coordinates, boolean aCheckValidity) {
+ IMultiBlockController target = null;
+ if (coordinates == null) return null;
+ if (worldObj.blockExists(coordinates.posX, coordinates.posY, coordinates.posZ)) {
+ final TileEntity te = worldObj.getTileEntity(coordinates.posX, coordinates.posY, coordinates.posZ);
+ if (te instanceof IMultiBlockController) {
+ target = (IMultiBlockController) te;
+ }
+ }
+ if (aCheckValidity) {
+ return target != null && target.checkStructure(false) ? target : null;
+ }
+ return target;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java
new file mode 100644
index 0000000000..718e159d7a
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java
@@ -0,0 +1,27 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public abstract class FunctionalCasing extends MultiBlockPart {
+
+ private int tier = 0;
+
+ @Override
+ public int getPartTier() {
+ return tier;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ tier = nbt.getInteger(GT_Values.NBT.TIER);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java
deleted file mode 100644
index a0043bdf39..0000000000
--- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package gregtech.api.multitileentity.multiblock.casing;
-
-import java.util.UUID;
-
-import net.minecraft.nbt.NBTTagCompound;
-
-import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
-import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
-
-import gregtech.api.enums.GT_Values.NBT;
-import gregtech.api.multitileentity.interfaces.IMultiBlockController;
-
-public class InventoryUpgrade extends AdvancedCasing {
-
- public UUID mInventoryID;
- public static final int INPUT = 0;
- public static final int OUTPUT = 1;
- public static final int BOTH = 2;
- private String mInventoryName = "inventory";
- private int mInventorySize;
- private int mType = BOTH;
-
- public String getInventoryName() {
- return mInventoryName;
- }
-
- public void setInventoryName(String aInventoryName) {
- mInventoryName = aInventoryName;
- }
-
- @Override
- protected void customWork(IMultiBlockController aTarget) {
- int tInvSize = mInventorySize;
- if (mType == BOTH) {
- tInvSize /= 2;
- }
- aTarget.registerInventory(mInventoryName, mInventoryID.toString(), tInvSize, mType);
- }
-
- @Override
- public String getTileEntityName() {
- return "gt.multitileentity.multiblock.inventory";
- }
-
- @Override
- public void readMultiTileNBT(NBTTagCompound aNBT) {
- super.readMultiTileNBT(aNBT);
- if (aNBT.hasKey(NBT.UPGRADE_INVENTORY_UUID)) {
- mInventoryID = UUID.fromString(aNBT.getString(NBT.UPGRADE_INVENTORY_UUID));
- } else {
- mInventoryID = UUID.randomUUID();
- }
- mInventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- mInventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
-
- }
-
- @Override
- public void writeMultiTileNBT(NBTTagCompound aNBT) {
- super.writeMultiTileNBT(aNBT);
- aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, mInventoryID.toString());
- aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, mInventoryName);
- }
-
- @Override
- protected void onBaseTEDestroyed() {
- super.onBaseTEDestroyed();
- unregisterInventories();
- }
-
- private void unregisterInventories() {
- final IMultiBlockController controller = getTarget(false);
- if (controller != null) {
- controller.unregisterInventory(mInventoryName, mInventoryID.toString(), mType);
- }
- }
-
- @Override
- public boolean hasGui(byte aSide) {
- return true;
- }
-
- @Override
- public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
- builder.widget(new TextFieldWidget().setGetter(() -> mInventoryName).setSetter((val) -> {
- mInventoryName = val;
- final IMultiBlockController controller = getTarget(false);
- if (controller != null) {
- controller.changeInventoryName(mInventoryName, mInventoryID.toString(), mType);
- }
- }).setSize(100, 25).setPos(50, 30));
- }
-}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
index 704cf9eb45..e3230eac02 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
@@ -6,30 +6,25 @@ import gregtech.api.enums.GT_Values;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
-public abstract class AdvancedCasing extends MultiBlockPart {
+public abstract class UpgradeCasing extends MultiBlockPart {
- protected int mTier = 0;
+ protected int tier = 0;
@Override
public int getPartTier() {
- return mTier;
+ return tier;
}
@Override
public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
super.setTarget(aTarget, aAllowedModes);
- if (mTarget != null) customWork(mTarget);
+ if (target != null) customWork(target);
}
@Override
public void readMultiTileNBT(NBTTagCompound aNBT) {
super.readMultiTileNBT(aNBT);
- mTier = aNBT.getInteger(GT_Values.NBT.TIER);
- }
-
- @Override
- public void writeMultiTileNBT(NBTTagCompound aNBT) {
- super.writeMultiTileNBT(aNBT);
+ tier = aNBT.getInteger(GT_Values.NBT.TIER);
}
protected abstract void customWork(IMultiBlockController aTarget);
diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
index ffcc9d2a26..98f6f11aec 100644
--- a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
+++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
@@ -14,24 +14,28 @@ import gregtech.api.metatileentity.GregTechTileClientEvents;
import gregtech.api.multitileentity.MultiTileEntityBlock;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
-import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade;
+import gregtech.api.multitileentity.interfaces.IMultiTileMachine;
+import gregtech.common.tileentities.casings.upgrade.InventoryUpgrade;
import io.netty.buffer.ByteBuf;
public class GT_Packet_MultiTileEntity extends GT_Packet_New {
public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4],
- INVENTORY_NAME = B[5];
+ INVENTORY_NAME = B[5], BOOLEANS = B[6], SOUND = B[7];
private int features = 0;
private int mX, mZ;
private int mC0 = 0, mC1 = 0, mC2 = 0, mC3 = 0, mC4 = 0, mC5 = 0;
private short mY, mID, mRID;
- private byte mCommonData, mTexturePage, mUpdate, mRedstone, mColor;
+ private byte mCommonData, mRedstone, mColor;
private ChunkCoordinates mTargetPos = null;
private int mLockedInventoryIndex;
private String mInventoryName;
private int mInventoryLength;
+ private int booleans;
+ private byte soundEvent;
+ private int soundEventValue;
// MultiBlockPart
private byte mMode;
@@ -95,6 +99,21 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New {
mInventoryName = aInventoryName;
}
+ /**
+ *
+ * @param boolToSync each bit of the integer will be a boolean.
+ */
+ public void setBooleans(int boolToSync) {
+ features |= BOOLEANS;
+ this.booleans = boolToSync;
+ }
+
+ public void setSoundEvent(byte soundEvent, int soundEventValue) {
+ features |= SOUND;
+ this.soundEvent = soundEvent;
+ this.soundEventValue = soundEventValue;
+ }
+
@Override
public void encode(ByteBuf aOut) {
// Features
@@ -145,10 +164,13 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New {
}
}
- if (false) {
- aOut.writeByte(mTexturePage);
- aOut.writeByte(mUpdate);
- aOut.writeByte(mColor);
+ if ((features & BOOLEANS) == BOOLEANS) {
+ aOut.writeInt(booleans);
+ }
+
+ if ((features & SOUND) == SOUND) {
+ aOut.writeByte(soundEvent);
+ aOut.writeInt(soundEventValue);
}
}
@@ -202,6 +224,14 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New {
packet.setInventoryName(tName);
}
+ if ((packetFeatures & BOOLEANS) == BOOLEANS) {
+ packet.setBooleans(aData.readInt());
+ }
+
+ if ((packetFeatures & SOUND) == SOUND) {
+ packet.setSoundEvent(aData.readByte(), aData.readInt());
+ }
+
return packet;
}
@@ -246,6 +276,16 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New {
invUpg.setInventoryName(mInventoryName);
}
+ if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) {
+ final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ machine.setBooleans(booleans);
+ }
+
+ if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) {
+ final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ machine.setSound(soundEvent, soundEventValue);
+ }
+
}
} catch (Exception e) {
GT_Mod.GT_FML_LOGGER.error(