aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api
diff options
context:
space:
mode:
authorYannick Marcotte-Gourde <yannickmg@gmail.com>2023-07-28 09:03:54 -0400
committerGitHub <noreply@github.com>2023-07-28 15:03:54 +0200
commit190d29ec4eecb6508a91288639b1b6194e077fda (patch)
tree900e31baccfaefa5972022db37d605c42ef7025b /src/main/java/gregtech/api
parentedf63121630cde22a30b78a4ad7d7fff3d488d93 (diff)
downloadGT5-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')
-rw-r--r--src/main/java/gregtech/api/enums/MachineType.java20
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UITextures.java4
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java10
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java198
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java106
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java43
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java102
-rw-r--r--src/main/java/gregtech/api/util/GT_LanguageManager.java20
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");