diff options
author | Yannick Marcotte-Gourde <yannickmg@gmail.com> | 2023-07-28 09:03:54 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-28 15:03:54 +0200 |
commit | 190d29ec4eecb6508a91288639b1b6194e077fda (patch) | |
tree | 900e31baccfaefa5972022db37d605c42ef7025b /src/main/java/gregtech/api | |
parent | edf63121630cde22a30b78a4ad7d7fff3d488d93 (diff) | |
download | GT5-Unofficial-190d29ec4eecb6508a91288639b1b6194e077fda.tar.gz GT5-Unofficial-190d29ec4eecb6508a91288639b1b6194e077fda.tar.bz2 GT5-Unofficial-190d29ec4eecb6508a91288639b1b6194e077fda.zip |
Less hostile user interfaces (Buffer/Filter/Input bus) (#2165)
* Made Emit Energy button a CycleButtonWidget
* Made Emit Redstone button a CycleButtonWidget
* Made Invert Redstone button a CycleButtonWidget
* Made Stocking Mode button a CycleButtonWidget
* Spotless apply
* Made Invert Filter button a CycleButtonWidget
* public bInvertFilter -> protected invertFilter
* Deduplicated filter code
* Made Allow NBT button a CycleButtonWidget
* Made Ignore NBT button a CycleButtonWidget
* public bNBTAllowed -> private allowNbt
* public bNBTAllowed -> private ignoreNbt
* Grey extended tooltips
* Don't hardcode multiline tooltips
* Document hidden functionality
* Cleaned numeric constants
* Fixed string constant declaration
* Named constants in filter
* Unify filter redstone behavior
* Fix cover filter mode being inverted
so that the displayed mode is the active one
* Less magic numbers
* Allow right clicking recipe filter
* Display only machine type in recipe filter and cycle through compatible machines
* Buffer tooltips show output voltage to clarify their role as passthroughs
* Added more info to Emit EU/Redstone buttons
* Added Sorting mode button to buffers/filters
* Added Sorting mode button and stack limit button to input buses
* Don't cycle prefixes when clicking with itemstack
* Fixed tooltips to work off of the inventory
* Fix RecipeFilter losing filter
* Support multiblock machines
* Use ModularUi syncers to sync state with client
Thanks minecraft7771!
* Grey text for recipe filter helper text
* AnimatedTooltipHandler -> EnumChatFormatting
* Explicited RecipeFilter filter building
* Specify color for empty slot tooltip
* Don't cache new uses of GT5U.MBTT.MachineType.
Also corrected MachineType::description
* Removed unused getItemExtraTooltip
* Multiple returns in getItemStackMachineRecipeMap
Diffstat (limited to 'src/main/java/gregtech/api')
8 files changed, 315 insertions, 188 deletions
diff --git a/src/main/java/gregtech/api/enums/MachineType.java b/src/main/java/gregtech/api/enums/MachineType.java index ecf894c92f..d0183051b1 100644 --- a/src/main/java/gregtech/api/enums/MachineType.java +++ b/src/main/java/gregtech/api/enums/MachineType.java @@ -1,9 +1,8 @@ package gregtech.api.enums; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler; - public enum MachineType { ALLOY_SMELTER(FunnyTexts.ALLOY_SMELTER, "gt.recipe.alloysmelter"), @@ -107,26 +106,29 @@ public enum MachineType { static final String WIREMILL = "gt.recipe.wiremill.description"; } - private static final String TT_machineType = StatCollector.translateToLocal("GT5U.MBTT.MachineType"); + private static final String TT_machineType = "GT5U.MBTT.MachineType"; private final String name; private final String description; MachineType(String machineDescription, String machineType) { - this.description = StatCollector.translateToLocal(machineDescription); - this.name = StatCollector.translateToLocal(machineType); + this.description = machineDescription; + this.name = machineType; } public String type() { - return this.name; + return StatCollector.translateToLocal(this.name); } public String description() { - return this.name; + return StatCollector.translateToLocal(this.description); } public String[] tooltipDescription() { - return new String[] { this.description, - TT_machineType + ": " + AnimatedTooltipHandler.YELLOW + this.name + AnimatedTooltipHandler.RESET }; + return new String[] { description(), + StatCollector.translateToLocal(TT_machineType) + ": " + + EnumChatFormatting.YELLOW + + type() + + EnumChatFormatting.RESET }; } } diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java index 7a21dad8cd..8d0a63702c 100644 --- a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java +++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java @@ -327,6 +327,10 @@ public class GT_UITextures { public static final UITexture OVERLAY_BUTTON_PRINT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/print"); public static final UITexture OVERLAY_BUTTON_TRANSPOSE = UITexture .fullImage(GregTech.ID, "gui/overlay_button/transpose"); + public static final UITexture OVERLAY_BUTTON_SORTING_MODE = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/sorting_mode"); + public static final UITexture OVERLAY_BUTTON_ONE_STACK_LIMIT = UITexture + .fullImage(GregTech.ID, "gui/overlay_button/one_stack_limit"); public static final UITexture OVERLAY_BUTTON_BOUNDING_BOX = UITexture .fullImage(GregTech.ID, "gui/overlay_button/bounding_box"); public static final UITexture OVERLAY_BUTTON_MINUS_SMALL = UITexture diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java index 322f62ac09..2ba0ba94f2 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java @@ -15,10 +15,10 @@ import java.util.Arrays; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; -import com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.screen.ModularWindow; @@ -51,7 +51,7 @@ import gregtech.common.power.SteamPower; */ public abstract class GT_MetaTileEntity_BasicMachine_Bronze extends GT_MetaTileEntity_BasicMachine { - private static final String TT_machineType = StatCollector.translateToLocal("GT5U.MBTT.MachineType"); + private static final String TT_machineType = "GT5U.MBTT.MachineType"; private static final int NEEDS_STEAM_VENTING = 64; public boolean mNeedsSteamVenting = false; @@ -393,10 +393,10 @@ public abstract class GT_MetaTileEntity_BasicMachine_Bronze extends GT_MetaTileE @Override public String[] getDescription() { String[] description = Arrays.copyOf(mDescriptionArray, mDescriptionArray.length + 1); - description[mDescriptionArray.length] = TT_machineType + ": " - + AnimatedTooltipHandler.YELLOW + description[mDescriptionArray.length] = StatCollector.translateToLocal(TT_machineType) + ": " + + EnumChatFormatting.YELLOW + StatCollector.translateToLocal(this.getRecipeList().mUnlocalizedName) - + AnimatedTooltipHandler.RESET; + + EnumChatFormatting.RESET; return description; } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java index f88bdd0553..1fc347da1f 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java @@ -11,30 +11,40 @@ import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP; import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP_GLOW; import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.IntStream; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import com.gtnewhorizons.modularui.api.drawable.UITexture; import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; import com.gtnewhorizons.modularui.common.widget.SlotGroup; import gregtech.api.gui.modularui.GT_UIInfos; import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.render.TextureFactory; +import gregtech.api.util.GT_TooltipDataCache; import gregtech.api.util.GT_Utility; -public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredMachineBlock { +public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredMachineBlock implements IAddUIWidgets { private static final int OUTPUT_INDEX = 0; private static final int ARROW_RIGHT_INDEX = 1; @@ -43,11 +53,19 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM private static final int ARROW_UP_INDEX = 4; private static final int FRONT_INDEX = 5; + private static final String EMIT_ENERGY_TOOLTIP = "GT5U.machines.emit_energy.tooltip"; + private static final String EMIT_REDSTONE_IF_FULL_TOOLTIP = "GT5U.machines.emit_redstone_if_full.tooltip"; + private static final String INVERT_REDSTONE_TOOLTIP = "GT5U.machines.invert_redstone.tooltip"; + private static final String STOCKING_MODE_TOOLTIP = "GT5U.machines.buffer_stocking_mode.tooltip"; + private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; + private static final int BUTTON_SIZE = 18; + public int mMaxStackSize = 64; public static int MAX = 8; public boolean bOutput = false, bRedstoneIfFull = false, bInvert = false, bStockingMode = false, bSortStacks = false; public int mSuccess = 0, mTargetStackSize = 0; + private int uiButtonCount = 0; public GT_MetaTileEntity_Buffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, String aDescription) { @@ -234,7 +252,8 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM @Override public long maxEUOutput() { - return bOutput ? V[mTier] : 0L; + // Return full value if we're an item and don't exist in the world for tooltip purposes + return getBaseMetaTileEntity().getWorld() == null || bOutput ? V[mTier] : 0L; } @Override @@ -276,12 +295,7 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM bOutput = aNBT.getBoolean("bOutput"); bRedstoneIfFull = aNBT.getBoolean("bRedstoneIfFull"); bSortStacks = aNBT.getBoolean("bSortStacks"); - if (aNBT.hasKey("bStockingMode")) { // Adding new key to existing NBT, need to protect if it is not there. - bStockingMode = aNBT.getBoolean("bStockingMode"); - } - if (aNBT.hasKey("bSortStacks")) { - bSortStacks = aNBT.getBoolean("bSortStacks"); - } + bStockingMode = aNBT.getBoolean("bStockingMode"); mTargetStackSize = aNBT.getInteger("mTargetStackSize"); } @@ -321,17 +335,18 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM } protected void handleRedstoneOutput(IGregTechTileEntity aBaseMetaTileEntity) { - if (bRedstoneIfFull) { - final boolean hasEmptySlots = IntStream.range(0, mInventory.length) - .anyMatch(i -> isValidSlot(i) && mInventory[i] == null); - Arrays.stream(ForgeDirection.VALID_DIRECTIONS) - .forEach( - side -> aBaseMetaTileEntity - .setInternalOutputRedstoneSignal(side, (byte) (bInvert ^ hasEmptySlots ? 0 : 15))); - } else { - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0); - } + int redstoneOutput = getRedstoneOutput(); + Arrays.stream(ForgeDirection.VALID_DIRECTIONS) + .forEach(side -> aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) redstoneOutput)); + } + + protected int getRedstoneOutput() { + return (!bRedstoneIfFull || (bInvert ^ hasEmptySlots())) ? 0 : 15; + } + + private boolean hasEmptySlots() { + return IntStream.range(0, mInventory.length) + .anyMatch(i -> isValidSlot(i) && mInventory[i] == null); } @Override @@ -463,87 +478,84 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM } protected void addEmitEnergyButton(ModularWindow.Builder builder) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bOutput = !bOutput; - if (bOutput) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("116", "Emit Energy to Outputside")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("117", "Don't emit Energy")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EMIT_ENERGY) - .setPos(7, 62) - .setSize(18, 18)); + builder.widget( + createToggleButton( + () -> bOutput, + val -> bOutput = val, + GT_UITextures.OVERLAY_BUTTON_EMIT_ENERGY, + this::getEmitEnergyButtonTooltip)); + } + + private GT_TooltipDataCache.TooltipData getEmitEnergyButtonTooltip() { + return mTooltipCache.getData( + EMIT_ENERGY_TOOLTIP, + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(V[mTier]) + + " (" + + GT_Utility.getColoredTierNameFromTier(mTier) + + EnumChatFormatting.GREEN + + ")" + + EnumChatFormatting.GRAY, + maxAmperesOut()); + } + + protected void addEmitRedstoneIfFullButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bRedstoneIfFull, + val -> bRedstoneIfFull = val, + GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE, + this::getEmitRedstoneIfFullButtonTooltip).setUpdateTooltipEveryTick(true)); } - protected void addEmitRedstoneButton(ModularWindow.Builder builder) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bRedstoneIfFull = !bRedstoneIfFull; - if (bRedstoneIfFull) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("118", "Emit Redstone if no Slot is free")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("119", "Don't emit Redstone")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE) - .setPos(25, 62) - .setSize(18, 18)); + private GT_TooltipDataCache.TooltipData getEmitRedstoneIfFullButtonTooltip() { + return mTooltipCache.getUncachedTooltipData( + EMIT_REDSTONE_IF_FULL_TOOLTIP, + StatCollector.translateToLocal(hasEmptySlots() ? "gui.yes" : "gui.no"), + getRedstoneOutput()); } protected void addInvertRedstoneButton(ModularWindow.Builder builder) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bInvert = !bInvert; - if (bInvert) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("120", "Invert Redstone")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("121", "Don't invert Redstone")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE) - .setPos(43, 62) - .setSize(18, 18)); + builder.widget( + createToggleButton( + () -> bInvert, + val -> bInvert = val, + GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE, + () -> mTooltipCache.getData(INVERT_REDSTONE_TOOLTIP))); } protected void addStockingModeButton(ModularWindow.Builder builder) { - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bStockingMode = !bStockingMode; - if (bStockingMode) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans( - "217", - "Stocking mode. Keeps this many items in destination input slots. This mode can be server unfriendly.")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans( - "218", - "Transfer size mode. Add exactly this many items in destination input slots as long as there is room.")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_STOCKING_MODE) - .setPos(61, 62) - .setSize(18, 18)); + builder.widget( + createToggleButton( + () -> bStockingMode, + val -> bStockingMode = val, + GT_UITextures.OVERLAY_BUTTON_STOCKING_MODE, + () -> mTooltipCache.getData(STOCKING_MODE_TOOLTIP))); + } + + protected void addSortStacksButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bSortStacks, + val -> bSortStacks = val, + GT_UITextures.OVERLAY_BUTTON_SORTING_MODE, + () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addCloseListener(() -> uiButtonCount = 0); + addEmitEnergyButton(builder); + } + + protected Widget createToggleButton(Supplier<Boolean> getter, Consumer<Boolean> setter, UITexture picture, + Supplier<GT_TooltipDataCache.TooltipData> tooltipDataSupplier) { + return new CycleButtonWidget().setToggle(getter, setter) + .setStaticTexture(picture) + .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) + .setSize(BUTTON_SIZE, BUTTON_SIZE) + .setGTTooltip(tooltipDataSupplier); } protected void addInventorySlots(ModularWindow.Builder builder) { diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java new file mode 100644 index 0000000000..896cb223f3 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java @@ -0,0 +1,106 @@ +package gregtech.api.metatileentity.implementations; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.util.GT_TooltipDataCache; + +public abstract class GT_MetaTileEntity_FilterBase extends GT_MetaTileEntity_Buffer { + + private static final String INVERT_FILTER_TOOLTIP = "GT5U.machines.invert_filter.tooltip"; + protected static final int FILTER_SLOT_INDEX = 9; + protected static final int NUM_INVENTORY_SLOTS = 9; + private static final String EMIT_REDSTONE_GRADUALLY_TOOLTIP = "GT5U" + ".machines.emit_redstone_gradually.tooltip"; + protected boolean invertFilter = false; + + public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount, + String[] aDescription) { + super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription); + } + + public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aInvSlotCount, aDescription, aTextures); + } + + @Override + public boolean isValidSlot(int aIndex) { + return aIndex < NUM_INVENTORY_SLOTS; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("bInvertFilter", this.invertFilter); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + this.invertFilter = aNBT.getBoolean("bInvertFilter"); + } + + @Override + protected int getRedstoneOutput() { + if (!bRedstoneIfFull) { + return 0; + } + int redstoneOutput = getEmptySlots(); + if (!bInvert) redstoneOutput = NUM_INVENTORY_SLOTS - redstoneOutput; + return redstoneOutput; + } + + private int getEmptySlots() { + int emptySlots = 0; + for (int i = 0; i < NUM_INVENTORY_SLOTS; i++) { + if (mInventory[i] == null) ++emptySlots; + } + return emptySlots; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + addSortStacksButton(builder); + addEmitRedstoneGraduallyButton(builder); + addInvertRedstoneButton(builder); + addInvertFilterButton(builder); + } + + private void addEmitRedstoneGraduallyButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> bRedstoneIfFull, + val -> bRedstoneIfFull = val, + GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE, + this::getEmitRedstoneGraduallyButtonTooltip).setUpdateTooltipEveryTick(true)); + } + + private GT_TooltipDataCache.TooltipData getEmitRedstoneGraduallyButtonTooltip() { + return mTooltipCache + .getUncachedTooltipData(EMIT_REDSTONE_GRADUALLY_TOOLTIP, getEmptySlots(), getRedstoneOutput()); + } + + private void addInvertFilterButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> invertFilter, + val -> invertFilter = val, + GT_UITextures.OVERLAY_BUTTON_INVERT_FILTER, + () -> mTooltipCache.getData(INVERT_FILTER_TOOLTIP))); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java index 858e87d43e..0102b698dd 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java @@ -2,10 +2,13 @@ package gregtech.api.metatileentity.implementations; import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN; import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -13,11 +16,15 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import com.gtnewhorizons.modularui.api.drawable.UITexture; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; import gregtech.GT_Mod; import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.IConfigurationCircuitSupport; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.modularui.IAddUIWidgets; @@ -27,16 +34,22 @@ import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_ClientPreference; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Recipe.GT_Recipe_Map; +import gregtech.api.util.GT_TooltipDataCache; import gregtech.api.util.GT_Utility; import gregtech.api.util.extensions.ArrayExt; public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch implements IConfigurationCircuitSupport, IAddUIWidgets { + private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip"; + private static final String ONE_STACK_LIMIT_TOOLTIP = "GT5U.machines.one_stack_limit.tooltip"; + private static final int BUTTON_SIZE = 18; + public GT_Recipe_Map mRecipeMap = null; public boolean disableSort; public boolean disableFilter = true; public boolean disableLimited = true; + private int uiButtonCount = 0; public GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier) { this(id, name, nameRegional, tier, getSlots(tier) + 1); @@ -268,8 +281,27 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch return true; } + private void addSortStacksButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> !disableSort, + val -> disableSort = !val, + GT_UITextures.OVERLAY_BUTTON_SORTING_MODE, + () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP))); + } + + private void addOneStackLimitButton(ModularWindow.Builder builder) { + builder.widget(createToggleButton(() -> !disableLimited, val -> { + disableLimited = !val; + updateSlots(); + }, GT_UITextures.OVERLAY_BUTTON_ONE_STACK_LIMIT, () -> mTooltipCache.getData(ONE_STACK_LIMIT_TOOLTIP))); + } + @Override public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + buildContext.addCloseListener(() -> uiButtonCount = 0); + addSortStacksButton(builder); + addOneStackLimitButton(builder); switch (mTier) { case 0 -> getBaseMetaTileEntity().add1by1Slot(builder); case 1 -> getBaseMetaTileEntity().add2by2Slots(builder); @@ -277,4 +309,15 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch default -> getBaseMetaTileEntity().add4by4Slots(builder); } } + + private Widget createToggleButton(Supplier<Boolean> getter, Consumer<Boolean> setter, UITexture picture, + Supplier<GT_TooltipDataCache.TooltipData> tooltipDataSupplier) { + return new CycleButtonWidget().setToggle(getter, setter) + .setStaticTexture(picture) + .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62) + .setSize(BUTTON_SIZE, BUTTON_SIZE) + .setGTTooltip(tooltipDataSupplier); + } } diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java index 63b8160262..cb293e51a9 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java @@ -1,7 +1,7 @@ package gregtech.api.metatileentity.implementations; -import java.util.Collections; import java.util.List; +import java.util.function.Function; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -11,23 +11,18 @@ import com.gtnewhorizons.modularui.api.drawable.Text; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; import com.gtnewhorizons.modularui.common.widget.SlotGroup; import com.gtnewhorizons.modularui.common.widget.SlotWidget; import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.modularui.IAddUIWidgets; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.util.GT_Utility; -public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_Buffer implements IAddUIWidgets { +public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_FilterBase { - public static final int BUFFER_SLOT_COUNT = 9; - public static final int SPECIAL_SLOT_INDEX = 9; - public boolean bNBTAllowed = false; - public boolean bInvertFilter = false; + private static final String ALLOW_NBT_TOOLTIP = "GT5U.machines.allow_nbt.tooltip"; + private boolean allowNbt = false; public GT_MetaTileEntity_SpecialFilter(int aID, String aName, String aNameRegional, int aTier, String[] aDescription) { @@ -45,33 +40,26 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_ super(aName, aTier, aInvSlotCount, aDescription, aTextures); } - @Override - public boolean isValidSlot(int aIndex) { - return aIndex < 9; - } - public abstract void clickTypeIcon(boolean aRightClick, ItemStack aHandStack); @Override public void saveNBTData(NBTTagCompound aNBT) { super.saveNBTData(aNBT); - aNBT.setBoolean("bInvertFilter", this.bInvertFilter); - aNBT.setBoolean("bNBTAllowed", this.bNBTAllowed); + aNBT.setBoolean("bNBTAllowed", this.allowNbt); } @Override public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); - this.bInvertFilter = aNBT.getBoolean("bInvertFilter"); - this.bNBTAllowed = aNBT.getBoolean("bNBTAllowed"); + this.allowNbt = aNBT.getBoolean("bNBTAllowed"); } @Override public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack) { return (super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) - && ((this.bNBTAllowed) || (!aStack.hasTagCompound())) - && (this.isStackAllowed(aStack) != this.bInvertFilter); + && ((this.allowNbt) || (!aStack.hasTagCompound())) + && (this.isStackAllowed(aStack) != this.invertFilter); } protected abstract boolean isStackAllowed(ItemStack aStack); @@ -80,53 +68,18 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_ return null; } - protected List<String> getItemExtraTooltip() { - return null; + protected Function<List<String>, List<String>> getItemStackReplacementTooltip() { + return list -> list; } @Override public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { - addEmitEnergyButton(builder); - addEmitRedstoneButton(builder); - addInvertRedstoneButton(builder); - builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bInvertFilter = !bInvertFilter; - if (bInvertFilter) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("124", "Invert Filter")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("125", "Don't invert Filter")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_FILTER) - .setPos(61, 62) - .setSize(18, 18)) - .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - bNBTAllowed = !bNBTAllowed; - if (bNBTAllowed) { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("126", "Ignore NBT")); - } else { - GT_Utility.sendChatToPlayer( - widget.getContext() - .getPlayer(), - GT_Utility.trans("127", "NBT has to match")); - } - }) - .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_NBT) - .setPos(79, 62) - .setSize(18, 18)) - .widget( - new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(27, false)) - .setPos(6, 19) - .setSize(27, 24)) + super.addUIWidgets(builder, buildContext); + addAllowNbtButton(builder); + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(27, false)) + .setPos(6, 19) + .setSize(27, 24)) .widget( new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(42, true)) .setPos(53, 19) @@ -144,18 +97,16 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_ @Override public void buildTooltip(List<Text> tooltip) { - if (getEmptySlotTooltip() != null) { - tooltip.addAll(getEmptySlotTooltip()); - } super.buildTooltip(tooltip); + List<Text> emptySlotTooltip = getEmptySlotTooltip(); + if (emptySlotTooltip != null) { + tooltip.addAll(emptySlotTooltip); + } } @Override - public List<String> getExtraTooltip() { - if (getItemExtraTooltip() != null) { - return getItemExtraTooltip(); - } - return Collections.emptyList(); + public Function<List<String>, List<String>> getOverwriteItemStackTooltip() { + return getItemStackReplacementTooltip(); } }.disableShiftInsert() .setPos(34, 22) @@ -166,4 +117,13 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_ .build() .setPos(97, 4)); } + + private void addAllowNbtButton(ModularWindow.Builder builder) { + builder.widget( + createToggleButton( + () -> allowNbt, + val -> allowNbt = val, + GT_UITextures.OVERLAY_BUTTON_NBT, + () -> mTooltipCache.getData(ALLOW_NBT_TOOLTIP))); + } } diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java index 5bc2d0e9b1..708048cf42 100644 --- a/src/main/java/gregtech/api/util/GT_LanguageManager.java +++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java @@ -269,20 +269,20 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_113", "Outputs only Items"); addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only misc. Fluids"); addStringLocalization("Interaction_DESCRIPTION_Index_115", "Outputs nothing"); - addStringLocalization("Interaction_DESCRIPTION_Index_116", "Emit Energy to Outputside"); - addStringLocalization("Interaction_DESCRIPTION_Index_117", "Don't emit Energy"); - addStringLocalization("Interaction_DESCRIPTION_Index_118", "Emit Redstone if no Slot is free"); - addStringLocalization("Interaction_DESCRIPTION_Index_119", "Don't emit Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_120", "Invert Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_121", "Don't invert Redstone"); + // 116 moved to lang files + // 117 obsolete + // 118 moved to lang files + // 119 obsolete + // 120 moved to lang files + // 121 obsolete addStringLocalization("Interaction_DESCRIPTION_Index_122", "Emit Redstone if slots contain something"); addStringLocalization("Interaction_DESCRIPTION_Index_123", "Don't emit Redstone"); - addStringLocalization("Interaction_DESCRIPTION_Index_124", "Invert Filter"); + // 124 moved to lang files addStringLocalization("Interaction_DESCRIPTION_Index_124.1", "Blacklist Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_125", "Don't invert Filter"); + // 125 obsolete addStringLocalization("Interaction_DESCRIPTION_Index_125.1", "Whitelist Mode"); - addStringLocalization("Interaction_DESCRIPTION_Index_126", "Ignore NBT"); - addStringLocalization("Interaction_DESCRIPTION_Index_127", "NBT has to match"); + // 126 moved to lang files + // 127 obsolete addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone"); addStringLocalization("Interaction_DESCRIPTION_Index_128.1", "Redstone "); addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy"); |