From 5a1d5356d1e69b6551105710fef97c8cef50e60a Mon Sep 17 00:00:00 2001 From: shartte Date: Wed, 16 Sep 2020 22:56:23 +0200 Subject: [PATCH 1/5] Fixes #4733: Fix a crash bug when an external machine tries draining fluids from a fluid interface without a filter. (#4738) --- .../appeng/fluids/util/AEFluidInventory.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/appeng/fluids/util/AEFluidInventory.java b/src/main/java/appeng/fluids/util/AEFluidInventory.java index 4566d62f8..b0d53bd4e 100644 --- a/src/main/java/appeng/fluids/util/AEFluidInventory.java +++ b/src/main/java/appeng/fluids/util/AEFluidInventory.java @@ -13,6 +13,14 @@ import appeng.core.AELog; import appeng.util.Platform; public class AEFluidInventory implements IAEFluidTank { + + /** + * While this may seem redundant, it helps since this class heavily mixes AE + * fluids stacks, which use null to represent "nothing", and Minecraft's + * FluidStack, which uses #isEmpty() to represent nothing. + */ + private static final IAEFluidStack EMPTY_AE_FLUIDSTACK = null; + private final IAEFluidStack[] fluids; private final IAEFluidInventory handler; private final int capacity; @@ -31,13 +39,13 @@ public class AEFluidInventory implements IAEFluidTank { public void setFluidInSlot(final int slot, final IAEFluidStack fluid) { if (slot >= 0 && slot < this.getSlots()) { if (Objects.equals(this.fluids[slot], fluid)) { - if (fluid != null && fluid.getStackSize() != this.fluids[slot].getStackSize()) { + if (fluid != EMPTY_AE_FLUIDSTACK && fluid.getStackSize() != this.fluids[slot].getStackSize()) { this.fluids[slot].setStackSize(Math.min(fluid.getStackSize(), this.capacity)); this.onContentChanged(slot); } } else { - if (fluid == null) { - this.fluids[slot] = null; + if (fluid == EMPTY_AE_FLUIDSTACK) { + this.fluids[slot] = EMPTY_AE_FLUIDSTACK; } else { this.fluids[slot] = fluid.copy(); this.fluids[slot].setStackSize(Math.min(fluid.getStackSize(), this.capacity)); @@ -59,7 +67,7 @@ public class AEFluidInventory implements IAEFluidTank { if (slot >= 0 && slot < this.getSlots()) { return this.fluids[slot]; } - return null; + return EMPTY_AE_FLUIDSTACK; } @Override @@ -78,12 +86,12 @@ public class AEFluidInventory implements IAEFluidTank { if (tank < 0 || tank >= fluids.length) { return FluidStack.EMPTY; } - return fluids[tank] == null ? FluidStack.EMPTY : fluids[tank].getFluidStack(); + return fluids[tank] == EMPTY_AE_FLUIDSTACK ? FluidStack.EMPTY : fluids[tank].getFluidStack(); } @Override public int getTankCapacity(int tank) { - return Math.min(this.capacity, Integer.MAX_VALUE); + return this.capacity; } @Override @@ -98,20 +106,20 @@ public class AEFluidInventory implements IAEFluidTank { final IAEFluidStack fluid = this.fluids[slot]; - if (fluid != null && !fluid.getFluidStack().equals(resource)) { + if (fluid != EMPTY_AE_FLUIDSTACK && !fluid.getFluidStack().equals(resource)) { return 0; } int amountToStore = this.capacity; - if (fluid != null) { + if (fluid != EMPTY_AE_FLUIDSTACK) { amountToStore -= fluid.getStackSize(); } amountToStore = Math.min(amountToStore, resource.getAmount()); if (doFill) { - if (fluid == null) { + if (fluid == EMPTY_AE_FLUIDSTACK) { this.setFluidInSlot(slot, AEFluidStack.fromFluidStack(resource)); } else { fluid.setStackSize(fluid.getStackSize() + amountToStore); @@ -141,14 +149,14 @@ public class AEFluidInventory implements IAEFluidTank { int amountToStore = this.capacity; - if (fluid != null) { + if (fluid != EMPTY_AE_FLUIDSTACK) { amountToStore -= fluid.getStackSize(); } amountToStore = Math.min(amountToStore, resource.getAmount()); if (action == FluidAction.EXECUTE) { - if (fluid == null) { + if (fluid == EMPTY_AE_FLUIDSTACK) { this.setFluidInSlot(slot, AEFluidStack.fromFluidStack(resource)); } else { fluid.setStackSize(fluid.getStackSize() + amountToStore); @@ -170,7 +178,7 @@ public class AEFluidInventory implements IAEFluidTank { FluidStack totalDrained = FluidStack.EMPTY; for (int slot = 0; slot < this.getSlots(); ++slot) { FluidStack drain = this.drain(slot, resource, action == FluidAction.EXECUTE); - if (drain != null) { + if (!drain.isEmpty()) { if (totalDrained.isEmpty()) { totalDrained = drain; } else { @@ -205,7 +213,7 @@ public class AEFluidInventory implements IAEFluidTank { FluidStack copy = totalDrained.copy(); copy.setAmount(toDrain); FluidStack drain = this.drain(slot, copy, action == FluidAction.EXECUTE); - if (drain != null) { + if (!drain.isEmpty()) { totalDrained.setAmount(totalDrained.getAmount() + drain.getAmount()); toDrain -= drain.getAmount(); } @@ -220,7 +228,7 @@ public class AEFluidInventory implements IAEFluidTank { private int indexOfFluid(FluidStack resource) { for (int slot = 0; slot < fluids.length; slot++) { - if (fluids[slot] != null && fluids[slot].getFluidStack().isFluidEqual(resource)) { + if (fluids[slot] != EMPTY_AE_FLUIDSTACK && fluids[slot].getFluidStack().isFluidEqual(resource)) { return slot; } } @@ -229,7 +237,7 @@ public class AEFluidInventory implements IAEFluidTank { private int indexOfEmptySlot() { for (int slot = 0; slot < fluids.length; slot++) { - if (fluids[slot] == null) { + if (fluids[slot] == EMPTY_AE_FLUIDSTACK) { return slot; } } @@ -238,16 +246,16 @@ public class AEFluidInventory implements IAEFluidTank { public FluidStack drain(final int slot, final FluidStack resource, final boolean doDrain) { final IAEFluidStack fluid = this.fluids[slot]; - if (resource.isEmpty() || fluid == null || !fluid.getFluidStack().equals(resource)) { - return null; + if (resource.isEmpty() || fluid == EMPTY_AE_FLUIDSTACK || !fluid.getFluidStack().equals(resource)) { + return FluidStack.EMPTY; } return this.drain(slot, resource.getAmount(), doDrain); } public FluidStack drain(final int slot, final int maxDrain, boolean doDrain) { final IAEFluidStack fluid = this.fluids[slot]; - if (fluid == null || maxDrain <= 0) { - return null; + if (fluid == EMPTY_AE_FLUIDSTACK || maxDrain <= 0) { + return FluidStack.EMPTY; } int drained = maxDrain; @@ -259,7 +267,7 @@ public class AEFluidInventory implements IAEFluidTank { if (doDrain) { fluid.setStackSize(fluid.getStackSize() - drained); if (fluid.getStackSize() <= 0) { - this.fluids[slot] = null; + this.fluids[slot] = EMPTY_AE_FLUIDSTACK; } this.onContentChanged(slot); } @@ -277,7 +285,7 @@ public class AEFluidInventory implements IAEFluidTank { try { final CompoundNBT c = new CompoundNBT(); - if (this.fluids[x] != null) { + if (this.fluids[x] != EMPTY_AE_FLUIDSTACK) { this.fluids[x].writeToNBT(c); } From e5b45d51cc874674f4804b9e358797385e6b0915 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 17 Sep 2020 11:43:29 +0200 Subject: [PATCH 2/5] Minor style fixes. --- .../appeng/client/render/crafting/CraftingCubeBakedModel.java | 2 +- .../java/appeng/tile/crafting/CraftingStorageTileEntity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/client/render/crafting/CraftingCubeBakedModel.java b/src/main/java/appeng/client/render/crafting/CraftingCubeBakedModel.java index 227a8d263..c299897c6 100644 --- a/src/main/java/appeng/client/render/crafting/CraftingCubeBakedModel.java +++ b/src/main/java/appeng/client/render/crafting/CraftingCubeBakedModel.java @@ -113,7 +113,7 @@ abstract class CraftingCubeBakedModel implements IDynamicBakedModel { return quads; } - private void addRing(CubeBuilder builder, @Nullable Direction side, EnumSet connections) { + private void addRing(CubeBuilder builder, Direction side, EnumSet connections) { // Fill in the corners builder.setTexture(this.ringCorner); this.addCornerCap(builder, connections, side, Direction.UP, Direction.EAST, Direction.NORTH); diff --git a/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java b/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java index 92d20b2d5..866c0afd4 100644 --- a/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java @@ -78,7 +78,7 @@ public class CraftingStorageTileEntity extends CraftingTileEntity { return 0; } - final AbstractCraftingUnitBlock unit = (AbstractCraftingUnitBlock) this.world.getBlockState(this.pos) + final AbstractCraftingUnitBlock unit = (AbstractCraftingUnitBlock) this.world.getBlockState(this.pos) .getBlock(); switch (unit.type) { default: From f368f9dac2b849b151df1d567902cafa15ba0e8d Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 17 Sep 2020 14:33:43 +0200 Subject: [PATCH 3/5] Fixes #4697: Show number of required items in condenser tooltips. --- .../java/appeng/client/gui/widgets/SettingToggleButton.java | 6 ++++-- .../container/implementations/CondenserContainer.java | 5 +---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java index b80b38f35..f5bee7e9c 100644 --- a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java +++ b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java @@ -89,9 +89,11 @@ public class SettingToggleButton> extends IconButton { registerApp(16 * 7, Settings.CONDENSER_OUTPUT, CondenserOutput.TRASH, ButtonToolTips.CondenserOutput, ButtonToolTips.Trash); registerApp(16 * 7 + 1, Settings.CONDENSER_OUTPUT, CondenserOutput.MATTER_BALLS, - ButtonToolTips.CondenserOutput, ButtonToolTips.MatterBalls); + ButtonToolTips.CondenserOutput, + ButtonToolTips.MatterBalls.text(CondenserOutput.MATTER_BALLS.requiredPower)); registerApp(16 * 7 + 2, Settings.CONDENSER_OUTPUT, CondenserOutput.SINGULARITY, - ButtonToolTips.CondenserOutput, ButtonToolTips.Singularity); + ButtonToolTips.CondenserOutput, + ButtonToolTips.Singularity.text(CondenserOutput.SINGULARITY.requiredPower)); registerApp(16 * 9 + 1, Settings.ACCESS, AccessRestriction.READ, ButtonToolTips.IOMode, ButtonToolTips.Read); diff --git a/src/main/java/appeng/container/implementations/CondenserContainer.java b/src/main/java/appeng/container/implementations/CondenserContainer.java index b2e71c6a8..636027319 100644 --- a/src/main/java/appeng/container/implementations/CondenserContainer.java +++ b/src/main/java/appeng/container/implementations/CondenserContainer.java @@ -81,7 +81,7 @@ public class CondenserContainer extends AEBaseContainer implements IProgressProv this.requiredEnergy = requiredEnergy == 0 ? (int) maxStorage : (int) Math.min(requiredEnergy, maxStorage); this.storedPower = (int) this.condenser.getStoredPower(); - this.setOutput((CondenserOutput) this.condenser.getConfigManager().getSetting(Settings.CONDENSER_OUTPUT)); + this.output = (CondenserOutput) this.condenser.getConfigManager().getSetting(Settings.CONDENSER_OUTPUT); } super.detectAndSendChanges(); @@ -101,7 +101,4 @@ public class CondenserContainer extends AEBaseContainer implements IProgressProv return this.output; } - private void setOutput(final CondenserOutput output) { - this.output = output; - } } From 971a9d22e81bf9ca2130683f43196ed57e1097c7 Mon Sep 17 00:00:00 2001 From: shartte Date: Sat, 19 Sep 2020 16:27:29 +0200 Subject: [PATCH 4/5] Improvements to the usability of the number entry widgets (Priority, Level Emitter, Craft Amount): (#4737) - Fixed tab order - Introduced focus state for corner buttons - Allowed the player to enter any text, but add validation that only persist it if it is a valid number - Enter will now confirm these dialogs and return to the previous dialog - The text field is automatically focused and its contents are selected --- .../java/appeng/client/gui/AEBaseScreen.java | 10 +- .../gui/implementations/AESubScreen.java | 24 +-- .../implementations/CraftAmountScreen.java | 30 ++- .../implementations/CraftingStatusScreen.java | 2 +- .../implementations/LevelEmitterScreen.java | 15 +- .../implementations/MEMonitorableScreen.java | 2 +- .../implementations/NumberEntryWidget.java | 178 ++++++++++++++---- .../gui/implementations/PriorityScreen.java | 33 ++-- .../gui/widgets/ConfirmableTextField.java | 51 +++++ .../appeng/client/gui/widgets/IconButton.java | 42 ++++- .../appeng/client/gui/widgets/NumberBox.java | 153 --------------- .../appeng/client/gui/widgets/TabButton.java | 17 +- .../client/gui/widgets/ValidationIcon.java | 65 +++++++ .../appeng/container/AEBaseContainer.java | 67 ++----- .../CellWorkbenchContainer.java | 3 +- .../implementations/CondenserContainer.java | 3 +- .../implementations/ContainerHelper.java | 95 +++++++--- .../CraftConfirmContainer.java | 3 +- .../implementations/CraftingCPUContainer.java | 34 ++-- .../CraftingStatusContainer.java | 3 +- .../FormationPlaneContainer.java | 3 +- .../implementations/IOPortContainer.java | 3 +- .../implementations/InscriberContainer.java | 3 +- .../InterfaceTerminalContainer.java | 5 +- .../LevelEmitterContainer.java | 54 +++--- .../MEMonitorableContainer.java | 9 +- .../MolecularAssemblerContainer.java | 3 +- .../NetworkStatusContainer.java | 5 +- .../implementations/PatternTermContainer.java | 10 +- .../implementations/PriorityContainer.java | 58 +++--- .../implementations/QuartzKnifeContainer.java | 3 +- .../SpatialIOPortContainer.java | 5 +- .../implementations/StorageBusContainer.java | 3 +- .../implementations/UpgradeableContainer.java | 3 +- .../VibrationChamberContainer.java | 3 +- .../WirelessTermContainer.java | 3 +- .../core/sync/packets/ConfigValuePacket.java | 10 +- .../client/gui/FluidLevelEmitterScreen.java | 19 +- .../container/FluidConfigurableContainer.java | 2 +- .../container/FluidInterfaceContainer.java | 2 +- .../container/FluidLevelEmitterContainer.java | 51 +++-- .../container/FluidStorageBusContainer.java | 2 +- .../container/FluidTerminalContainer.java | 10 +- .../appliedenergistics2/lang/en_us.json | 2 + .../textures/guis/states.png | Bin 12506 -> 13141 bytes 45 files changed, 574 insertions(+), 527 deletions(-) create mode 100644 src/main/java/appeng/client/gui/widgets/ConfirmableTextField.java delete mode 100644 src/main/java/appeng/client/gui/widgets/NumberBox.java create mode 100644 src/main/java/appeng/client/gui/widgets/ValidationIcon.java diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index 74e2e2668..5773c0f11 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -628,15 +628,7 @@ public abstract class AEBaseScreen extends ContainerS } protected ITextComponent getGuiDisplayName(final ITextComponent in) { - return this.hasCustomInventoryName() ? new StringTextComponent(this.getInventoryName()) : in; - } - - private boolean hasCustomInventoryName() { - return this.container.getCustomName() != null; - } - - private String getInventoryName() { - return this.container.getCustomName(); + return title.getString().isEmpty() ? in : title; } /** diff --git a/src/main/java/appeng/client/gui/implementations/AESubScreen.java b/src/main/java/appeng/client/gui/implementations/AESubScreen.java index 8f540759e..a663de325 100644 --- a/src/main/java/appeng/client/gui/implementations/AESubScreen.java +++ b/src/main/java/appeng/client/gui/implementations/AESubScreen.java @@ -55,35 +55,23 @@ final class AESubScreen { IPriorityHost priorityHost = (IPriorityHost) containerTarget; this.previousContainerIcon = priorityHost.getItemStackRepresentation(); this.previousContainerType = ChestContainer.TYPE; - } - - else if (containerTarget instanceof IPriorityHost) { + } else if (containerTarget instanceof IPriorityHost) { IPriorityHost priorityHost = (IPriorityHost) containerTarget; this.previousContainerIcon = priorityHost.getItemStackRepresentation(); this.previousContainerType = priorityHost.getContainerType(); - } - - else if (containerTarget instanceof WirelessTerminalGuiObject) { + } else if (containerTarget instanceof WirelessTerminalGuiObject) { this.previousContainerIcon = definitions.items().wirelessTerminal().maybeStack(1).orElse(ItemStack.EMPTY); this.previousContainerType = WirelessTermContainer.TYPE; - } - - else if (containerTarget instanceof TerminalPart) { + } else if (containerTarget instanceof TerminalPart) { this.previousContainerIcon = parts.terminal().maybeStack(1).orElse(ItemStack.EMPTY); this.previousContainerType = MEMonitorableContainer.TYPE; - } - - else if (containerTarget instanceof CraftingTerminalPart) { + } else if (containerTarget instanceof CraftingTerminalPart) { this.previousContainerIcon = parts.craftingTerminal().maybeStack(1).orElse(ItemStack.EMPTY); this.previousContainerType = CraftingTermContainer.TYPE; - } - - else if (containerTarget instanceof PatternTerminalPart) { + } else if (containerTarget instanceof PatternTerminalPart) { this.previousContainerIcon = parts.patternTerminal().maybeStack(1).orElse(ItemStack.EMPTY); this.previousContainerType = PatternTermContainer.TYPE; - } - - else { + } else { this.previousContainerIcon = null; this.previousContainerType = null; } diff --git a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java index c967aefca..421c1bb2e 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java @@ -48,22 +48,28 @@ public class CraftAmountScreen extends AEBaseScreen { public void init() { super.init(); - this.amountToCraft = new NumberEntryWidget(this, 20, 30, 138, 62, NumberEntryType.CRAFT_ITEM_COUNT, value -> { - }); + this.amountToCraft = new NumberEntryWidget(this, 20, 30, 138, 62, NumberEntryType.CRAFT_ITEM_COUNT); this.amountToCraft.setValue(1); this.amountToCraft.setTextFieldBounds(62, 57, 50); this.amountToCraft.setMinValue(1); + this.amountToCraft.setHideValidationIcon(true); this.amountToCraft.addButtons(children::add, this::addButton); this.next = this.addButton( new Button(this.guiLeft + 128, this.guiTop + 51, 38, 20, GuiText.Next.text(), this::confirm)); + this.amountToCraft.setOnConfirm(() -> this.confirm(this.next)); subGui.addBackButton(this::addButton, 154, 0); + + changeFocus(true); } private void confirm(Button button) { - NetworkHandler.instance() - .sendToServer(new CraftRequestPacket((int) this.amountToCraft.getValue(), hasShiftDown())); + int amount = this.amountToCraft.getIntValue().orElse(0); + if (amount <= 0) { + return; + } + NetworkHandler.instance().sendToServer(new CraftRequestPacket(amount, hasShiftDown())); } @Override @@ -80,23 +86,9 @@ public class CraftAmountScreen extends AEBaseScreen { this.bindTexture("guis/craft_amt.png"); GuiUtils.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, this.ySize, getBlitOffset()); - this.next.active = this.amountToCraft.getValue() > 0; + this.next.active = this.amountToCraft.getIntValue().orElse(0) > 0; this.amountToCraft.render(matrixStack, offsetX, offsetY, partialTicks); } - @Override - public boolean keyPressed(int keyCode, int scanCode, int p_keyPressed_3_) { - if (keyCode == 28) { - this.next.onPress(); - return true; - } else { - return super.keyPressed(keyCode, scanCode, p_keyPressed_3_); - } - } - - protected String getBackground() { - return "guis/craftAmt.png"; - } - } diff --git a/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java b/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java index 777dd4e15..a3b4fe4ce 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java @@ -57,7 +57,7 @@ public class CraftingStatusScreen extends CraftingCPUScreen { addButton(btn); - btn.setHideEdge(13); + btn.setHideEdge(true); }, 213, -4); } diff --git a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java index 181b10ec7..216c9f563 100644 --- a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java +++ b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java @@ -35,8 +35,6 @@ import appeng.client.gui.widgets.ServerSettingToggleButton; import appeng.client.gui.widgets.SettingToggleButton; import appeng.container.implementations.LevelEmitterContainer; import appeng.core.localization.GuiText; -import appeng.core.sync.network.NetworkHandler; -import appeng.core.sync.packets.ConfigValuePacket; public class LevelEmitterScreen extends UpgradeableScreen { @@ -52,15 +50,18 @@ public class LevelEmitterScreen extends UpgradeableScreen public void init() { super.init(); - this.level = new NumberEntryWidget(this, 20, 17, 138, 62, NumberEntryType.LEVEL_ITEM_COUNT, - this::onLevelChange); + this.level = new NumberEntryWidget(this, 20, 17, 138, 62, NumberEntryType.LEVEL_ITEM_COUNT); this.level.setTextFieldBounds(25, 44, 75); this.level.addButtons(children::add, this::addButton); - container.setTextField(this.level); + this.level.setValue(container.getReportingValue()); + this.level.setOnChange(this::saveReportingValue); + this.level.setOnConfirm(this::closeScreen); + + this.changeFocus(true); } - private void onLevelChange(long level) { - NetworkHandler.instance().sendToServer(new ConfigValuePacket("LevelEmitter.Value", String.valueOf(level))); + private void saveReportingValue() { + this.level.getLongValue().ifPresent(container::setReportingValue); } @Override diff --git a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java index ceedf3e1f..f8575fef9 100644 --- a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java +++ b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java @@ -237,7 +237,7 @@ public class MEMonitorableScreen extends AEBas if (this.viewCell || this instanceof WirelessTermScreen) { this.craftingStatusBtn = this.addButton(new TabButton(this.guiLeft + 170, this.guiTop - 4, 2 + 11 * 16, GuiText.CraftingStatus.text(), this.itemRenderer, btn -> showCraftingStatus())); - this.craftingStatusBtn.setHideEdge(13); + this.craftingStatusBtn.setHideEdge(true); } this.isAutoFocus = SearchBoxMode.AUTOSEARCH == searchMode || SearchBoxMode.JEI_AUTOSEARCH == searchMode diff --git a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java index b31dfd6b9..7b7fbc275 100644 --- a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java +++ b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java @@ -2,43 +2,60 @@ package appeng.client.gui.implementations; import java.util.ArrayList; import java.util.List; +import java.util.OptionalInt; +import java.util.OptionalLong; import java.util.function.Consumer; -import java.util.function.LongConsumer; import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.widget.button.Button; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; import appeng.client.gui.AEBaseScreen; import appeng.client.gui.NumberEntryType; -import appeng.client.gui.widgets.ITickingWidget; -import appeng.client.gui.widgets.NumberBox; +import appeng.client.gui.widgets.ConfirmableTextField; +import appeng.client.gui.widgets.ValidationIcon; import appeng.core.AEConfig; /** * A utility widget that consists of a text-field to enter a number with * attached buttons to increment/decrement the number in fixed intervals. */ -public class NumberEntryWidget implements ITickingWidget { +public class NumberEntryWidget extends AbstractGui { + private static final ITextComponent INVALID_NUMBER = new TranslationTextComponent( + "gui.appliedenergistics2.validation.InvalidNumber"); + private static final String NUMBER_LESS_THAN_MIN_VALUE = "gui.appliedenergistics2.validation.NumberLessThanMinValue"; private static final ITextComponent PLUS = new StringTextComponent("+"); private static final ITextComponent MINUS = new StringTextComponent("-"); + private static final int TEXT_COLOR_ERROR = 0xFF1900; + private static final int TEXT_COLOR_NORMAL = 0xFFFFFF; private final AEBaseScreen parent; private final int x; private final int y; - private final NumberBox level; + private final ConfirmableTextField textField; private final NumberEntryType type; private List