diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/BankMenu.java b/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/BankMenu.java index d3c0b211..c401835b 100644 --- a/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/BankMenu.java +++ b/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/BankMenu.java @@ -1,12 +1,14 @@ package dev.ithundxr.createnumismatics.content.bank; import com.simibubi.create.foundation.gui.menu.MenuBase; +import dev.ithundxr.createnumismatics.Numismatics; import dev.ithundxr.createnumismatics.content.backend.BankAccount; import dev.ithundxr.createnumismatics.content.backend.Coin; import dev.ithundxr.createnumismatics.content.coins.CoinItem; import dev.ithundxr.createnumismatics.content.coins.SlotInputMergingCoinBag; import dev.ithundxr.createnumismatics.content.coins.SlotOutputMergingCoinBag; import dev.ithundxr.createnumismatics.registry.NumismaticsTags; +import dev.ithundxr.createnumismatics.util.Utils; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -32,7 +34,7 @@ public class BankMenu extends MenuBase { public static final int PLAYER_HOTBAR_END_INDEX = PLAYER_INV_START_INDEX + 9; public static final int PLAYER_INV_END_INDEX = PLAYER_INV_START_INDEX + 36; protected ContainerData dataAccess; - private CardWritingContainer cardWritingContainer; + private CardSwitchContainer cardSwitchContainer; public BankMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id, inv, extraData); } @@ -56,8 +58,8 @@ protected void initAndReadInventory(BankAccount contentHolder) {} @Override protected void addSlots() { - if (cardWritingContainer == null) - cardWritingContainer = new CardWritingContainer(this::slotsChanged, contentHolder.id); + if (cardSwitchContainer == null) + cardSwitchContainer = new CardSwitchContainer(this::slotsChanged, this::switchTo); int x = 13; int y = 71; @@ -68,11 +70,20 @@ protected void addSlots() { addSlot(new SlotInputMergingCoinBag(contentHolder.linkedCoinBag, null, 159, y)); - addSlot(new CardSlot.UnboundCardSlot(cardWritingContainer, 0, 8, 109)); + addSlot(new CardSlot.BoundCardSlot(cardSwitchContainer, 0, 8, 109)); addPlayerSlots(40, 152); } + private void switchTo(UUID otherAccount) { + if (player instanceof ServerPlayer serverPlayer) { + BankAccount account = Numismatics.BANK.getAccount(otherAccount); + if (account != null && account.isAuthorized(serverPlayer)) { + Utils.openScreen(serverPlayer, account, account::sendToMenu); + } + } + } + @Override protected void saveData(BankAccount contentHolder) {} @@ -80,7 +91,7 @@ protected void saveData(BankAccount contentHolder) {} public void removed(Player playerIn) { super.removed(playerIn); if (playerIn instanceof ServerPlayer) { - clearContainer(player, cardWritingContainer); + clearContainer(player, cardSwitchContainer); } } @@ -120,16 +131,16 @@ public void removed(Player playerIn) { return returnStack; } - public static class CardWritingContainer implements Container { - private final Consumer slotsChangedCallback; - private final UUID uuid; + private static class CardSwitchContainer implements Container { + private final Consumer slotsChangedCallback; + private final Consumer uuidChangedCallback; @NotNull protected final List stacks = new ArrayList<>(); - public CardWritingContainer(Consumer slotsChangedCallback, UUID uuid) { + public CardSwitchContainer(Consumer slotsChangedCallback, Consumer uuidChangedCallback) { this.slotsChangedCallback = slotsChangedCallback; - this.uuid = uuid; + this.uuidChangedCallback = uuidChangedCallback; stacks.add(ItemStack.EMPTY); } @@ -169,15 +180,13 @@ public boolean isEmpty() { @Override public void setItem(int slot, @NotNull ItemStack stack) { this.stacks.set(0, stack); - if (!CardItem.isBound(stack) && NumismaticsTags.AllItemTags.CARDS.matches(stack)) - CardItem.set(stack, uuid); + if (CardItem.isBound(stack) && NumismaticsTags.AllItemTags.CARDS.matches(stack)) + this.uuidChangedCallback.accept(CardItem.get(stack)); this.slotsChangedCallback.accept(this); } @Override - public void setChanged() { - - } + public void setChanged() {} @Override public boolean stillValid(@NotNull Player player) { diff --git a/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BlazeBankerMenu.java b/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BlazeBankerMenu.java index b9da52d2..0b769653 100644 --- a/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BlazeBankerMenu.java +++ b/common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BlazeBankerMenu.java @@ -1,8 +1,7 @@ package dev.ithundxr.createnumismatics.content.bank.blaze_banker; import com.simibubi.create.foundation.gui.menu.MenuBase; -import dev.ithundxr.createnumismatics.content.bank.BankMenu; -import dev.ithundxr.createnumismatics.content.bank.BankMenu.CardWritingContainer; +import dev.ithundxr.createnumismatics.content.bank.CardItem; import dev.ithundxr.createnumismatics.content.bank.CardSlot; import dev.ithundxr.createnumismatics.content.bank.IDCardItem; import dev.ithundxr.createnumismatics.content.bank.IDCardSlot.BoundIDCardSlot; @@ -12,6 +11,8 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.MenuType; @@ -20,6 +21,11 @@ import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; + public class BlazeBankerMenu extends MenuBase { public static final int ID_CARD_SLOTS = 27; public static final int CARD_SLOT_INDEX = ID_CARD_SLOTS; @@ -176,4 +182,74 @@ protected boolean moveItemStackTo(ItemStack stack, int startIndex, int endIndex, } return bl; } + + private static class CardWritingContainer implements Container { + private final Consumer slotsChangedCallback; + private final UUID uuid; + + @NotNull + protected final List stacks = new ArrayList<>(); + + public CardWritingContainer(Consumer slotsChangedCallback, UUID uuid) { + this.slotsChangedCallback = slotsChangedCallback; + this.uuid = uuid; + stacks.add(ItemStack.EMPTY); + } + + @Override + public int getContainerSize() { + return 1; + } + + protected ItemStack getStack() { + return stacks.get(0); + } + + @Override + public boolean isEmpty() { + return getStack().isEmpty(); + } + + @Override + public @NotNull ItemStack getItem(int slot) { + return getStack(); + } + + @Override + public @NotNull ItemStack removeItem(int slot, int amount) { + ItemStack stack = ContainerHelper.removeItem(this.stacks, 0, amount); + if (!stack.isEmpty()) { + this.slotsChangedCallback.accept(this); + } + return stack; + } + + @Override + public @NotNull ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(this.stacks, 0); + } + + @Override + public void setItem(int slot, @NotNull ItemStack stack) { + this.stacks.set(0, stack); + if (!CardItem.isBound(stack) && NumismaticsTags.AllItemTags.CARDS.matches(stack)) + CardItem.set(stack, uuid); + this.slotsChangedCallback.accept(this); + } + + @Override + public void setChanged() { + + } + + @Override + public boolean stillValid(@NotNull Player player) { + return true; + } + + @Override + public void clearContent() { + this.stacks.set(0, ItemStack.EMPTY); + } + } }