From 0a6c38676ac32b7a971fb09c13c316ad2a826906 Mon Sep 17 00:00:00 2001 From: DL909 Date: Sun, 21 Jun 2026 16:02:23 +0800 Subject: [PATCH] allow factory gauge generate batch craft package as using JEI in stock keeper --- .../factoryBoard/FactoryPanelBehaviour.java | 16 +++-- .../FactoryPanelConfigurationPacket.java | 8 ++- .../factoryBoard/FactoryPanelScreen.java | 70 ++++++++++++------- 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index b4be349956..30eb686015 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -37,6 +37,7 @@ import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.PackageOrderWithCrafts; +import com.simibubi.create.content.logistics.stockTicker.PackageOrderWithCrafts.CraftingEntry; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; @@ -109,6 +110,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour implements MenuPro public boolean forceClearPromises; public UUID network; public boolean active; + public int craft_time; public boolean redstonePowered; @@ -451,14 +453,14 @@ private void tickRequests() { InventorySummary summary = LogisticsManager.getSummaryOfNetwork(network, true); for (ItemStackConnections connections : entry.getValue().values()) { - if (connections.totalAmount == 0 || connections.item.isEmpty() || summary.getCountOf(connections.item) < connections.totalAmount) { + if (connections.totalAmount == 0 || connections.item.isEmpty() || summary.getCountOf(connections.item) < connections.totalAmount*craft_time) { for (FactoryPanelConnection connection : connections) sendEffect(connection.from, false); failed = true; continue; } - BigItemStack stack = new BigItemStack(connections.item, connections.totalAmount); + BigItemStack stack = new BigItemStack(connections.item, connections.totalAmount*craft_time); toRequest.put(network, stack); for (FactoryPanelConnection connection : connections) sendEffect(connection.from, true); @@ -475,9 +477,9 @@ private void tickRequests() { // Panel may enforce item arrangement if (!activeCraftingArrangement.isEmpty()) - craftingContext = PackageOrderWithCrafts.singleRecipe(activeCraftingArrangement.stream() - .map(stack -> new BigItemStack(stack.copyWithCount(1))) - .toList()); + craftingContext = new PackageOrderWithCrafts(PackageOrder.empty(), List.of(new CraftingEntry(new PackageOrder(activeCraftingArrangement.stream() + .map(stack -> new BigItemStack(stack.copyWithCount(1))) + .toList()), craft_time))); // Collect request distributions for (Entry> entry : asMap.entrySet()) { @@ -501,7 +503,7 @@ private void tickRequests() { // Keep the output promise RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); if (promises != null) - promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); + promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput*craft_time))); panelBE.advancements.awardPlayer(AllAdvancements.FACTORY_GAUGE); } @@ -835,6 +837,7 @@ public void write(CompoundTag nbt, HolderLookup.Provider registries, boolean cli panelTag.putInt("LastLevel", lastReportedLevelInStorage); panelTag.putInt("LastPromised", lastReportedPromises); panelTag.putInt("LastUnloadedLinks", lastReportedUnloadedLinks); + panelTag.putInt("CraftTime",craft_time); panelTag.putBoolean("Satisfied", satisfied); panelTag.putBoolean("PromisedSatisfied", promisedSatisfied); panelTag.putBoolean("Waiting", waitingForNetwork); @@ -867,6 +870,7 @@ public void read(CompoundTag nbt, HolderLookup.Provider registries, boolean clie count = panelTag.getInt("FilterAmount"); upTo = panelTag.getBoolean("UpTo"); timer = panelTag.getInt("Timer"); + craft_time = panelTag.getInt("CraftTime"); lastReportedLevelInStorage = panelTag.getInt("LastLevel"); lastReportedPromises = panelTag.getInt("LastPromised"); lastReportedUnloadedLinks = panelTag.getInt("LastUnloadedLinks"); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 2a27072684..9f0b6e6300 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -30,6 +30,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac ByteBufCodecs.BOOL, packet -> packet.clearPromises, ByteBufCodecs.BOOL, packet -> packet.reset, ByteBufCodecs.BOOL, packet -> packet.redstoneReset, + ByteBufCodecs.INT, packet -> packet.craft_time, FactoryPanelConfigurationPacket::new ); @@ -43,11 +44,12 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac private final boolean clearPromises; private final boolean reset; private final boolean redstoneReset; + private final int craft_time; public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address, Map inputAmounts, List craftingArrangement, int outputAmount, int promiseClearingInterval, @Nullable FactoryPanelPosition removeConnection, boolean clearPromises, - boolean reset, boolean sendRedstoneReset) { + boolean reset, boolean sendRedstoneReset, int craft_time) { super(position.pos()); this.position = position; this.address = address; @@ -59,6 +61,7 @@ public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String add this.clearPromises = clearPromises; this.reset = reset; this.redstoneReset = sendRedstoneReset; + this.craft_time = craft_time; } @Override @@ -76,6 +79,9 @@ protected void applySettings(ServerPlayer player, FactoryPanelBlockEntity be) { behaviour.recipeOutput = reset ? 1 : outputAmount; behaviour.promiseClearingInterval = reset ? -1 : promiseClearingInterval; behaviour.activeCraftingArrangement = reset ? List.of() : craftingArrangement; + behaviour.craft_time = craft_time; + + if (reset) { behaviour.forceClearPromises = true; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index ab5a5a8a11..bd6177ecec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -66,6 +66,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private BigItemStack outputConfig; private List inputConfig; private List connections; + private int craft_time; private CraftingRecipe availableCraftingRecipe; private boolean craftingActive; @@ -89,6 +90,7 @@ private void updateConfigs() { return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount); }) .toList(); + craft_time = behaviour.craft_time; searchForCraftingRecipe(); @@ -218,6 +220,7 @@ protected void init() { activateCraftingButton.withCallback(() -> { craftingActive = !craftingActive; init(); + craft_time=1; if (craftingActive) { outputConfig.count = availableCraftingRecipe.getResultItem(minecraft.level.registryAccess()) .getCount(); @@ -262,7 +265,7 @@ protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float int slot = 0; if (craftingActive) { for (BigItemStack itemStack : craftingIngredients) - renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); + renderInputItem(graphics, slot++, itemStack, mouseX, mouseY, craft_time); } else { for (BigItemStack itemStack : inputConfig) renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); @@ -291,7 +294,7 @@ protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float int outputX = x + 160; int outputY = y + 48; graphics.renderItem(outputConfig.stack, outputX, outputY); - graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); + graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count*craft_time + ""); if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 && mouseY < outputY - 1 + 18) { @@ -423,13 +426,13 @@ protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float // - private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY) { + private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY, int override_number) { int inputX = guiLeft + (restocker ? 88 : 68 + (slot % 3 * 20)); int inputY = guiTop + (restocker ? 12 : 28) + (slot / 3 * 20); graphics.renderItem(itemStack.stack, inputX, inputY); - if (!craftingActive && !restocker && !itemStack.stack.isEmpty()) - graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); + if ((!craftingActive || override_number != 0) && !restocker && !itemStack.stack.isEmpty()) + graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, (override_number==0?itemStack.count:override_number)+""); if (mouseX < inputX - 2 || mouseX >= inputX - 2 + 20 || mouseY < inputY - 2 || mouseY >= inputY - 2 + 20) return; @@ -493,6 +496,10 @@ private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemSt mouseX, mouseY); } + private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY){ + renderInputItem(graphics,slot,itemStack,mouseX,mouseY,0); + } + private void showAddressBoxTooltip(GuiGraphics graphics, int mouseX, int mouseY) { if (addressBox.getValue() .isBlank()) { @@ -601,33 +608,42 @@ public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, doubl if (addressBox.mouseScrolled(mouseX, mouseY, scrollX, scrollY)) return true; - if (craftingActive) - return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); - - for (int i = 0; i < inputConfig.size(); i++) { - int inputX = x + 68 + (i % 3 * 20); - int inputY = y + 26 + (i / 3 * 20); - if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { - BigItemStack itemStack = inputConfig.get(i); - if (itemStack.stack.isEmpty()) + if (craftingActive){ + if (!restocker) { + int outputX = x + 160; + int outputY = y + 48; + if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { + craft_time = Mth.clamp((int) (craft_time + Math.signum(scrollY) * (hasShiftDown() ? 10 : 1)), 1, 64); return true; - itemStack.count = - Mth.clamp((int) (itemStack.count + Math.signum(scrollY) * (hasShiftDown() ? 10 : 1)), 1, 64); - return true; + } } } + else { - if (!restocker) { - int outputX = x + 160; - int outputY = y + 48; - if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { - BigItemStack itemStack = outputConfig; - itemStack.count = - Mth.clamp((int) (itemStack.count + Math.signum(scrollY) * (hasShiftDown() ? 10 : 1)), 1, 64); - return true; + for (int i = 0; i < inputConfig.size(); i++) { + int inputX = x + 68 + (i % 3 * 20); + int inputY = y + 26 + (i / 3 * 20); + if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { + BigItemStack itemStack = inputConfig.get(i); + if (itemStack.stack.isEmpty()) + return true; + itemStack.count = + Mth.clamp((int) (itemStack.count + Math.signum(scrollY) * (hasShiftDown() ? 10 : 1)), 1, 64); + return true; + } } - } + if (!restocker) { + int outputX = x + 160; + int outputY = y + 48; + if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { + BigItemStack itemStack = outputConfig; + itemStack.count = + Mth.clamp((int) (itemStack.count + Math.signum(scrollY) * (hasShiftDown() ? 10 : 1)), 1, 64); + return true; + } + } + } return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); } @@ -658,7 +674,7 @@ private void sendIt(@Nullable FactoryPanelPosition toRemove, boolean clearPromis String address = addressBox.getValue(); FactoryPanelConfigurationPacket packet = new FactoryPanelConfigurationPacket(pos, address, inputs, - craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises, sendReset, sendRedstoneReset); + craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises, sendReset, sendRedstoneReset, craft_time); CatnipServices.NETWORK.sendToServer(packet); }