From 9bd1b8b86cac0a062aa9c959a2830a4ef46d2218 Mon Sep 17 00:00:00 2001 From: YouCantCheatOnVACSecuredServers Date: Fri, 27 Jan 2023 17:48:14 +0000 Subject: [PATCH] Add ability to replenish items from Sophisticated inventory when crafting with a Crafting Upgrade --- .../common/gui/ICraftingContainer.java | 2 ++ .../common/gui/StorageContainerMenuBase.java | 13 ++++++++-- .../upgrades/UpgradeWrapperBase.java | 4 +++ .../crafting/CraftingUpgradeContainer.java | 24 +++++++++++++++++- .../upgrades/crafting/CraftingUpgradeTab.java | 4 ++- .../crafting/CraftingUpgradeWrapper.java | 9 +++++++ .../sophisticatedcore/textures/gui/icons.png | Bin 9750 -> 10195 bytes 7 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java index cf2b01fd..a6761b3c 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/ICraftingContainer.java @@ -9,4 +9,6 @@ public interface ICraftingContainer { List getRecipeSlots(); Container getCraftMatrix(); + + boolean shouldReplenish(); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java index 84ba80f2..ccbfb0ae 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java @@ -967,8 +967,17 @@ protected void doClick(int slotId, int dragType, ClickType clickType, Player pla quickMoveStack(this.player, slotId).copy(); } else { ItemStack itemstack8 = quickMoveStack(this.player, slotId); - while (!itemstack8.isEmpty() && ItemStack.isSame(slot6.getItem(), itemstack8)) { - itemstack8 = quickMoveStack(this.player, slotId); + if (getOpenOrFirstCraftingContainer().map(ICraftingContainer::shouldReplenish).orElse(false)) { + int i = 1; + int maxStackSize = itemstack8.getMaxStackSize(); + while (!itemstack8.isEmpty() && ItemStack.isSame(slot6.getItem(), itemstack8) && i < maxStackSize) { + itemstack8 = quickMoveStack(this.player, slotId); + i++; + } + } else { + while (!itemstack8.isEmpty() && ItemStack.isSame(slot6.getItem(), itemstack8)) { + itemstack8 = quickMoveStack(this.player, slotId); + } } } } else { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/UpgradeWrapperBase.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/UpgradeWrapperBase.java index 9da0009f..3b301a03 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/UpgradeWrapperBase.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/UpgradeWrapperBase.java @@ -55,4 +55,8 @@ public void setEnabled(boolean enabled) { save(); storageWrapper.getUpgradeHandler().refreshWrappersThatImplementAndTypeWrappers(); } + + public IStorageWrapper getStorageWrapper() { + return storageWrapper; + } } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java index 5d638c55..1576304e 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeContainer.java @@ -18,6 +18,7 @@ import net.p3pp3rf1y.sophisticatedcore.common.gui.StorageContainerMenuBase; import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeContainerBase; import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeContainerType; +import net.p3pp3rf1y.sophisticatedcore.util.InventoryHelper; import net.p3pp3rf1y.sophisticatedcore.util.NBTHelper; import javax.annotation.Nullable; @@ -26,6 +27,7 @@ public class CraftingUpgradeContainer extends UpgradeContainerBase implements ICraftingContainer { private static final String DATA_SHIFT_CLICK_INTO_STORAGE = "shiftClickIntoStorage"; + private static final String DATA_REPLENISH = "replenish"; private final ResultContainer craftResult = new ResultContainer(); private final CraftingItemHandler craftMatrix; private final ResultSlot craftingResultSlot; @@ -63,7 +65,15 @@ public void onTake(Player thePlayer, ItemStack stack) { ItemStack itemstack = craftMatrix.getItem(i); ItemStack itemstack1 = nonnulllist.get(i); if (!itemstack.isEmpty()) { - craftMatrix.removeItem(i, 1); + if (shouldReplenish()) { + if (InventoryHelper.extractFromInventory(itemstack.getItem(), 1, upgradeWrapper.getStorageWrapper().getInventoryHandler(), false).isEmpty()) { + craftMatrix.removeItem(i, 1); + } else { + onCraftMatrixChanged(craftMatrix); + } + } else { + craftMatrix.removeItem(i, 1); + } itemstack = craftMatrix.getItem(i); } @@ -133,6 +143,9 @@ public void handleMessage(CompoundTag data) { if (data.contains(DATA_SHIFT_CLICK_INTO_STORAGE)) { setShiftClickIntoStorage(data.getBoolean(DATA_SHIFT_CLICK_INTO_STORAGE)); } + if (data.contains(DATA_REPLENISH)) { + setReplenish(data.getBoolean(DATA_REPLENISH)); + } } @Override @@ -164,6 +177,15 @@ public void setShiftClickIntoStorage(boolean shiftClickIntoStorage) { sendDataToServer(() -> NBTHelper.putBoolean(new CompoundTag(), DATA_SHIFT_CLICK_INTO_STORAGE, shiftClickIntoStorage)); } + public boolean shouldReplenish() { + return upgradeWrapper.shouldReplenish(); + } + + public void setReplenish(boolean replenish) { + upgradeWrapper.setReplenish(replenish); + sendDataToServer(() -> NBTHelper.putBoolean(new CompoundTag(), DATA_REPLENISH, replenish)); + } + @Override public boolean mergeIntoStorageFirst(Slot slot) { return !(slot instanceof ResultSlot) || shouldShiftClickIntoStorage(); diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeTab.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeTab.java index f62412e5..8b529eb1 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeTab.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeTab.java @@ -19,10 +19,12 @@ public class CraftingUpgradeTab extends UpgradeSettingsTab screen, ButtonDefinition.Toggle shiftClickTargetButton) { + public CraftingUpgradeTab(CraftingUpgradeContainer upgradeContainer, Position position, StorageScreenBase screen, ButtonDefinition.Toggle shiftClickTargetButton, ButtonDefinition.Toggle replenishButton) { super(upgradeContainer, position, screen, TranslationHelper.INSTANCE.translUpgrade("crafting"), TranslationHelper.INSTANCE.translUpgradeTooltip("crafting")); addHideableChild(new ToggleButton<>(new Position(x + 3, y + 24), shiftClickTargetButton, button -> getContainer().setShiftClickIntoStorage(!getContainer().shouldShiftClickIntoStorage()), getContainer()::shouldShiftClickIntoStorage)); + addHideableChild(new ToggleButton<>(new Position(x + 21, y + 24), replenishButton, button -> getContainer().setReplenish(!getContainer().shouldReplenish()), + getContainer()::shouldReplenish)); craftingUIAddition = screen.getCraftingUIAddition(); openTabDimension = new Dimension(63 + craftingUIAddition.getWidth(), 142); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeWrapper.java b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeWrapper.java index 67d35ace..09688add 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeWrapper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/crafting/CraftingUpgradeWrapper.java @@ -42,4 +42,13 @@ public void setShiftClickIntoStorage(boolean shiftClickIntoStorage) { NBTHelper.setBoolean(upgrade, "shiftClickIntoStorage", shiftClickIntoStorage); save(); } + + public boolean shouldReplenish() { + return NBTHelper.getBoolean(upgrade, "replenish").orElse(false); + } + + public void setReplenish(boolean replenish) { + NBTHelper.setBoolean(upgrade, "replenish", replenish); + save(); + } } diff --git a/src/main/resources/assets/sophisticatedcore/textures/gui/icons.png b/src/main/resources/assets/sophisticatedcore/textures/gui/icons.png index 933f0e26214e4ec6bd899a7cf3910cc2ca13cc0b..67bd60e1f92c61aa6578cef3b9b98bb710eddbd6 100644 GIT binary patch literal 10195 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 tjzlSQn+Jm8l=AnS4&^BM8oF&{{ZV^SQh{Q