aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/multiblock/base
diff options
context:
space:
mode:
authormiozune <miozune@gmail.com>2023-05-28 18:21:42 +0900
committerGitHub <noreply@github.com>2023-05-28 11:21:42 +0200
commit9af741164c5b59c4d884aba48ebeab7db5442d63 (patch)
tree5bbbbb5feb67db85aefd5f21fd885a1a0ab71c78 /src/main/java/gregtech/api/multitileentity/multiblock/base
parent24ad01683a084bebd26152b803ee19bffe78213c (diff)
downloadGT5-Unofficial-9af741164c5b59c4d884aba48ebeab7db5442d63.tar.gz
GT5-Unofficial-9af741164c5b59c4d884aba48ebeab7db5442d63.tar.bz2
GT5-Unofficial-9af741164c5b59c4d884aba48ebeab7db5442d63.zip
Add new mode for void protection & implement it for more multis (#2024)
* Void protection improvements * Rename methods: isXXXButtonEnabled -> supportsXXX * Adjust texture for forbidden * Add MultiBlockFeatureSupportDumpers * Fix oversight in PCBFactory * Revert void protection support for PA * Rename class: ControllerWithButtons -> ControllerWithOptionalFeatures
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/multiblock/base')
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java12
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java262
2 files changed, 82 insertions, 192 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
index 3839c949db..808c16a200 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
@@ -1,7 +1,5 @@
package gregtech.api.multitileentity.multiblock.base;
-import static mcp.mobius.waila.api.SpecialChars.*;
-
import java.util.ArrayList;
import java.util.List;
import java.util.stream.LongStream;
@@ -123,7 +121,7 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
boolean result = processingLogic.setInputItems(index, getInputItems(index))
.setInputFluids(index, getInputFluids(index))
.setTileEntity(this)
- .setVoidProtection(index, isVoidProtectionEnabled(index))
+ .setVoidProtection(index, isVoidProtectionEnabledForItem(index), isVoidProtectionEnabledForFluid(index))
.setEut(index, getEutForComplexParallel(index))
.setPerfectOverclock(hasPerfectOverclock())
.process(index);
@@ -181,8 +179,12 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
return getInputFluids();
}
- protected boolean isVoidProtectionEnabled(int index) {
- return !voidExcess;
+ protected boolean isVoidProtectionEnabledForItem(int index) {
+ return protectsExcessItem();
+ }
+
+ protected boolean isVoidProtectionEnabledForFluid(int index) {
+ return protectsExcessFluid();
}
protected boolean hasPerfectOverclock() {
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
index 5bec3f1752..afc456f41a 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
@@ -25,7 +25,6 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
-import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
@@ -52,17 +51,15 @@ import com.gtnewhorizon.structurelib.structure.IStructureElementChain;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
-import com.gtnewhorizons.modularui.api.drawable.UITexture;
import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
import com.gtnewhorizons.modularui.api.forge.ListItemHandler;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
import com.gtnewhorizons.modularui.api.screen.*;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
import com.gtnewhorizons.modularui.api.widget.Widget;
-import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
import com.gtnewhorizons.modularui.common.widget.Scrollable;
@@ -76,11 +73,12 @@ import gnu.trove.list.array.TIntArrayList;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.SoundResource;
import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.VoidingMode;
import gregtech.api.fluid.FluidTankGT;
import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.IDescribable;
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
import gregtech.api.logic.PowerLogic;
import gregtech.api.logic.ProcessingLogic;
import gregtech.api.logic.interfaces.PowerLogicHost;
@@ -105,8 +103,9 @@ import mcp.mobius.waila.api.IWailaDataAccessor;
/**
* Multi Tile Entities - or MuTEs - don't have dedicated hatches, but their casings can become hatches.
*/
-public abstract class Controller<T extends Controller<T>> extends MultiTileBasicMachine implements IAlignment,
- IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable {
+public abstract class Controller<T extends Controller<T>> extends MultiTileBasicMachine
+ implements IAlignment, IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips,
+ ISurvivalConstructable, ControllerWithOptionalFeatures {
public static final String ALL_INVENTORIES_NAME = "all";
@@ -132,7 +131,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
private String inventoryName;
private String tankName;
protected boolean separateInputs = false;
- protected boolean voidExcess = false;
+ protected VoidingMode voidingMode = supportsVoidProtection() ? VoidingMode.VOID_NONE : VoidingMode.VOID_ALL;
protected boolean batchMode = false;
protected boolean recipeLock = false;
/** If this is set to true, the machine will get default WAILA behavior */
@@ -207,7 +206,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
saveUpgradeInventoriesToNBT(nbt);
saveUpgradeTanksToNBT(nbt);
- nbt.setBoolean(NBT.VOID_EXCESS, voidExcess);
+ nbt.setString(NBT.VOIDING_MODE, voidingMode.name);
nbt.setBoolean(NBT.SEPARATE_INPUTS, separateInputs);
nbt.setBoolean(NBT.RECIPE_LOCK, recipeLock);
nbt.setBoolean(NBT.BATCH_MODE, batchMode);
@@ -296,7 +295,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
loadUpgradeInventoriesFromNBT(nbt);
loadUpgradeTanksFromNBT(nbt);
- voidExcess = nbt.getBoolean(NBT.VOID_EXCESS);
+ voidingMode = VoidingMode.fromName(nbt.getString(NBT.VOIDING_MODE));
separateInputs = nbt.getBoolean(NBT.SEPARATE_INPUTS);
recipeLock = nbt.getBoolean(NBT.RECIPE_LOCK);
batchMode = nbt.getBoolean(NBT.BATCH_MODE);
@@ -1781,7 +1780,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
.withOffset(2, 4))
.addTooltip(getLocalName())
.setPos(20 * (page - 1), -20))
- .addPage(createMainPage().setSize(getGUIWidth(), getGUIHeight()));
+ .addPage(createMainPage(builder).setSize(getGUIWidth(), getGUIHeight()));
if (hasItemInput()) {
tabs.addTabButton(
new TabButton(page++)
@@ -1864,33 +1863,25 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
builder.widget(tabs);
}
- protected MultiChildWidget createMainPage() {
+ protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
MultiChildWidget page = new MultiChildWidget();
page.addChild(
new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
.setPos(7, 4)
.setSize(160, 75))
- .addChild(createButtons());
+ .addChild(createButtons(builder));
return page;
}
- protected MultiChildWidget createButtons() {
+ protected MultiChildWidget createButtons(IWidgetBuilder<?> builder) {
MultiChildWidget buttons = new MultiChildWidget();
buttons.setSize(16, 167)
.setPos(7, 86);
- buttons.addChild(createPowerSwitchButton())
- .addChild(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> {
- if (val) enableWorking();
- else disableWorking();
- }))
- .addChild(createVoidExcessButton())
- .addChild(new FakeSyncWidget.BooleanSyncer(() -> voidExcess, val -> voidExcess = val))
- .addChild(createInputSeparationButton())
- .addChild(new FakeSyncWidget.BooleanSyncer(() -> separateInputs, val -> separateInputs = val))
- .addChild(createBatchModeButton())
- .addChild(new FakeSyncWidget.BooleanSyncer(() -> batchMode, val -> batchMode = val))
- .addChild(createLockToSingleRecipeButton())
- .addChild(new FakeSyncWidget.BooleanSyncer(() -> recipeLock, val -> recipeLock = val));
+ buttons.addChild(createPowerSwitchButton(builder))
+ .addChild(createVoidExcessButton(builder))
+ .addChild(createInputSeparationButton(builder))
+ .addChild(createBatchModeButton(builder))
+ .addChild(createLockToSingleRecipeButton(builder));
return buttons;
}
@@ -1966,195 +1957,92 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
.setPos(52, 7);
}
- protected ButtonWidget createPowerSwitchButton() {
- ButtonWidget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (isAllowedToWork()) {
- disableWorking();
- } else {
- enableWorking();
- }
- })
- .setPlayClickSoundResource(
- () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation
- : SoundResource.GUI_BUTTON_DOWN.resourceLocation);
- button.setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- ret.add(GT_UITextures.BUTTON_STANDARD);
- if (isAllowedToWork()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF);
- }
- return ret.toArray(new IDrawable[0]);
- })
- .setPos(144, 0)
- .setSize(16, 16);
- button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY);
- return button;
- }
-
- protected ButtonWidget createVoidExcessButton() {
- ButtonWidget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (isVoidExcessButtonEnabled()) {
- voidExcess = !voidExcess;
- }
- })
- .setPlayClickSound(true);
- button.setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- ret.add(GT_UITextures.BUTTON_STANDARD);
- if (isVoidExcessButtonEnabled()) {
- if (isVoidExcessEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ON);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_OFF);
- }
- } else {
- if (isVoidExcessEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ON_DISABLED);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_OFF_DISABLED);
- }
- }
- return ret.toArray(new IDrawable[0]);
- })
- .setPos(54, 0)
- .setSize(16, 16);
- button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.void_excess"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY);
- return button;
+ @Override
+ public Pos2d getPowerSwitchButtonPos() {
+ return new Pos2d(144, 0);
}
- protected boolean isVoidExcessEnabled() {
- return voidExcess;
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
}
- protected boolean isVoidExcessButtonEnabled() {
- return true;
+ @Override
+ public VoidingMode getVoidingMode() {
+ return voidingMode;
}
- protected ButtonWidget createInputSeparationButton() {
- Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (isInputSeparationButtonEnabled()) {
- separateInputs = !separateInputs;
- }
- })
- .setPlayClickSound(true)
- .setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- ret.add(GT_UITextures.BUTTON_STANDARD);
- if (isInputSeparationButtonEnabled()) {
- if (isInputSeparationEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF);
- }
- } else {
- if (isInputSeparationEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED);
- }
- }
- return ret.toArray(new IDrawable[0]);
- })
- .setPos(36, 0)
- .setSize(16, 16);
- button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY);
- return (ButtonWidget) button;
+ @Override
+ public void setVoidingMode(VoidingMode mode) {
+ this.voidingMode = mode;
}
- protected boolean isInputSeparationEnabled() {
- return separateInputs;
+ @Override
+ public Pos2d getVoidingModeButtonPos() {
+ return new Pos2d(54, 0);
}
- protected boolean isInputSeparationButtonEnabled() {
+ @Override
+ public boolean supportsInputSeparation() {
return true;
}
- protected ButtonWidget createBatchModeButton() {
- Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (isBatchModeButtonEnabled()) {
- batchMode = !batchMode;
- }
- })
- .setPlayClickSound(true)
- .setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- ret.add(GT_UITextures.BUTTON_STANDARD);
- if (isBatchModeButtonEnabled()) {
- if (isBatchModeEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF);
- }
- } else {
- if (isBatchModeEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED);
- }
- }
- return ret.toArray(new IDrawable[0]);
- })
- .setPos(18, 0)
- .setSize(16, 16);
- button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY);
- return (ButtonWidget) button;
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return separateInputs;
+ }
+
+ @Override
+ public void setInputSeparation(boolean enabled) {
+ this.separateInputs = enabled;
+ }
+
+ @Override
+ public Pos2d getInputSeparationButtonPos() {
+ return new Pos2d(36, 0);
}
- protected boolean isBatchModeButtonEnabled() {
+ @Override
+ public boolean supportsBatchMode() {
return true;
}
- protected boolean isBatchModeEnabled() {
+ @Override
+ public boolean isBatchModeEnabled() {
return batchMode;
}
- protected ButtonWidget createLockToSingleRecipeButton() {
- Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (supportsSingleRecipeLocking()) {
- recipeLock = !recipeLock;
- }
- })
- .setPlayClickSound(true)
- .setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- ret.add(GT_UITextures.BUTTON_STANDARD);
- if (supportsSingleRecipeLocking()) {
- if (isRecipeLockingEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED);
- }
- } else {
- if (isRecipeLockingEnabled()) {
- ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED);
- } else {
- ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED);
- }
- }
- return ret.toArray(new IDrawable[0]);
- })
- .setPos(0, 0)
- .setSize(16, 16);
- button.addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY);
- return (ButtonWidget) button;
+ @Override
+ public void setBatchMode(boolean mode) {
+ this.batchMode = mode;
}
- protected boolean supportsSingleRecipeLocking() {
+ @Override
+ public Pos2d getBatchModeButtonPos() {
+ return new Pos2d(18, 0);
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
return false;
}
- protected boolean isRecipeLockingEnabled() {
+ @Override
+ public boolean isRecipeLockingEnabled() {
return recipeLock;
}
@Override
+ public void setRecipeLocking(boolean enabled) {
+ this.recipeLock = enabled;
+ }
+
+ @Override
+ public Pos2d getRecipeLockingButtonPos() {
+ return new Pos2d(0, 0);
+ }
+
+ @Override
public ModularWindow createWindowGUI(UIBuildContext buildContext) {
return createWindow(buildContext);
}