aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/tileentities
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/tileentities')
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java47
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java21
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java22
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java93
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java61
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java6
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java508
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java434
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java43
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java174
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java305
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java295
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java80
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java12
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java49
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java7
22 files changed, 1673 insertions, 583 deletions
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java
new file mode 100644
index 0000000000..1644f8fde0
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java
@@ -0,0 +1,47 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_Utility;
+
+public class Ampere extends UpgradeCasing {
+
+ private long amperage;
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.amperage";
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ amperage = aNBT.getInteger(GT_Values.NBT.UPGRADE_AMPERAGE);
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setMaxAmperage(amperage);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setMaxAmperage(2);
+ }
+ return super.breakBlock();
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Increases allowed amperage to " + GT_Utility.formatNumbers(amperage));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java
new file mode 100644
index 0000000000..641327b427
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Cleanroom extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.cleanroom";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setCleanroom(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setCleanroom(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java
new file mode 100644
index 0000000000..6d8bd81d0f
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java
@@ -0,0 +1,21 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public class Heater extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.modular.heater";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ if (target instanceof UpgradableModularMuTE upgradable) {
+ upgradable.increaseMucCount(UpgradeCasings.Heater, this.tier);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java
new file mode 100644
index 0000000000..6cb0b630d6
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java
@@ -0,0 +1,22 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public class Insulator extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.modular.insulator";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ if (target instanceof UpgradableModularMuTE upgradable) {
+ upgradable.increaseMucCount(UpgradeCasings.Insulator, this.tier);
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
index e42f0bfb86..5087c7f09e 100644
--- a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
@@ -1,7 +1,9 @@
package gregtech.common.tileentities.casings.upgrade;
+import java.util.List;
import java.util.UUID;
+import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
@@ -10,35 +12,45 @@ 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.enums.InventoryType;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
import gregtech.api.net.GT_Packet_MultiTileEntity;
public class Inventory extends UpgradeCasing {
- 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 final int mType = BOTH;
+ public UUID inventoryID;
- public String getInventoryName() {
- return mInventoryName;
+ private String inventoryName = "inventory";
+ private int inventorySize;
+ private InventoryType type = InventoryType.Both;
+
+ public String getCustomInventoryName() {
+ return inventoryName;
+ }
+
+ public String getInventoryID() {
+ return inventoryID.toString();
}
public void setInventoryName(String aInventoryName) {
- mInventoryName = aInventoryName;
+ inventoryName = aInventoryName;
+ }
+
+ public InventoryType getType() {
+ return type;
}
@Override
- protected void customWork(IMultiBlockController aTarget) {
- int tInvSize = mInventorySize;
- if (mType == BOTH) {
- tInvSize /= 2;
+ protected void customWork(IMultiBlockController target) {
+ int invSize = inventorySize;
+ if (type == InventoryType.Both) {
+ invSize /= 2;
+ }
+ target.registerItemInventory(invSize, tier, type, true);
+ if (isServerSide()) {
+ issueClientUpdate();
}
- aTarget.registerInventory(mInventoryName, mInventoryID.toString(), tInvSize, mType);
}
@Override
@@ -49,34 +61,28 @@ public class Inventory extends UpgradeCasing {
@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));
+ if (aNBT.hasKey(NBT.UPGRADE_INVENTORY_NAME)) {
+ inventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
} else {
- mInventoryID = UUID.randomUUID();
+ inventoryName = "inventory";
}
- mInventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- mInventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
-
+ inventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
}
@Override
public void writeMultiTileNBT(NBTTagCompound aNBT) {
super.writeMultiTileNBT(aNBT);
- aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, mInventoryID.toString());
- aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, mInventoryName);
+ aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, inventoryID.toString());
+ aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, inventoryName);
}
@Override
- protected void onBaseTEDestroyed() {
- super.onBaseTEDestroyed();
- unregisterInventories();
- }
-
- private void unregisterInventories() {
+ public boolean breakBlock() {
final IMultiBlockController controller = getTarget(false);
if (controller != null) {
- controller.unregisterInventory(mInventoryName, mInventoryID.toString(), mType);
+ controller.unregisterItemInventory(inventoryID, type);
}
+ return super.breakBlock();
}
@Override
@@ -87,12 +93,12 @@ public class Inventory extends UpgradeCasing {
@Override
public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
builder.widget(
- new TextFieldWidget().setGetter(() -> mInventoryName)
+ new TextFieldWidget().setGetter(() -> inventoryName)
.setSetter((val) -> {
- mInventoryName = val;
+ inventoryName = val;
final IMultiBlockController controller = getTarget(false);
if (controller != null) {
- controller.changeInventoryName(mInventoryName, mInventoryID.toString(), mType);
+ controller.changeItemInventoryDisplayName(inventoryID, inventoryName, type);
}
})
.setSize(100, 25)
@@ -100,10 +106,27 @@ public class Inventory extends UpgradeCasing {
}
@Override
+ protected boolean canOpenControllerGui() {
+ return false;
+ }
+
+ @Override
public GT_Packet_MultiTileEntity getClientDataPacket() {
final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
- String name = getInventoryName();
- packet.setInventoryName(name);
+ String name = getCustomInventoryName();
+ packet.setInventoryName(name, inventoryID.toString());
return packet;
}
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Adds another item inventory");
+ list.add("Inventory size: " + inventorySize);
+ list.add("Inventory Type: " + type);
+ }
+
+ public void setInventoryId(String inventoryID) {
+ this.inventoryID = UUID.fromString(inventoryID);
+ }
}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java
new file mode 100644
index 0000000000..ab66281f54
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Laser extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.laser";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setLaserSupport(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setLaserSupport(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java
new file mode 100644
index 0000000000..ebc84be38a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java
@@ -0,0 +1,61 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_Utility;
+
+public class Tank extends UpgradeCasing {
+
+ private int tankCount;
+ private int tankCapacity;
+ public UUID tankID;
+ public static final int INPUT = 0;
+ public static final int OUTPUT = 1;
+ public static final int BOTH = 2;
+ private String tankName = "tank";
+ private int type = BOTH;
+
+ @Override
+ protected void customWork(IMultiBlockController aTarget) {
+
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.tank";
+ }
+
+ public String getCustomTankName() {
+ return tankName;
+ }
+
+ public String getTankID() {
+ return tankID.toString();
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ tankCount = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_COUNT);
+ tankCapacity = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_CAPACITY);
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Adds another tank inventory");
+ list.add("Number of tanks: " + tankCount);
+ list.add("Tank capacity: " + GT_Utility.formatNumbers(tankCapacity) + " L");
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java
new file mode 100644
index 0000000000..0cb6a595bf
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Wireless extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.wireless";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setWirelessSupport(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setWirelessSupport(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
index e4873f6d9d..58b42eca7f 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
@@ -11,6 +11,9 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW;
import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings;
import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_BRIDGE_CASING;
import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_INJECTION_CASING;
import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_TRANS_CASING;
@@ -34,7 +37,6 @@ import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import gregtech.api.GregTech_API;
-import gregtech.api.interfaces.IGlobalWirelessEnergy;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
@@ -52,7 +54,7 @@ import gregtech.common.items.GT_IntegratedCircuit_Item;
public class GT_MetaTileEntity_TranscendentPlasmaMixer
extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_TranscendentPlasmaMixer>
- implements IGlobalWirelessEnergy, ISurvivalConstructable {
+ implements ISurvivalConstructable {
private static final String[][] structure = new String[][] {
{ " CAC ", " ABA ", " ABA ", " A~A ", " ABA ", " ABA ", " CAC " },
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java
new file mode 100644
index 0000000000..a253f6ac1e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java
@@ -0,0 +1,508 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.google.common.primitives.Ints.saturatedCast;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidTank;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.ComplexParallelController;
+import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_StructureUtilityMuTE;
+import gregtech.common.tileentities.machines.multiblock.logic.AdvChemicalProcessorProcessingLogic;
+
+public class AdvChemicalProcessor
+ extends ComplexParallelController<AdvChemicalProcessor, AdvChemicalProcessorProcessingLogic> {
+
+ private static IStructureDefinition<AdvChemicalProcessor> STRUCTURE_DEFINITION = null;
+ protected static final String STRUCTURE_PIECE_T1 = "T1";
+ protected static final String STRUCTURE_PIECE_T2 = "T2";
+ protected static final String STRUCTURE_PIECE_T3 = "T3";
+ protected static final String STRUCTURE_PIECE_T4 = "T4";
+ protected static final String STRUCTURE_PIECE_T5_6 = "T5_6";
+ protected static final String STRUCTURE_PIECE_T7_8 = "T7_8";
+ protected static final Vec3Impl STRUCTURE_OFFSET_T1 = new Vec3Impl(3, 1, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T2 = new Vec3Impl(1, 4, -3);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T3 = new Vec3Impl(8, 0, 5);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T4 = new Vec3Impl(-14, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T5 = new Vec3Impl(14, 0, -6);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T6 = new Vec3Impl(-16, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T7 = new Vec3Impl(16, 0, 15);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T8 = new Vec3Impl(-16, 0, 0);
+ protected static final int PROCESS_WINDOW_BASE_ID = 100;
+ protected static final int ITEM_WHITELIST_SLOTS = 8;
+ protected static final int FLUID_WHITELIST_SLOTS = 8;
+ protected static final int MAX_PROCESSES = 8;
+ protected HeatingCoilLevel coilTier;
+ protected final ArrayList<HashSet<String>> processWhitelists = new ArrayList<>(MAX_PROCESSES);
+ protected final ArrayList<ItemStackHandler> processWhitelistInventoryHandlers = new ArrayList<>(MAX_PROCESSES);
+ protected final ArrayList<ArrayList<IFluidTank>> processFluidWhiteLists = new ArrayList<>(MAX_PROCESSES);
+ protected boolean wasWhitelistOpened = false;
+
+ public AdvChemicalProcessor() {
+ super();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhitelists.add(null);
+ processWhitelistInventoryHandlers.add(new ItemStackHandler(ITEM_WHITELIST_SLOTS));
+ ArrayList<IFluidTank> processFluidTanks = new ArrayList<>(FLUID_WHITELIST_SLOTS);
+ for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
+ processFluidTanks.add(new FluidTankGT());
+ }
+ processFluidWhiteLists.add(processFluidTanks);
+ }
+ setMaxComplexParallels(1, false);
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ setMaxComplexParallels(nbt.getInteger("processors"), false);
+ final NBTTagCompound processWhiteLists = nbt.getCompoundTag("whiteLists");
+ long capacity = 1000;
+ if (nbt.hasKey(GT_Values.NBT.TANK_CAPACITY)) {
+ capacity = saturatedCast(nbt.getLong(GT_Values.NBT.TANK_CAPACITY));
+ }
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+
+ if (processWhiteLists == null) {
+ continue;
+ }
+
+ final NBTTagCompound itemList = processWhiteLists.getCompoundTag("items" + i);
+ if (itemList != null) {
+ processWhitelistInventoryHandlers.get(i)
+ .deserializeNBT(itemList);
+ }
+ final NBTTagList fluidList = processWhiteLists.getTagList("fluids" + i, Constants.NBT.TAG_COMPOUND);
+
+ if (fluidList == null) {
+ continue;
+ }
+
+ for (int j = 0; j < fluidList.tagCount(); j++) {
+ final NBTTagCompound fluid = fluidList.getCompoundTagAt(j);
+
+ if (fluid == null) {
+ continue;
+ }
+
+ short index = fluid.getShort("s");
+ FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(fluid);
+ if (fluidStack != null) {
+ processFluidWhiteLists.get(i)
+ .get(index)
+ .fill(fluidStack, true);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ nbt.setInteger("processors", maxComplexParallels);
+ final NBTTagCompound processWhiteLists = new NBTTagCompound();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhiteLists.setTag(
+ "items" + i,
+ processWhitelistInventoryHandlers.get(i)
+ .serializeNBT());
+ final NBTTagList fluidList = new NBTTagList();
+ for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
+ final FluidStack fluidStack = processFluidWhiteLists.get(i)
+ .get(j)
+ .getFluid();
+ if (fluidStack != null) {
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) j);
+ fluidStack.writeToNBT(tag);
+ fluidList.appendTag(tag);
+ }
+ }
+ processWhiteLists.setTag("fluids" + i, fluidList);
+ }
+ nbt.setTag("whiteLists", processWhiteLists);
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return GT_MultiTileCasing.Chemical.getRegistryId();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Chemical.getId();
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Chemical Reactor")
+ .addInfo("Controller block for the Advanced Chemical Processor")
+ .addInfo("Does not lose efficiency when overclocked")
+ .addInfo("Accepts fluids instead of fluid cells")
+ .addInfo("Can do multiple different recipes at once")
+ .addInfo("By using the whitelist filter a recipe can push its output")
+ .addInfo("to a different recipes input to chain them")
+ .addInfo("Disclaimer: Still WIP - Use at your own risk")
+ .addInfo(GT_Values.Authorminecraft7771)
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, false)
+ .addController("Front center")
+ .addCasingInfoExactly("PTFE Pipe Machine Casing", 8, false)
+ .addCasingInfoExactly("Heating Coils", 3, true)
+ .addCasingInfoExactly("EV+ Glass", 3, true)
+ .addCasingInfoExactly("Motor Casing", 3, true)
+ .addCasingInfoExactly("Chemical Casing", 27, false)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_T1;
+ }
+
+ @Override
+ public boolean checkMachine() {
+ setCoilTier(HeatingCoilLevel.None);
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_T1, buildState.getCurrentOffset())) return buildState.failBuilding();
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ if (!checkPiece(STRUCTURE_PIECE_T2, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ if (!checkPiece(STRUCTURE_PIECE_T3, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ if (!checkPiece(STRUCTURE_PIECE_T4, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ if (!checkPiece(STRUCTURE_PIECE_T5_6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ if (!checkPiece(STRUCTURE_PIECE_T5_6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 6) {
+ buildState.addOffset(STRUCTURE_OFFSET_T7);
+ if (!checkPiece(STRUCTURE_PIECE_T7_8, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 7) {
+ buildState.addOffset(STRUCTURE_OFFSET_T8);
+ if (!checkPiece(STRUCTURE_PIECE_T7_8, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ buildState.stopBuilding();
+ return super.checkMachine();
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_T1, trigger, hintsOnly, buildState.getCurrentOffset());
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ buildPiece(STRUCTURE_PIECE_T2, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ buildPiece(STRUCTURE_PIECE_T3, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ buildPiece(STRUCTURE_PIECE_T4, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ buildPiece(STRUCTURE_PIECE_T5_6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ buildPiece(STRUCTURE_PIECE_T5_6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 6) {
+ buildState.addOffset(STRUCTURE_OFFSET_T7);
+ buildPiece(STRUCTURE_PIECE_T7_8, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 7) {
+ buildState.addOffset(STRUCTURE_OFFSET_T8);
+ buildPiece(STRUCTURE_PIECE_T7_8, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<AdvChemicalProcessor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<AdvChemicalProcessor>builder()
+ .addShape(
+ STRUCTURE_PIECE_T1,
+ transpose(
+ new String[][] { { "CPCPC", "CCCCC", "CPCPC" }, { "CGC~C", "GWWWU", "CGCCC" },
+ { "CPCPC", "CTTTC", "CPCPC" } }))
+ .addShape(
+ STRUCTURE_PIECE_T2,
+ new String[][] { { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T3,
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C CFFF", "BCPPPCBBB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C CFFF", "BCPPPCBBB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T4,
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", "FFFC C ", "BBBCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", " BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", "FFFC C ", "BBBCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T5_6,
+ new String[][] { { " ", " ", " ", " ", " ", " F F ", " " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T7_8,
+ new String[][] { { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " " } })
+ .addElement(
+ 'C',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing()))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1))
+ .addElement('T', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement(
+ 'W',
+ GT_StructureUtility.ofCoil(AdvChemicalProcessor::setCoilTier, AdvChemicalProcessor::getCoilTier))
+ .addElement('G', Glasses.chainAllGlasses())
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement('F', GT_StructureUtility.ofFrame(Materials.Steel))
+ .addElement(
+ 'U',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing(),
+ GT_StructureUtilityMuTE.INVENTORY_CASINGS))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected void setMaxComplexParallels(int parallel, boolean stopMachine) {
+ super.setMaxComplexParallels(parallel, stopMachine);
+ onStructureChange();
+ }
+
+ protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
+ MultiChildWidget child = new MultiChildWidget();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ child.addChild(
+ new ButtonWidget().setPlayClickSound(true)
+ .setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex);
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .setSize(18, 18)
+ .setEnabled((widget -> processIndex < maxComplexParallels))
+ .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20));
+ }
+ child.addChild(
+ new TextFieldWidget().setGetterInt(() -> maxComplexParallels)
+ .setSetterInt(parallel -> setMaxComplexParallels(parallel, true))
+ .setNumbers(1, MAX_PROCESSES)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(130, 85));
+ return child;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ buildContext.addSyncedWindow(
+ PROCESS_WINDOW_BASE_ID + i,
+ (player) -> createProcessConfigWindow(player, processIndex));
+ }
+ buildContext.addCloseListener(() -> {
+ // Reset HashSet, we will let it re-generate on next item output
+ if (wasWhitelistOpened) {
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhitelists.set(i, null);
+ }
+ wasWhitelistOpened = false;
+ }
+ });
+ }
+
+ protected ModularWindow createProcessConfigWindow(final EntityPlayer player, final int processIndex) {
+ wasWhitelistOpened = true;
+ ModularWindow.Builder builder = ModularWindow.builder(86, 100);
+ builder.widget(
+ new TextWidget("Process " + processIndex).setTextAlignment(Alignment.Center)
+ .setPos(13, 7));
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.widget(
+ SlotGroup.ofItemHandler(processWhitelistInventoryHandlers.get(processIndex), 4)
+ .startFromSlot(0)
+ .endAtSlot(ITEM_WHITELIST_SLOTS - 1)
+ .phantom(true)
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(7, 19));
+ builder.widget(
+ SlotGroup.ofFluidTanks(processFluidWhiteLists.get(processIndex), 4)
+ .startFromSlot(0)
+ .endAtSlot(FLUID_WHITELIST_SLOTS - 1)
+ .phantom(true)
+ .build()
+ .setPos(7, 55));
+ return builder.build();
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.advchemicalprocessor";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Advanced Chemical Processor";
+ }
+
+ public void setCoilTier(HeatingCoilLevel coilTier) {
+ this.coilTier = coilTier;
+ }
+
+ public HeatingCoilLevel getCoilTier() {
+ return coilTier;
+ }
+
+ @Override
+ protected boolean hasPerfectOverclock() {
+ return true;
+ }
+
+ protected void generateWhitelist(int processIndex) {
+ HashSet<String> whitelist = new HashSet<>();
+ for (ItemStack itemStack : processWhitelistInventoryHandlers.get(processIndex)
+ .getStacks()) {
+ if (itemStack != null) {
+ whitelist.add(getWhitelistString(itemStack));
+ }
+ }
+ for (IFluidTank tank : processFluidWhiteLists.get(processIndex)) {
+ if (tank.getFluid() != null) {
+ whitelist.add(getWhitelistString(tank.getFluid()));
+ }
+ }
+ processWhitelists.set(processIndex, whitelist);
+ }
+
+ protected String getWhitelistString(ItemStack itemStack) {
+ if (itemStack != null) {
+ return itemStack.getUnlocalizedName();
+ }
+ return null;
+ }
+
+ protected String getWhitelistString(FluidStack fluidStack) {
+ if (fluidStack != null) {
+ return fluidStack.getUnlocalizedName();
+ }
+ return null;
+ }
+
+ @Override
+ @Nonnull
+ protected AdvChemicalProcessorProcessingLogic createProcessingLogic() {
+ return new AdvChemicalProcessorProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java
deleted file mode 100644
index 38ed9b6603..0000000000
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalReactor.java
+++ /dev/null
@@ -1,434 +0,0 @@
-package gregtech.common.tileentities.machines.multiblock;
-
-import static com.google.common.primitives.Ints.saturatedCast;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
-import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraftforge.common.util.Constants;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.IFluidTank;
-
-import org.apache.commons.lang3.ArrayUtils;
-
-import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.StructureDefinition;
-import com.gtnewhorizon.structurelib.util.Vec3Impl;
-import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
-import com.gtnewhorizons.modularui.api.math.Alignment;
-import com.gtnewhorizons.modularui.api.screen.ModularWindow;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
-import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
-import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
-import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
-import com.gtnewhorizons.modularui.common.widget.SlotGroup;
-import com.gtnewhorizons.modularui.common.widget.TextWidget;
-
-import gregtech.api.GregTech_API;
-import gregtech.api.enums.GT_Values;
-import gregtech.api.enums.HeatingCoilLevel;
-import gregtech.api.fluid.FluidTankGT;
-import gregtech.api.gui.modularui.GT_UITextures;
-import gregtech.api.logic.ComplexParallelProcessingLogic;
-import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
-import gregtech.api.multitileentity.multiblock.base.ComplexParallelController;
-import gregtech.api.multitileentity.multiblock.casing.Glasses;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.RecipeMaps;
-import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_StructureUtility;
-import gregtech.common.tileentities.casings.upgrade.Inventory;
-
-public class AdvChemicalReactor extends ComplexParallelController<AdvChemicalReactor> {
-
- private static IStructureDefinition<AdvChemicalReactor> STRUCTURE_DEFINITION = null;
- protected static final String STRUCTURE_PIECE_T1 = "T1";
- protected static final Vec3Impl STRUCTURE_OFFSET = new Vec3Impl(3, 1, 0);
- protected static final int PROCESS_WINDOW_BASE_ID = 100;
- protected static final int ITEM_WHITELIST_SLOTS = 8;
- protected static final int FLUID_WHITELIST_SLOTS = 8;
- protected static final int MAX_PROCESSES = 4;
- protected int numberOfProcessors = MAX_PROCESSES; // TODO: Set this value depending on structure
- protected HeatingCoilLevel coilTier;
- protected final ArrayList<HashSet<String>> processWhitelists = new ArrayList<>(MAX_PROCESSES);
- protected final ArrayList<ItemStackHandler> processWhitelistInventoryHandlers = new ArrayList<>(MAX_PROCESSES);
- protected final ArrayList<ArrayList<IFluidTank>> processFluidWhiteLists = new ArrayList<>(MAX_PROCESSES);
- protected boolean wasWhitelistOpened = false;
-
- public AdvChemicalReactor() {
- super();
- for (int i = 0; i < MAX_PROCESSES; i++) {
- processWhitelists.add(null);
- processWhitelistInventoryHandlers.add(new ItemStackHandler(ITEM_WHITELIST_SLOTS));
- ArrayList<IFluidTank> processFluidTanks = new ArrayList<>(FLUID_WHITELIST_SLOTS);
- for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
- processFluidTanks.add(new FluidTankGT());
- }
- processFluidWhiteLists.add(processFluidTanks);
- }
- processingLogic = new ComplexParallelProcessingLogic(getRecipeMap(), MAX_PROCESSES);
- }
-
- @Override
- public RecipeMap<?> getRecipeMap() {
- return RecipeMaps.chemicalReactorRecipes;
- }
-
- @Override
- public void readMultiTileNBT(NBTTagCompound nbt) {
- super.readMultiTileNBT(nbt);
- final NBTTagCompound processWhiteLists = nbt.getCompoundTag("whiteLists");
- long capacity = 1000;
- if (nbt.hasKey(GT_Values.NBT.TANK_CAPACITY)) {
- capacity = saturatedCast(nbt.getLong(GT_Values.NBT.TANK_CAPACITY));
- }
- for (int i = 0; i < MAX_PROCESSES; i++) {
- registerInventory("processInventory" + i, "processInventory" + i, 8, Inventory.INPUT);
- registerFluidInventory(
- "processInventory" + i,
- "processInventory" + i,
- 8,
- capacity,
- maxParallel * 2L,
- Inventory.INPUT);
- if (processWhiteLists != null) {
- final NBTTagCompound itemList = processWhiteLists.getCompoundTag("items" + i);
- if (itemList != null) {
- processWhitelistInventoryHandlers.get(i)
- .deserializeNBT(itemList);
- }
- final NBTTagList fluidList = processWhiteLists.getTagList("fluids" + i, Constants.NBT.TAG_COMPOUND);
- if (fluidList != null) {
- for (int j = 0; j < fluidList.tagCount(); j++) {
- final NBTTagCompound fluid = fluidList.getCompoundTagAt(j);
- if (fluid != null) {
- short index = fluid.getShort("s");
- FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(fluid);
- if (fluidStack != null) {
- processFluidWhiteLists.get(i)
- .get(index)
- .fill(fluidStack, true);
- }
- }
- }
- }
- }
- }
- }
-
- @Override
- public void writeMultiTileNBT(NBTTagCompound nbt) {
- super.writeMultiTileNBT(nbt);
- final NBTTagCompound processWhiteLists = new NBTTagCompound();
- for (int i = 0; i < MAX_PROCESSES; i++) {
- processWhiteLists.setTag(
- "items" + i,
- processWhitelistInventoryHandlers.get(i)
- .serializeNBT());
- final NBTTagList fluidList = new NBTTagList();
- for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
- final FluidStack fluidStack = processFluidWhiteLists.get(i)
- .get(j)
- .getFluid();
- if (fluidStack != null) {
- final NBTTagCompound tag = new NBTTagCompound();
- tag.setByte("s", (byte) j);
- fluidStack.writeToNBT(tag);
- fluidList.appendTag(tag);
- }
- }
- processWhiteLists.setTag("fluids" + i, fluidList);
- }
- nbt.setTag("whiteLists", processWhiteLists);
- }
-
- @Override
- public short getCasingRegistryID() {
- return 0;
- }
-
- @Override
- public int getCasingMeta() {
- return GT_MultiTileCasing.Chemical.getId();
- }
-
- @Override
- public GT_Multiblock_Tooltip_Builder createTooltip() {
- final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
- tt.addMachineType("Chemical Reactor")
- .addInfo("Controller block for the Advanced Chemical Reactor")
- .addInfo("Does not lose efficiency when overclocked")
- .addInfo("Accepts fluids instead of fluid cells")
- .addInfo("Can do multiple different recipes at once")
- .addInfo("By using the whitelist filter a recipe can push its output")
- .addInfo("to a different recipes input to chain them")
- .addInfo(GT_Values.Authorminecraft7771)
- .addSeparator()
- .beginStructureBlock(5, 3, 3, false)
- .addController("Front center")
- .addCasingInfoExactly("PTFE Pipe Machine Casing", 8, false)
- .addCasingInfoExactly("Heating Coils", 3, true)
- .addCasingInfoExactly("EV+ Glass", 3, true)
- .addCasingInfoExactly("Motor Casing", 3, true)
- .addCasingInfoExactly("Chemical Casing", 27, false)
- .toolTipFinisher("Gregtech");
- return tt;
- }
-
- @Override
- public Vec3Impl getStartingStructureOffset() {
- return STRUCTURE_OFFSET;
- }
-
- @Override
- public boolean checkMachine() {
- setCoilTier(HeatingCoilLevel.None);
- setMaxComplexParallels(MAX_PROCESSES);
- buildState.startBuilding(getStartingStructureOffset());
- boolean result = checkPiece(STRUCTURE_PIECE_T1, buildState.stopBuilding());
- return result && super.checkMachine();
- }
-
- @Override
- public void construct(ItemStack trigger, boolean hintsOnly) {
- buildState.startBuilding(getStartingStructureOffset());
- buildPiece(STRUCTURE_PIECE_T1, trigger, hintsOnly, buildState.stopBuilding());
- }
-
- @Override
- public IStructureDefinition<AdvChemicalReactor> getStructureDefinition() {
- if (STRUCTURE_DEFINITION == null) {
- STRUCTURE_DEFINITION = StructureDefinition.<AdvChemicalReactor>builder()
- .addShape(
- STRUCTURE_PIECE_T1,
- transpose(
- new String[][] { { "CPCPC", "CCCCC", "CPCPC" }, { "CGC~C", "GWWWC", "CGCCC" },
- { "CPCPC", "CTTTC", "CPCPC" } }))
- .addElement(
- 'C',
- addMultiTileCasing(
- "gt.multitileentity.casings",
- getCasingMeta(),
- FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN))
- .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1))
- .addElement('T', addMotorCasings(NOTHING))
- .addElement(
- 'W',
- GT_StructureUtility.ofCoil(AdvChemicalReactor::setCoilTier, AdvChemicalReactor::getCoilTier))
- .addElement('G', Glasses.chainAllGlasses())
- .build();
- }
- return STRUCTURE_DEFINITION;
- }
-
- @Override
- protected FluidStack[] getInputFluids(int index) {
- if (index < 0 || index >= MAX_PROCESSES) {
- return null;
- }
- if (separateInputs) {
- return ArrayUtils.addAll(
- getFluidInputsForTankArray("processInventory" + index),
- FluidTankGT.getFluidsFromTanks(inputTanks));
- } else {
- return super.getInputFluids(index);
- }
- }
-
- @Override
- protected ItemStack[] getInputItems(int index) {
- if (index < 0 || index >= MAX_PROCESSES) {
- return null;
- }
- if (separateInputs) {
- return ArrayUtils.addAll(
- getItemInputsForInventory("processInventory" + index),
- inputInventory.getStacks()
- .toArray(new ItemStack[0]));
- } else {
- return super.getInputItems(index);
- }
- }
-
- @Override
- protected void outputItems(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- for (int i = 0; i < MAX_PROCESSES; i++) {
- // Regenerate whitelist, if it has been reset
- if (processWhitelists.get(i) == null) {
- generateWhitelist(i);
- }
- int outputIndex = i;
- // Output items that are on the whitelist of this process
- outputItems(
- multiBlockInputInventory.get("processInventory" + i),
- Arrays.stream(processingLogic.getOutputItems(index))
- .filter(
- itemStack -> processWhitelists.get(outputIndex)
- .contains(getWhitelistString(itemStack)))
- .toArray(ItemStack[]::new));
- }
- // Output remaining items
- if (processingLogic.getOutputItems(index) != null && processingLogic.getOutputItems(index).length > 0) {
- outputItems(processingLogic.getOutputItems(index));
- }
- }
- }
-
- @Override
- protected void outputFluids(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- for (int i = 0; i < MAX_PROCESSES; i++) {
- // Regenerate whitelist, if it has been reset
- if (processWhitelists.get(i) == null) {
- generateWhitelist(i);
- }
- int outputIndex = i;
- // Output fluids that are on the whitelist of this process
- outputFluids(
- multiBlockInputTank.get("processInventory" + i),
- Arrays.stream(processingLogic.getOutputFluids(index))
- .filter(
- fluidStack -> processWhitelists.get(outputIndex)
- .contains(getWhitelistString(fluidStack)))
- .toArray(FluidStack[]::new));
- }
- // Output remaining fluids
- if (processingLogic.getOutputFluids(index) != null && processingLogic.getOutputFluids(index).length > 0) {
- outputFluids(processingLogic.getOutputFluids(index));
- }
- }
- }
-
- @Override
- protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
- MultiChildWidget child = super.createMainPage(builder);
- for (int i = 0; i < MAX_PROCESSES; i++) {
- final int processIndex = i;
- child.addChild(
- new ButtonWidget().setPlayClickSound(true)
- .setOnClick(
- (clickData, widget) -> {
- if (!widget.isClient()) widget.getContext()
- .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex);
- })
- .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST)
- .setSize(18, 18)
- .setPos(20 * i + 18, 18));
- }
- return child;
- }
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- super.addUIWidgets(builder, buildContext);
- for (int i = 0; i < MAX_PROCESSES; i++) {
- final int processIndex = i;
- buildContext.addSyncedWindow(
- PROCESS_WINDOW_BASE_ID + i,
- (player) -> createProcessConfigWindow(player, processIndex));
- }
- buildContext.addCloseListener(() -> {
- // Reset HashSet, we will let it re-generate on next item output
- if (wasWhitelistOpened) {
- for (int i = 0; i < MAX_PROCESSES; i++) {
- processWhitelists.set(i, null);
- }
- wasWhitelistOpened = false;
- }
- });
- }
-
- protected ModularWindow createProcessConfigWindow(final EntityPlayer player, final int processIndex) {
- wasWhitelistOpened = true;
- ModularWindow.Builder builder = ModularWindow.builder(86, 100);
- builder.widget(
- new TextWidget("Process " + processIndex).setTextAlignment(Alignment.Center)
- .setPos(13, 7));
- builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
- builder.widget(
- SlotGroup.ofItemHandler(processWhitelistInventoryHandlers.get(processIndex), 4)
- .startFromSlot(0)
- .endAtSlot(ITEM_WHITELIST_SLOTS - 1)
- .phantom(true)
- .background(getGUITextureSet().getItemSlot())
- .build()
- .setPos(7, 19));
- builder.widget(
- SlotGroup.ofFluidTanks(processFluidWhiteLists.get(processIndex), 4)
- .startFromSlot(0)
- .endAtSlot(FLUID_WHITELIST_SLOTS - 1)
- .phantom(true)
- .build()
- .setPos(7, 55));
- return builder.build();
- }
-
- @Override
- public String getTileEntityName() {
- return "gt.multitileentity.multiblock.advchemicalreactor";
- }
-
- @Override
- public String getLocalName() {
- return "Advanced Chemical Reactor";
- }
-
- public void setCoilTier(HeatingCoilLevel coilTier) {
- this.coilTier = coilTier;
- }
-
- public HeatingCoilLevel getCoilTier() {
- return coilTier;
- }
-
- @Override
- protected boolean hasPerfectOverclock() {
- return true;
- }
-
- protected void generateWhitelist(int processIndex) {
- HashSet<String> whitelist = new HashSet<>();
- for (ItemStack itemStack : processWhitelistInventoryHandlers.get(processIndex)
- .getStacks()) {
- if (itemStack != null) {
- whitelist.add(getWhitelistString(itemStack));
- }
- }
- for (IFluidTank tank : processFluidWhiteLists.get(processIndex)) {
- if (tank.getFluid() != null) {
- whitelist.add(getWhitelistString(tank.getFluid()));
- }
- }
- processWhitelists.set(processIndex, whitelist);
- }
-
- protected String getWhitelistString(ItemStack itemStack) {
- if (itemStack != null) {
- return itemStack.getUnlocalizedName();
- }
- return null;
- }
-
- protected String getWhitelistString(FluidStack fluidStack) {
- if (fluidStack != null) {
- return fluidStack.getUnlocalizedName();
- }
- return null;
- }
-}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java
index 13f60da821..06fc7b42b1 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java
@@ -2,9 +2,12 @@ package gregtech.common.tileentities.machines.multiblock;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
import java.util.List;
+import javax.annotation.Nonnull;
+
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.item.ItemStack;
@@ -16,34 +19,29 @@ import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
import com.gtnewhorizons.modularui.api.math.Alignment;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.GT_Mod;
import gregtech.api.enums.GT_Values;
-import gregtech.api.logic.PollutionLogic;
-import gregtech.api.logic.ProcessingLogic;
-import gregtech.api.logic.interfaces.PollutionLogicHost;
-import gregtech.api.logic.interfaces.ProcessingLogicHost;
import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
import gregtech.api.multitileentity.multiblock.base.Controller;
+import gregtech.api.task.tasks.PollutionTask;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.common.tileentities.machines.multiblock.logic.CokeOvenProcessingLogic;
-public class CokeOven extends Controller<CokeOven> implements PollutionLogicHost, ProcessingLogicHost {
+public class CokeOven extends Controller<CokeOven, CokeOvenProcessingLogic> {
private static IStructureDefinition<CokeOven> STRUCTURE_DEFINITION = null;
private static final Vec3Impl OFFSET = new Vec3Impl(1, 1, 0);
private static final String MAIN = "Main";
- private static final PollutionLogic POLLUTION_LOGIC = new PollutionLogic().setPollutionAmount(10);
- private final ProcessingLogic PROCESSING_LOGIC = new CokeOvenProcessingLogic();
+ private static final int POLLUTION_AMOUNT = 10;
public CokeOven() {
super();
setElectric(false);
+ new PollutionTask<>(this).setPollutionPerSecond(POLLUTION_AMOUNT);
}
@Override
@@ -81,7 +79,7 @@ public class CokeOven extends Controller<CokeOven> implements PollutionLogicHost
.addInfo("Used for charcoal")
.beginStructureBlock(3, 3, 3, true)
.addCasingInfoExactly("Coke Oven Bricks", 25, false)
- .addPollutionAmount(POLLUTION_LOGIC.getPollutionAmount())
+ .addPollutionAmount(POLLUTION_AMOUNT)
.toolTipFinisher(GT_Values.AuthorBlueWeabo);
return tt;
}
@@ -98,29 +96,18 @@ public class CokeOven extends Controller<CokeOven> implements PollutionLogicHost
.addShape(
MAIN,
new String[][] { { "AAA", "A~A", "AAA" }, { "AAA", "A-A", "AAA" }, { "AAA", "AAA", "AAA" } })
- .addElement('A', addMultiTileCasing("gt.multitileentity.casings", getCasingMeta(), ITEM_IN | ITEM_OUT))
+ .addElement('A', ofMuTECasings(ITEM_IN | ITEM_OUT, GT_MultiTileCasing.CokeOven.getCasing()))
.build();
}
return STRUCTURE_DEFINITION;
}
@Override
- protected boolean hasFluidInput() {
+ public boolean hasFluidInput() {
return false;
}
@Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- builder.widget(
- new SlotWidget(inputInventory, 0).setPos(18, 18)
- .setSize(18, 18));
- builder.widget(
- new SlotWidget(outputInventory, 0).setPos(36, 36)
- .setSize(18, 18));
- builder.widget(createButtons(builder));
- }
-
- @Override
protected void addTitleTextStyle(ModularWindow.Builder builder, String title) {
final int TAB_PADDING = 3;
final int TITLE_PADDING = 2;
@@ -159,12 +146,8 @@ public class CokeOven extends Controller<CokeOven> implements PollutionLogicHost
}
@Override
- public PollutionLogic getPollutionLogic() {
- return POLLUTION_LOGIC;
- }
-
- @Override
- public ProcessingLogic getProcessingLogic() {
- return PROCESSING_LOGIC;
+ @Nonnull
+ protected CokeOvenProcessingLogic createProcessingLogic() {
+ return new CokeOvenProcessingLogic();
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java
new file mode 100644
index 0000000000..326bfcc9ee
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java
@@ -0,0 +1,174 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.*;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.StackableController;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.common.tileentities.machines.multiblock.logic.DistillationTowerProcessingLogic;
+
+public class DistillationTower extends StackableController<DistillationTower, DistillationTowerProcessingLogic> {
+
+ private static IStructureDefinition<DistillationTower> STRUCTURE_DEFINITION_MEGA = null;
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA = new Vec3Impl(8, 3, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_START = new Vec3Impl(0, 3, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STOP = new Vec3Impl(0, 5, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STACK = new Vec3Impl(0, 3, 0);
+ private static final String STACKABLE_MIDDLE_1 = "STACKABLE_MIDDLE_1";
+ private static final String STACKABLE_MIDDLE_2 = "STACKABLE_MIDDLE_2";
+ private boolean isMega = true;
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Distillation.getId();
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Distillation Tower")
+ .addInfo("Controller block for the Distillation Tower")
+ .addInfo("Can be specialised to be a mega structure")
+ .addInfo(GT_Values.Authorminecraft7771)
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, false)
+ .addController("Front center")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_MEGA;
+ }
+
+ @Override
+ public IStructureDefinition<DistillationTower> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION_MEGA == null) {
+ STRUCTURE_DEFINITION_MEGA = StructureDefinition.<DistillationTower>builder()
+ .addShape(
+ STACKABLE_START,
+ transpose(
+ // spotless:off
+ new String[][]{
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CC ABA "," CC CC B B "," CC CC ABA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," EEE "," E "," E "," E "," E E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CCCCC "," CCCCC "," CCCCC "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CXC~C "," BDDDB "," CBCBC "," B B "," B B "," E B B E "," CCCCCCC "," C C "," EC CE "," C C "," C C AAA "," C C A A "," C C AAA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CCCCC "," CCCCC "," CCCCC "," "," CCCCCCCCCCC "," CAAAAAAAAAC ","CCCACCCCCCCACCC ","CAACAAAAAAACAAC ","CACAADDDDDAACAC ","CACADDDDDDDACACCCCC","CACADDAAADDACACCCCC","CACADDAAADDACACCCCC","CACADDAAADDACACCCCC","CACADDDDDDDACACCCCC","CACAADDDDDAACAC ","CAACAAAAAAACAAC ","CCCACCCCCCCACCC "," CAAAAAAAAAC "," CCCCCCCCCCC "}
+ }))
+ .addShape(
+ STACKABLE_STOP,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," "," "," "," "," "," CCC "," CCC "," CCC "," "," "," "," "," "," "},
+ {" "," "," "," "," "," E E "," E E "," E E "," EEEEAAAAAEEEE "," AAAAAAA "," AA AA "," AA AA "," AA AA "," AAAAAAA "," EEEEAAAAAEEEE "," E E "," E E "," E E "," "},
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCCCC "," CCCCCCCCCCC "," ECCC CCCE "," CCC CCC "," CCC CCC "," CCC CCC "," CCC CCC "," CCC CCC "," ECCC CCCE "," CCCCCCCCCCC "," CCCCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C "," C C "," C C "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C CAAAAA "," C CABBBA "," C CAAAAA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CABBBA "," CC C B "," CC CABBBA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C CAAABA "," C CAAA B "," C CAAABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C A B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ .addShape(
+ STACKABLE_MIDDLE_1,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ .addShape(
+ STACKABLE_MIDDLE_2,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CC ABA "," CC CC B B "," CC CC ABA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ // spotless:on
+ .addElement(
+ 'C',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Distillation.getCasing()))
+ .addElement('E', GT_StructureUtility.ofFrame(Materials.StainlessSteel))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings2, 0))
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings2, 13))
+ .addElement('X', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('D', GT_StructureUtility.ofCoil((tile, meta) -> {}, (tile) -> HeatingCoilLevel.None))
+ .build();
+ }
+ return STRUCTURE_DEFINITION_MEGA;
+ }
+
+ @Override
+ public int getFluidOutputCount() {
+ return 12;
+ }
+
+ @Override
+ public int getMinStacks() {
+ return 0;
+ }
+
+ @Override
+ public int getMaxStacks() {
+ return 9;
+ }
+
+ @Override
+ public Vec3Impl getStartingStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_START;
+ }
+
+ @Override
+ public Vec3Impl getPerStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STACK;
+ }
+
+ @Override
+ public Vec3Impl getAfterLastStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STOP;
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.distillationtower";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Distillation Tower";
+ }
+
+ @Override
+ protected String getStackableMiddle(int stackIndex) {
+ return stackIndex % 2 == 0 ? STACKABLE_MIDDLE_1 : STACKABLE_MIDDLE_2;
+ }
+
+ @Override
+ @Nonnull
+ protected DistillationTowerProcessingLogic createProcessingLogic() {
+ return new DistillationTowerProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java
new file mode 100644
index 0000000000..93bcc09a0b
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java
@@ -0,0 +1,305 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName;
+import static gregtech.api.enums.Mods.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.util.GT_StructureUtilityMuTE.*;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.ComplexParallelController;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.common.tileentities.machines.multiblock.logic.LaserEngraverProcessingLogic;
+
+public class LaserEngraver extends ComplexParallelController<LaserEngraver, LaserEngraverProcessingLogic> {
+
+ private static IStructureDefinition<LaserEngraver> STRUCTURE_DEFINITION = null;
+ protected static final String STRUCTURE_MAIN = "Main";
+ protected static final String STRUCTURE_PIECE_T1 = "T1";
+ protected static final String STRUCTURE_PIECE_T2 = "T2";
+ protected static final String STRUCTURE_PIECE_T3 = "T3";
+ protected static final String STRUCTURE_PIECE_T4 = "T4";
+ protected static final String STRUCTURE_PIECE_T5 = "T5";
+ protected static final String STRUCTURE_PIECE_T6 = "T6";
+ protected static final int PROCESS_WINDOW_BASE_ID = 100;
+ protected static final Vec3Impl STRUCTURE_OFFSET_T1 = new Vec3Impl(3, 1, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T2 = new Vec3Impl(1, 3, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T3 = new Vec3Impl(-6, 0, -5);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T4 = new Vec3Impl(18, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T5 = new Vec3Impl(-18, 0, 9);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T6 = new Vec3Impl(18, 0, 0);
+ protected static final int MAX_PROCESSES = 6;
+ protected RecipeMap<?> recipeMap;
+ private UUID LaserEngraver;
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.laserengraver";
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_T1;
+ }
+
+ @Override
+ public boolean checkMachine() {
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_T1, buildState.getCurrentOffset())) return buildState.failBuilding();
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ if (!checkPiece(STRUCTURE_PIECE_T2, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ if (!checkPiece(STRUCTURE_PIECE_T3, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ if (!checkPiece(STRUCTURE_PIECE_T4, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ if (!checkPiece(STRUCTURE_PIECE_T5, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ if (!checkPiece(STRUCTURE_PIECE_T6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ buildState.stopBuilding();
+ return super.checkMachine();
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_T1, trigger, hintsOnly, buildState.getCurrentOffset());
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ buildPiece(STRUCTURE_PIECE_T2, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ buildPiece(STRUCTURE_PIECE_T3, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ buildPiece(STRUCTURE_PIECE_T4, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ buildPiece(STRUCTURE_PIECE_T5, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ buildPiece(STRUCTURE_PIECE_T6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<LaserEngraver> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<LaserEngraver>builder()
+ .addShape(
+ STRUCTURE_PIECE_T1,
+ transpose(
+ // spotless:off
+ new String[][]{{"ACADA", "AAAAA", "AAAAA"}, {"GGA~A", "H I", "GGAAA"},
+ {"AAAAA", "ABBBA", "AAAAA"}}))
+ .addShape(
+ STRUCTURE_PIECE_T2,
+ new String[][]{{" ", " ", " ", " ", " ", " "},
+ {" K ", " K ", " K ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" KKKKK ", "BIB BIB", "G G G G", "G G G G", "G G G G", "BHB BHB"},
+ {" K K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" K K ", " ", " ", " ", " ", " "},
+ {" K K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" KKKKK ", "BIB BIB", "G G G G", "G G G G", "G G G G", "BHB BHB"},
+ {" ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF",}})
+ .addShape(
+ STRUCTURE_PIECE_T3,
+ new String[][]{
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BMLMB G ", " BBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " M HHH M G ", " BBBBBBB FBF "},
+ {"KKKKKK ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " M HHH M G ", " BBBBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BMLMB G ", " BBBBB FBF "}})
+ .addShape(
+ STRUCTURE_PIECE_T4,
+ new String[][]{
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BNLNB ", "FBF BBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G N HHH N ", "FBF BBBBBBB "},
+ {" KKKKKK", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G N HHH N ", "FBF BBBBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BNLNB ", "FBF BBBBB "}})
+ .addShape(
+ STRUCTURE_PIECE_T5,
+ new String[][]{
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BOLOB G ", " BBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " O HHH O G ", " BBBBBBB FBF "},
+ {" K ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " O HHH O G ", " BBBBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BOLOB G ", " BBBBB FBF "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "}})
+ .addShape(
+ STRUCTURE_PIECE_T6,
+ new String[][]{
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BPLPB ", "FBF BBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G P HHH P ", "FBF BBBBBBB "},
+ {" K ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G P HHH P ", "FBF BBBBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BPLPB ", "FBF BBBBB "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "}})
+ // spotless:on
+ .addElement(
+ 'A',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement(
+ 'B',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.BlackLaserEngraverCasing.getCasing()))
+ .addElement(
+ 'C',
+ ofMuTECasings(NOTHING, CLEANROOM_CASINGS, GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement('D', ofMuTECasings(NOTHING, WIRELESS_CASINGS, GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement('E', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('F', GT_StructureUtility.ofFrame(Materials.Naquadah)
+
+ )
+ .addElement('H', ofMuTECasings(NOTHING, GT_MultiTileCasing.Mirror.getCasing()))
+
+ .addElement(
+ 'G',
+ ofChain(
+ ofBlockUnlocalizedName(IndustrialCraft2.ID, "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks2", 0, true),
+ ofBlockUnlocalizedName(Thaumcraft.ID, "blockCosmeticOpaque", 2, false)))
+ .addElement('I', ofMuTECasings(NOTHING, EMITTER_CASINGS))
+ .addElement('K', ofBlock(GregTech_API.sBlockCasings3, 11))
+ .addElement('L', ofMuTECasings(NOTHING, ROBOT_ARM_CASINGS))
+ .addElement('M', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade1.getCasing()))
+ .addElement('N', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade2.getCasing()))
+ .addElement('O', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade3.getCasing()))
+ .addElement('P', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade4.getCasing()))
+ .build();
+ buildState.stopBuilding();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
+ MultiChildWidget child = new MultiChildWidget();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ child.addChild(
+ new ButtonWidget().setPlayClickSound(true)
+ .setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex);
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .setSize(18, 18)
+ .setEnabled((widget -> processIndex < maxComplexParallels))
+ .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20));
+ }
+ child.addChild(
+ new TextFieldWidget().setGetterInt(() -> maxComplexParallels)
+ .setSetterInt(parallel -> setMaxComplexParallels(parallel, true))
+ .setNumbers(1, MAX_PROCESSES)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(130, 85));
+ return child;
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ setMaxComplexParallels(nbt.getInteger("processors"), false);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ nbt.setInteger("processors", maxComplexParallels);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.LaserEngraver.getId();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Laser Engraver")
+ .addInfo("Used for Engraving")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front right center")
+ .toolTipFinisher(GT_Values.AuthorTheEpicGamer274);
+ return tt;
+ }
+
+ @Override
+ @Nonnull
+ protected LaserEngraverProcessingLogic createProcessingLogic() {
+ return new LaserEngraverProcessingLogic();
+ }
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java
new file mode 100644
index 0000000000..3b00708e40
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java
@@ -0,0 +1,295 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.enums.Mods.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.AMPERAGE_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.HEATER_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.INSULATOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.StackableModularController;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+import gregtech.common.tileentities.machines.multiblock.logic.LayeredCokeBatteryProcessingLogic;
+
+public class LayeredCokeBattery
+ extends StackableModularController<LayeredCokeBattery, LayeredCokeBatteryProcessingLogic> {
+
+ private static IStructureDefinition<LayeredCokeBattery> STRUCTURE_DEFINITION_MEGA = null;
+ protected static final String STRUCTURE_PIECE_BASE = "T1";
+ private static final Vec3Impl STRUCTURE_OFFSET_BASE = new Vec3Impl(2, 2, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_POSITION = new Vec3Impl(4, 7, -4);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_START = new Vec3Impl(0, 0, -3);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STACK = new Vec3Impl(0, 0, -2);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STOP = new Vec3Impl(0, 0, -1);
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.layeredcokebattery";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Layered Coke Battery";
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_BASE;
+ }
+
+ public UpgradeCasings getBaseMucType() {
+ return UpgradeCasings.Heater;
+ }
+
+ public int getParallelFactor() {
+ return 2;
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ final int blueprintCount = (trigger.stackSize - 1) + getMinStacks();
+ final int stackCount = Math.min(blueprintCount, getMaxStacks());
+
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_BASE, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getMegaPositionOffset());
+
+ if (stackCount >= 1) {
+ buildPiece(STACKABLE_START, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getStartingStackOffset());
+
+ for (int i = 0; i < stackCount; i++) {
+ buildPiece(STACKABLE_MIDDLE, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getPerStackOffset());
+ }
+ if (hasTop()) {
+ buildPiece(STACKABLE_STOP, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ }
+
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<LayeredCokeBattery> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION_MEGA == null) {
+ STRUCTURE_DEFINITION_MEGA = StructureDefinition.<LayeredCokeBattery>builder()
+ .addShape(
+ STRUCTURE_PIECE_BASE,
+ transpose(
+ new String[][] { { " AAA ", "AAAAA", "AEEEP", "AAAAA" }, { " AAA ", "A A", "A A", "AAAAA" },
+ { " A~A ", "A A", "A A", "AAAAA" }, { " AAA ", "A A", "A A", "AAAAA" },
+ { " AAA ", "AAAAA", "AAAAA", "AAAAA" } }))
+ .addShape(
+ STACKABLE_STOP,
+ transpose(
+ new String[][] { { "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { "HB B B B B BH", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { "HB B B B B BH", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addShape(
+ STACKABLE_MIDDLE,
+ transpose(
+ new String[][] { { "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { "HB A BH", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { "HB A BH", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addShape(
+ STACKABLE_START,
+ transpose(
+ new String[][] { { "AAAAAAAAAAAAA", "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", "HB B B B B BH", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", "HB B B B B BH", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addElement(
+ 'A',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing()))
+ .addElement(
+ 'B',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Distillation.getCasing()))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement('D', GT_StructureUtility.ofFrame(Materials.Steel))
+ .addElement('E', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement(
+ 'F',
+ ofChain(
+ ofBlockUnlocalizedName(IndustrialCraft2.ID, "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks2", 0, true),
+ ofBlockUnlocalizedName(Thaumcraft.ID, "blockCosmeticOpaque", 2, false)))
+ .addElement('H', ofMuTECasings(NOTHING, HEATER_CASINGS, INSULATOR_CASINGS))
+ .addElement('P', ofMuTECasings(NOTHING, AMPERAGE_CASINGS))
+ .build();
+ }
+ return STRUCTURE_DEFINITION_MEGA;
+ }
+
+ public boolean checkMachine() {
+ stackCount = 0;
+ resetMucCount();
+
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_BASE, buildState.getCurrentOffset())) return buildState.failBuilding();
+
+ buildState.addOffset(getMegaPositionOffset());
+ if (!checkPiece(STACKABLE_START, buildState.getCurrentOffset())) {
+ return buildState.failBuilding();
+ }
+
+ buildState.addOffset(getStartingStackOffset());
+ for (int i = 0; i < getMaxStacks(); i++) {
+ if (!checkPiece(getStackableMiddle(i), buildState.getCurrentOffset())) {
+ break;
+ }
+
+ buildState.addOffset(getPerStackOffset());
+ stackCount++;
+ }
+ if (stackCount < getMinStacks()) return buildState.failBuilding();
+
+ if (!checkPiece(getStackableStop(), buildState.stopBuilding())) {
+ return buildState.failBuilding();
+ }
+
+ calculateTier();
+ if (!calculateMucMultipliers()) {
+ return false;
+ }
+ calculateParallels();
+ updatePowerLogic();
+ return tier > 0;
+ }
+
+ protected boolean calculateMucMultipliers() {
+ Map<UpgradeCasings, int[]> mucMap = getMucMap();
+ int[] heaterList = mucMap.get(UpgradeCasings.Heater);
+ int[] insulatorList = mucMap.get(UpgradeCasings.Insulator);
+ int totalHeaterCount = Arrays.stream(heaterList)
+ .sum();
+ int totalInsulatorCount = Arrays.stream(insulatorList)
+ .sum();
+ if (totalHeaterCount + totalInsulatorCount < stackCount || totalInsulatorCount > totalHeaterCount) {
+ return false;
+ }
+ if (totalInsulatorCount > 0) {
+ // To be improved later, when more MUCs are added
+ // durationMultiplier = 1.0 / totalHeaterCount;
+ euTickMultiplier = 1.0 / totalInsulatorCount;
+ }
+ return true;
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Distillation.getId();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Coke Oven")
+ .addInfo("Controller for the Layered Coke Battery")
+ .addSeparator()
+ .beginVariableStructureBlock(7, 9, 2 + getMinStacks(), 2 + getMaxStacks(), 7, 9, true)
+ .addController("Bottom Front Center")
+ .addCasingInfoExactly("Test Casing", 60, false)
+ .addEnergyHatch("Any bottom layer casing")
+ .addInputHatch("Any non-optional external facing casing on the stacks")
+ .addInputBus("Any non-optional external facing casing on the stacks")
+ .addOutputHatch("Any non-optional external facing casing on the stacks")
+ .addOutputBus("Any non-optional external facing casing on the stacks")
+ .addStructureInfo(
+ String.format("Stackable middle stacks between %d-%d time(s).", getMinStacks(), getMaxStacks()))
+ .toolTipFinisher("Wildcard");
+ return tt;
+ }
+
+ @Override
+ public int getMinStacks() {
+ return 0;
+ }
+
+ @Override
+ public int getMaxStacks() {
+ return 20;
+ }
+
+ public Vec3Impl getMegaPositionOffset() {
+ return STRUCTURE_OFFSET_MEGA_POSITION;
+ }
+
+ @Override
+ public Vec3Impl getStartingStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_START;
+ }
+
+ @Override
+ public Vec3Impl getPerStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STACK;
+ }
+
+ @Override
+ public Vec3Impl getAfterLastStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STOP;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ protected ResourceLocation getActivitySoundLoop() {
+ return SoundResource.IC2_MACHINES_MACERATOR_OP.resourceLocation;
+ }
+
+ @Override
+ @Nonnull
+ protected LayeredCokeBatteryProcessingLogic createProcessingLogic() {
+ return new LayeredCokeBatteryProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java
index dda7eb9420..dfdacfe7f2 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java
@@ -1,6 +1,5 @@
package gregtech.common.tileentities.machines.multiblock;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
@@ -8,27 +7,20 @@ import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.*;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
-
-import org.apache.commons.lang3.tuple.Pair;
+import javax.annotation.Nonnull;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
import com.gtnewhorizon.structurelib.structure.StructureDefinition;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
-import cpw.mods.fml.relauncher.Side;
-import cpw.mods.fml.relauncher.SideOnly;
-import gregtech.api.enums.SoundResource;
-import gregtech.api.enums.TierEU;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
import gregtech.api.multitileentity.multiblock.base.StackableController;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.RecipeMaps;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
-import gregtech.api.util.GT_Recipe;
+import gregtech.common.tileentities.machines.multiblock.logic.MaceratorProcessingLogic;
-public class Macerator extends StackableController<Macerator> {
+public class Macerator extends StackableController<Macerator, MaceratorProcessingLogic> {
private static IStructureDefinition<Macerator> STRUCTURE_DEFINITION = null;
@@ -45,25 +37,23 @@ public class Macerator extends StackableController<Macerator> {
public IStructureDefinition<Macerator> getStructureDefinition() {
if (STRUCTURE_DEFINITION == null) {
STRUCTURE_DEFINITION = StructureDefinition.<Macerator>builder()
- .addShape(STACKABLE_TOP, transpose(new String[][] { { " CCC ", "CCCCC", "CCCCC", "CCCCC", " CCC " }, }))
+ .addShape(
+ STACKABLE_STOP,
+ transpose(new String[][] { { " CCC ", "CCCCC", "CCCCC", "CCCCC", " CCC " }, }))
.addShape(
STACKABLE_MIDDLE,
transpose(new String[][] { { " BBB ", " B---B ", "DC---CD", " B---B ", " BBB " }, }))
.addShape(
- STACKABLE_BOTTOM,
+ STACKABLE_START,
transpose(new String[][] { { " G~F ", "AAAAA", "AAAAA", "AAAAA", " AAA " }, }))
- .addElement('A', ofChain(addMultiTileCasing("gt.multitileentity.casings", getCasingMeta(), ENERGY_IN)))
+ .addElement('A', ofMuTECasings(ENERGY_IN, GT_MultiTileCasing.Macerator.getCasing()))
.addElement(
'B',
- ofChain(
- addMultiTileCasing(
- "gt.multitileentity.casings",
- getCasingMeta(),
- FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT)))
- .addElement('C', addMultiTileCasing("gt.multitileentity.casings", getCasingMeta(), NOTHING))
- .addElement('D', addMultiTileCasing("gt.multitileentity.casings", getCasingMeta(), NOTHING))
- .addElement('F', addMotorCasings(NOTHING))
- .addElement('G', addMultiTileCasing("gt.multitileentity.component.casings", 10000, NOTHING))
+ ofMuTECasings(FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('C', ofMuTECasings(NOTHING, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('D', ofMuTECasings(NOTHING, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('F', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('G', ofMuTECasings(NOTHING, INVENTORY_CASINGS))
.build();
}
return STRUCTURE_DEFINITION;
@@ -135,42 +125,8 @@ public class Macerator extends StackableController<Macerator> {
}
@Override
- protected boolean checkRecipe() {
- if (isSeparateInputs()) {
- for (Pair<ItemStack[], String> tItemInputs : getItemInputsForEachInventory()) {
- if (processRecipe(tItemInputs.getLeft(), tItemInputs.getRight())) {
- return true;
- }
- }
- return false;
- } else {
- ItemStack[] tItemInputs = getInventoriesForInput().getStacks()
- .toArray(new ItemStack[0]);
- return processRecipe(tItemInputs, null);
- }
- }
-
- private boolean processRecipe(ItemStack[] aItemInputs, String aInventory) {
- RecipeMap<?> tRecipeMap = RecipeMaps.maceratorRecipes;
- GT_Recipe tRecipe = tRecipeMap.findRecipe(this, false, TierEU.IV, null, aItemInputs);
- if (tRecipe == null) {
- return false;
- }
-
- if (!tRecipe.isRecipeInputEqual(true, false, 1, null, aItemInputs)) {
- return false;
- }
-
- setDuration(tRecipe.mDuration);
- setEut(tRecipe.mEUt);
-
- setItemOutputs(aInventory, tRecipe.mOutputs);
- return true;
- }
-
- @SideOnly(Side.CLIENT)
- @Override
- protected ResourceLocation getActivitySoundLoop() {
- return SoundResource.IC2_MACHINES_MACERATOR_OP.resourceLocation;
+ @Nonnull
+ protected MaceratorProcessingLogic createProcessingLogic() {
+ return new MaceratorProcessingLogic();
}
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java
new file mode 100644
index 0000000000..59879e30c7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java
@@ -0,0 +1,12 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+import gregtech.api.recipe.RecipeMaps;
+
+public class AdvChemicalProcessorProcessingLogic
+ extends ComplexParallelProcessingLogic<AdvChemicalProcessorProcessingLogic> {
+
+ public AdvChemicalProcessorProcessingLogic() {
+ setRecipeMap(RecipeMaps.multiblockChemicalReactorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
index 046bb4a114..1534b05bc3 100644
--- a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
@@ -5,17 +5,19 @@ import static net.minecraftforge.oredict.OreDictionary.getOreID;
import static net.minecraftforge.oredict.OreDictionary.getOreIDs;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
-import gregtech.api.logic.ProcessingLogic;
-import gregtech.api.recipe.check.CheckRecipeResult;
-import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_OreDictUnificator;
-public class CokeOvenProcessingLogic extends ProcessingLogic {
+public class CokeOvenProcessingLogic extends MuTEProcessingLogic<CokeOvenProcessingLogic> {
private static final int NORMAL_RECIPE_TIME = 1800;
private static final int WOOD_ORE_ID = getOreID("logWood");
@@ -27,26 +29,33 @@ public class CokeOvenProcessingLogic extends ProcessingLogic {
private static final int SUGAR_CHARCOAL_ORE_ID = getOreID("itemCharcoalSugar");
private int timeMultiplier = 1;
+ @Nonnull
@Override
- public @Nonnull CheckRecipeResult process() {
- if (inputItems == null || inputItems[0] == null) {
- return CheckRecipeResultRegistry.NO_RECIPE;
- }
- ItemStack input = inputItems[0];
- int originalStackSize = input.stackSize;
- ItemStack output = findRecipe(input);
- if (currentOutputItems != null && currentOutputItems[0] != null && !currentOutputItems[0].isItemEqual(output)) {
- return CheckRecipeResultRegistry.NO_RECIPE;
+ protected Object findRecipe(@Nullable RecipeMap<?> map, @Nonnull ItemInventoryLogic itemInput,
+ @Nonnull FluidInventoryLogic fluidInput) {
+ for (ItemStack item : itemInput.getStoredItems()) {
+ ItemStack output = findRecipe(item);
+ if (output != null) {
+ ItemStack input = item.copy();
+ input.stackSize = 1;
+ return null;
+ // return FindRecipeResult.ofSuccess(
+ // GT_Values.RA.stdBuilder()
+ // .itemInputs(input)
+ // .itemOutputs(output)
+ // .noFluidInputs()
+ // .noFluidOutputs()
+ // .duration(NORMAL_RECIPE_TIME * timeMultiplier)
+ // .eut(0)
+ // .build()
+ // .get());
+ }
}
- input.stackSize -= 1;
- setDuration(NORMAL_RECIPE_TIME * timeMultiplier);
- setOutputItems(output);
-
- return originalStackSize > input.stackSize ? CheckRecipeResultRegistry.SUCCESSFUL
- : CheckRecipeResultRegistry.NO_RECIPE;
+ return null;
}
- protected ItemStack findRecipe(ItemStack input) {
+ @Nullable
+ private ItemStack findRecipe(@Nonnull ItemStack input) {
for (int oreId : getOreIDs(input)) {
if (oreId == COAL_ORE_ID) {
return GT_OreDictUnificator.get("fuelCoke", null, 1);
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java
new file mode 100644
index 0000000000..6f27c9a0e6
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+
+public class DistillationTowerProcessingLogic extends ComplexParallelProcessingLogic<DistillationTowerProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java
new file mode 100644
index 0000000000..3f4a6bfe70
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+
+public class LaserEngraverProcessingLogic extends ComplexParallelProcessingLogic<LaserEngraverProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java
new file mode 100644
index 0000000000..b2e43b6fa9
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public class LayeredCokeBatteryProcessingLogic extends MuTEProcessingLogic<LayeredCokeBatteryProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java
new file mode 100644
index 0000000000..3f7d8a25f7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public class MaceratorProcessingLogic extends MuTEProcessingLogic<MaceratorProcessingLogic> {
+
+}