From 9af741164c5b59c4d884aba48ebeab7db5442d63 Mon Sep 17 00:00:00 2001 From: miozune Date: Sun, 28 May 2023 18:21:42 +0900 Subject: 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 --- .../multiblock/base/ComplexParallelController.java | 12 +- .../multiblock/base/Controller.java | 262 ++++++--------------- 2 files changed, 82 insertions(+), 192 deletions(-) (limited to 'src/main/java/gregtech/api/multitileentity/multiblock/base') 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> extends MultiTileBasicMachine implements IAlignment, - IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable { +public abstract class Controller> 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> 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> 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> 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> 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> 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,194 +1957,91 @@ public abstract class Controller> 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 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 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 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 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 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); -- cgit