From e50c13e5703663b37ce618ae5092fd5845ab1ab8 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Wed, 16 Sep 2020 19:29:47 +0200 Subject: [PATCH 01/14] Rolled back the memory change since it'll cause a daemon to launch even during a CI build. --- gradle.properties | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 87a13e94a..8a8b692d6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,3 @@ curseforge_project=223794 ######################################################### # Various tasks like runData will fail when run as daemon org.gradle.daemon=false - -# IntelliJ will still launch a daemon to grab the build-config, -# and that daemon may run out of memory -org.gradle.jvmargs=-Xmx2g From 1759f92164c23beda06ad79a64a891451c6d9f84 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Wed, 16 Sep 2020 19:51:22 +0200 Subject: [PATCH 02/14] Prevent FG from force-exiting the daemon if runData is used. --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index e3133e61b..1dfe2d877 100644 --- a/build.gradle +++ b/build.gradle @@ -157,6 +157,9 @@ minecraft { data { property 'forge.logging.console.level', 'debug' workingDirectory project.file('run') + // ForgeGradle will just force-exit the Gradle Daemon which fails our builds in case + // a daemon is used for any reason. + forceExit false args '--mod', 'appliedenergistics2', '--all', '--output', file('src/generated/resources/') mods { appliedenergistics2 { From 5a1d5356d1e69b6551105710fef97c8cef50e60a Mon Sep 17 00:00:00 2001 From: shartte Date: Wed, 16 Sep 2020 22:56:23 +0200 Subject: [PATCH 03/14] 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 04/14] 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 05/14] 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 58afe755b8a13506c8834e1753c620a746da038d Mon Sep 17 00:00:00 2001 From: yueh Date: Thu, 17 Sep 2020 21:37:53 +0200 Subject: [PATCH 06/14] Build PRs for all release branches (#4746) --- .github/workflows/pull_requests.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 2cee10876..605dfe785 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -2,7 +2,9 @@ name: 'Build PRs' on: pull_request: - branches: [ master ] + branches: + - master + - [0-9.x]+-[0-9.]+ jobs: build: From 9005db6f1c9ed3429a9d080fd050cefd960b5b3a Mon Sep 17 00:00:00 2001 From: yueh Date: Thu, 17 Sep 2020 21:42:20 +0200 Subject: [PATCH 07/14] Fix yaml syntax --- .github/workflows/pull_requests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 605dfe785..969eb2e3a 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -4,7 +4,7 @@ on: pull_request: branches: - master - - [0-9.x]+-[0-9.]+ + - '[0-9.x]+-[0-9.]+' jobs: build: From 4e03cbd356b4594bcd42d4968fa8501849c428c4 Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 18 Sep 2020 10:32:06 +0200 Subject: [PATCH 08/14] Simply build all branches --- .github/workflows/pull_requests.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 969eb2e3a..ba01625ab 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -3,8 +3,7 @@ name: 'Build PRs' on: pull_request: branches: - - master - - '[0-9.x]+-[0-9.]+' + - '*' jobs: build: From 76efe6026d25e2e51431d3f9438d108e4e473f34 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 18 Sep 2020 21:25:44 +0200 Subject: [PATCH 09/14] Add an indicator that shows the number of active crafting jobs. --- gradle.properties | 2 +- .../implementations/MEMonitorableScreen.java | 12 ++++++ .../MEMonitorableContainer.java | 41 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8a8b692d6..f57fcaa2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ artifact_basename=appliedenergistics2 minecraft_release=1.16 minecraft_version=1.16.3 mcp_mappings=20200723-1.16.1 -forge_version=34.0.7 +forge_version=34.0.8 ######################################################### # Provided APIs # diff --git a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java index ceedf3e1f..4828ee27a 100644 --- a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java +++ b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java @@ -51,6 +51,7 @@ import appeng.client.gui.widgets.SettingToggleButton; import appeng.client.gui.widgets.TabButton; import appeng.client.me.InternalSlotME; import appeng.client.me.ItemRepo; +import appeng.client.render.StackSizeRenderer; import appeng.container.implementations.CraftingStatusContainer; import appeng.container.implementations.MEMonitorableContainer; import appeng.container.slot.AppEngSlot; @@ -295,6 +296,16 @@ public class MEMonitorableScreen extends AEBas this.currentMouseX = mouseX; this.currentMouseY = mouseY; + + // Show the number of active crafting jobs + if (this.craftingStatusBtn != null && container.activeCraftingJobs != -1) { + // The stack size renderer expects a 16x16 slot, while the button is normally + // bigger + int x = this.craftingStatusBtn.x + (this.craftingStatusBtn.getWidth() - 16) / 2; + int y = this.craftingStatusBtn.y + (this.craftingStatusBtn.getWidth_CLASH() - 16) / 2; + StackSizeRenderer.renderSizeLabel(font, x - this.guiLeft, y - this.guiTop, + String.valueOf(container.activeCraftingJobs)); + } } @Override @@ -359,6 +370,7 @@ public class MEMonitorableScreen extends AEBas if (this.searchField != null) { this.searchField.render(matrixStack, mouseX, mouseY, partialTicks); } + } protected String getBackground() { diff --git a/src/main/java/appeng/container/implementations/MEMonitorableContainer.java b/src/main/java/appeng/container/implementations/MEMonitorableContainer.java index d9316db9b..5bb5967ec 100644 --- a/src/main/java/appeng/container/implementations/MEMonitorableContainer.java +++ b/src/main/java/appeng/container/implementations/MEMonitorableContainer.java @@ -46,6 +46,8 @@ import appeng.api.implementations.tiles.IViewCellStorage; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingCPU; +import appeng.api.networking.crafting.ICraftingGrid; import appeng.api.networking.energy.IEnergyGrid; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionHost; @@ -101,6 +103,13 @@ public class MEMonitorableContainer extends AEBaseContainer public boolean canAccessViewCells = false; @GuiSync(98) public boolean hasPower = false; + /** + * The number of active crafting jobs in the network. -1 means unknown and will + * hide the label on the screen. + */ + @GuiSync(100) + public int activeCraftingJobs = -1; + private IConfigManagerHost gui; private IConfigManager serverCM; private IGridNode networkNode; @@ -189,6 +198,8 @@ public class MEMonitorableContainer extends AEBaseContainer this.setValidContainer(false); } + this.updateActiveCraftingJobs(); + for (final Settings set : this.serverCM.getSettings()) { final Enum sideLocal = this.serverCM.getSetting(set); final Enum sideRemote = this.clientCM.getSetting(set); @@ -286,6 +297,36 @@ public class MEMonitorableContainer extends AEBaseContainer this.queueInventory(c); } + private void updateActiveCraftingJobs() { + IGridNode hostNode = networkNode; + if (hostNode == null) { + // Wireless terminals do not directly expose the target grid (even though they + // have one) + if (host instanceof IActionHost) { + hostNode = ((IActionHost) host).getActionableNode(); + } + } + IGrid grid = null; + if (hostNode != null) { + grid = hostNode.getGrid(); + } + + if (grid == null) { + // No grid to query crafting jobs from + this.activeCraftingJobs = -1; + return; + } + + int activeJobs = 0; + ICraftingGrid craftingGrid = grid.getCache(ICraftingGrid.class); + for (ICraftingCPU cpus : craftingGrid.getCpus()) { + if (cpus.isBusy()) { + activeJobs++; + } + } + this.activeCraftingJobs = activeJobs; + } + private void queueInventory(final IContainerListener c) { if (Platform.isServer() && c instanceof PlayerEntity && this.monitor != null) { try { From 971a9d22e81bf9ca2130683f43196ed57e1097c7 Mon Sep 17 00:00:00 2001 From: shartte Date: Sat, 19 Sep 2020 16:27:29 +0200 Subject: [PATCH 10/14] 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