From 1b9b90df022b17fffc81ea5b97503decf9c0fe7b Mon Sep 17 00:00:00 2001 From: Jkibbels Date: Sun, 23 Mar 2025 17:59:30 -0400 Subject: [PATCH] #3 Scrollbar functional on GUI and feels pretty good. Added in some picture assets, shop system still not functional yet --- .../FactionBlockGUI/FactionBlockScreen.java | 15 ++- .../gui/Generics/ClickableLayer.java | 11 +- .../gui/ShopKeeperGUI/DrawableStoreItem.java | 48 +++++++++ .../ShopKeeperGUI/MerchandiseScroller.java | 40 +++++++ .../gui/ShopKeeperGUI/NewItemButton.java | 2 +- .../gui/ShopKeeperGUI/NewItemMenu.java | 4 + .../gui/ShopKeeperGUI/Scrollbar.java | 77 +++++++++++++ .../gui/ShopKeeperGUI/ShopKeeperMenu.java | 101 ++++++++++++++++-- .../keeblarcraft/Entities/ShopKeeper.java | 1 + .../Factions/FactionBlockScreenHandler.java | 2 - .../GuiMgr/ShopKeeper/ShopKeeperHandler.java | 66 ++++++++++-- .../ShopKeeper/ShopKeeperInventory.java | 35 ++++++ .../GuiMgr/ShopKeeper/ShopKeeperSlots.java | 3 +- .../GuiMgr/ShopKeeper/StoreItem.java | 30 ++++++ .../keeblarcraft/textures/gui/minus.png | Bin 0 -> 708 bytes .../assets/keeblarcraft/textures/gui/plus.png | Bin 0 -> 4436 bytes .../keeblarcraft/textures/gui/scrollbar.png | Bin 0 -> 203 bytes .../textures/gui/shopkeeper_add_icon.jpeg | Bin 5728 -> 0 bytes .../textures/gui/shopkeeper_gui.jpeg | Bin 41223 -> 0 bytes .../textures/gui/shopkeeper_gui.png | Bin 0 -> 6055 bytes .../textures/gui/shopkeeper_item_slot.jpeg | Bin 1348 -> 0 bytes .../textures/gui/shopkeeper_item_slot.png | Bin 0 -> 663 bytes .../textures/gui/shopkeeper_scrollbar.jpeg | Bin 1498 -> 0 bytes .../textures/gui/shopkeeper_subtract.png | Bin 572 -> 0 bytes 24 files changed, 412 insertions(+), 23 deletions(-) create mode 100644 src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/DrawableStoreItem.java create mode 100644 src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/MerchandiseScroller.java create mode 100644 src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/Scrollbar.java create mode 100644 src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperInventory.java create mode 100644 src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/StoreItem.java create mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/minus.png create mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/plus.png create mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/scrollbar.png delete mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_add_icon.jpeg delete mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.jpeg create mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.png delete mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_item_slot.jpeg create mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_item_slot.png delete mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_scrollbar.jpeg delete mode 100644 src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_subtract.png diff --git a/src/client/java/jesse/keeblarcraft/gui/FactionBlockGUI/FactionBlockScreen.java b/src/client/java/jesse/keeblarcraft/gui/FactionBlockGUI/FactionBlockScreen.java index f885394..417899a 100644 --- a/src/client/java/jesse/keeblarcraft/gui/FactionBlockGUI/FactionBlockScreen.java +++ b/src/client/java/jesse/keeblarcraft/gui/FactionBlockGUI/FactionBlockScreen.java @@ -25,18 +25,23 @@ public class FactionBlockScreen extends HandledScreen super.init(); titleY = 1000; //begone from screen playerInventoryTitleY = 1000; //begone from screen + + this.backgroundWidth = 256; + this.backgroundHeight = 256; + this.x = (width - backgroundWidth) / 2; + this.y = (height - backgroundHeight) / 2; } @Override protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { - RenderSystem.setShader(GameRenderer::getPositionTexProgram); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - RenderSystem.setShaderTexture(0, TEXTURE); +// RenderSystem.setShader(GameRenderer::getPositionTexProgram); +// RenderSystem.setShaderColor(1f, 1f, 1f, 1f); +// RenderSystem.setShaderTexture(0, TEXTURE); + + context.drawTexture(TEXTURE, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight, this.backgroundWidth, this.backgroundHeight); this.backgroundHeight = 256; this.backgroundWidth = 256; - - } @Override diff --git a/src/client/java/jesse/keeblarcraft/gui/Generics/ClickableLayer.java b/src/client/java/jesse/keeblarcraft/gui/Generics/ClickableLayer.java index 7fcbb12..41fea1d 100644 --- a/src/client/java/jesse/keeblarcraft/gui/Generics/ClickableLayer.java +++ b/src/client/java/jesse/keeblarcraft/gui/Generics/ClickableLayer.java @@ -27,6 +27,16 @@ abstract public class ClickableLayer extends ClickableWidget { this.layerName = layerName; } + protected void ResizeLayer(int width, int height) { + this.setWidth(width); + this.setHeight(height); + } + + protected void MoveLayer(int startX, int startY) { + this.setX(startX); + this.setY(startY); + } + protected void AddSubLayer(ClickableLayer newLayer) { subLayers.add(newLayer); } @@ -59,7 +69,6 @@ abstract public class ClickableLayer extends ClickableWidget { @Override public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { context.drawTexture(this.GetTexture(), this.getX(), this.getY(), 0, 0, this.getWidth(), this.getHeight(), this.getWidth(), this.getHeight()); - } public Identifier GetTexture() { diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/DrawableStoreItem.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/DrawableStoreItem.java new file mode 100644 index 0000000..bf0990b --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/DrawableStoreItem.java @@ -0,0 +1,48 @@ +package jesse.keeblarcraft.gui.ShopKeeperGUI; + +import jesse.keeblarcraft.Keeblarcraft; +import jesse.keeblarcraft.gui.Generics.ClickableLayer; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +// All the custom content that a store item will have. Handled by @see MerchandiseScroller.java +public class DrawableStoreItem extends ClickableLayer { + private static final Identifier ITEM_ICON = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_item_slot.png"); + private Integer itemCost; + private String itemName; + private Integer amountSelected = 0; + + public DrawableStoreItem(String itemName, Integer itemCost) { + this(itemName, itemCost, Text.of(""), 0, 0, 0, 0); + + } + + public DrawableStoreItem(String itemName, Integer itemCost, Text layerName, int width, int height, int startX, int startY) { + super(ITEM_ICON, layerName, width, height, startX, startY); + this.itemCost = itemCost; + this.itemName = itemName; + } + + public void Add() { + ++this.amountSelected; + System.out.println("Current buy amount: " + this.amountSelected); + } + + public void Subtract() { + --this.amountSelected; + System.out.println("Current buy amount: " + this.amountSelected); + } + + public Integer GetTotal() { + return this.amountSelected * itemCost; + } + + @Override + public void onClick(double x, double y) { + System.out.println("User clicked the following coordinates: [" + x + ", " + y + "]"); + } + + @Override + protected void appendClickableNarrations(NarrationMessageBuilder builder) {} +} diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/MerchandiseScroller.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/MerchandiseScroller.java new file mode 100644 index 0000000..5487179 --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/MerchandiseScroller.java @@ -0,0 +1,40 @@ +package jesse.keeblarcraft.gui.ShopKeeperGUI; + +import jesse.keeblarcraft.GuiMgr.ShopKeeper.ShopKeeperInventory; +import jesse.keeblarcraft.GuiMgr.ShopKeeper.StoreItem; +import jesse.keeblarcraft.gui.Generics.ClickableLayer; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +// This is the main section in the GUI that will display the stores "merchandise" -- all the items on sale. +public class MerchandiseScroller { + private final ShopKeeperInventory storeInventory; + + // Key = item name + // Value = the drawable slot for it + // The KVP keeps it so duplicate items don't take up more than 1 store slot + private final HashMap drawableInventory; + + public MerchandiseScroller(ShopKeeperInventory storeInventory) { + this.storeInventory = storeInventory; + drawableInventory = new HashMap<>(); + } + + public Integer Size() { + return storeInventory.Size(); + } + + public void Add(StoreItem item) { + storeInventory.Add(item); + drawableInventory.put(item.GetUPC(), new DrawableStoreItem(item.GetName(), item.GetCost())); + } + + public void Remove(String upc) { + storeInventory.Remove(upc); + } +} diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemButton.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemButton.java index 61c82a8..b345d44 100644 --- a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemButton.java +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemButton.java @@ -7,7 +7,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; public class NewItemButton extends ClickableLayer { - private static final Identifier NEW_ITEM_MENU = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_item_slot.jpeg"); + private static final Identifier NEW_ITEM_MENU = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_item_slot.jpeg"); /// TODO: Does not exist private static NewItemMenu newItemMenu; public NewItemButton(Identifier texture, Text layerName, int width, int height, int startX, int startY) { diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemMenu.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemMenu.java index 0acca22..158a713 100644 --- a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemMenu.java +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/NewItemMenu.java @@ -25,6 +25,10 @@ public class NewItemMenu extends ClickableLayer { this.AddDrawableSlotByName("add_item_slot", true); } + public void AddItem() { + + } + public boolean IsOpen() { return this.isOpen; } diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/Scrollbar.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/Scrollbar.java new file mode 100644 index 0000000..9bdc3b2 --- /dev/null +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/Scrollbar.java @@ -0,0 +1,77 @@ +package jesse.keeblarcraft.gui.ShopKeeperGUI; + +import jesse.keeblarcraft.gui.Generics.ClickableLayer; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; + +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class Scrollbar extends ClickableLayer { + private boolean isDragging = false; + private int scrollbarStart = 0; + private int scrollbarEnd = 0; + + public Scrollbar(Identifier texture, Text layerName, int width, int height, int startX, int startY, int scrollbarStart, int scrollbarMaxLength) { + super(texture, layerName, width, height, startX, startY); + this.scrollbarStart = scrollbarStart; + this.scrollbarEnd = startY + scrollbarMaxLength; + } + + @Override + protected void onDrag(double mX, double mY, double dX, double dY) { + // We only want to enable dragging if this feature is being toggled + if (dY > 0) { + dY = 1.0; + } else { + dY = -1.0; + } + + if (isDragging && mY >= this.scrollbarStart && mY <= this.scrollbarEnd) { + this.MoveLayer(this.getX(), (int)mY - (this.getHeight() / 2)); + } + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + // We intentionally switch the scroll direction since it is backwards + // The number set to is the speed of scrolling + if (verticalAmount > 0) { + verticalAmount = -3; + } else { + verticalAmount = 3; + } + + + int newY = this.getY() + (int) verticalAmount; + System.out.println("Mouse move. newY: " + newY + " -> this.getY()=" + this.getY()); + if (newY >= this.scrollbarStart-12 && newY <= this.scrollbarEnd-9) { + this.MoveLayer(this.getX(), newY); + } + + return true; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + SetDragging(true); + return true; + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + SetDragging(false); + return true; + } + + public Boolean IsDragging() { + return this.isDragging; + } + + public void SetDragging(boolean b) { + System.out.println("Toggling dragging mode on scrollbar"); + this.isDragging = b; + } + + @Override + protected void appendClickableNarrations(NarrationMessageBuilder builder) {} +} diff --git a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/ShopKeeperMenu.java b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/ShopKeeperMenu.java index 83cafc0..8d36015 100644 --- a/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/ShopKeeperMenu.java +++ b/src/client/java/jesse/keeblarcraft/gui/ShopKeeperGUI/ShopKeeperMenu.java @@ -1,12 +1,16 @@ package jesse.keeblarcraft.gui.ShopKeeperGUI; +import jesse.keeblarcraft.Entities.ShopKeeper; import jesse.keeblarcraft.GuiMgr.ShopKeeper.ShopKeeperHandler; +import jesse.keeblarcraft.GuiMgr.ShopKeeper.ShopKeeperInventory; import jesse.keeblarcraft.Keeblarcraft; import jesse.keeblarcraft.ClientHelpers.Helper; import jesse.keeblarcraft.gui.Generics.ClickableLayer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -15,12 +19,15 @@ import java.util.List; import java.util.Map; public class ShopKeeperMenu extends HandledScreen { - private static final Identifier MENU_TEXTURE = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_gui.jpeg"); - private static final Identifier ADD_BUTTON = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_add_icon.jpeg"); - private static final Identifier NEW_ITEM_MENU = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_item_slot.jpeg"); + private static final Identifier MENU_TEXTURE = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/shopkeeper_gui.png"); + private static final Identifier ADD_BUTTON = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/plus.png"); + private static final Identifier SCROLLBAR = new Identifier(Keeblarcraft.MOD_ID, "textures/gui/scrollbar.png"); private int x = 0; private int y = 0; private final List layers = new ArrayList<>(); + private MerchandiseScroller catalogue; + private ShopKeeperInventory serverInventory; + Scrollbar scrollbar; public ShopKeeperMenu(ShopKeeperHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); @@ -37,9 +44,14 @@ public class ShopKeeperMenu extends HandledScreen { this.backgroundHeight = 256; this.x = (width - backgroundWidth) / 2; this.y = (height - backgroundHeight) / 2; + scrollbar = new Scrollbar(SCROLLBAR, Text.of("scrollbar"), 15, 28, x+243, y+40, y+50, 163); // Add all layers below - AddNewButton(ADD_BUTTON, Text.of("ADD ITEM BUTTON"), x, y, 64, 64); + AddNewButton(ADD_BUTTON, Text.of("ADD ITEM BUTTON"), x+20, y+20, 8, 8); + AddNewLayer(scrollbar); + + catalogue = new MerchandiseScroller(this.getScreenHandler().GetInventory()); + System.out.println("This store catalogue has size " + catalogue.Size()); } @Override @@ -50,17 +62,25 @@ public class ShopKeeperMenu extends HandledScreen { // context.drawTexture(NEW_ITEM_MENU, this.x, this.y, 0, 0, 32, 24); // context.drawTexture(NEW_ITEM_MENU, this.x, this.y, 0, 0, 32, 24, 32, 24); -// this.getScreenHandler().showSlot("new_item", "add_item_slot"); + this.getScreenHandler().showSlot("add_item_menu", "add_item_slot"); + // TODO: Temporary to just prove a point that we can draw item icons in the menu + ItemStack tempStack = Items.ACACIA_DOOR.getDefaultStack(); + + + // Draws primary layers first for (ClickableLayer layer : layers) { layer.renderButton(context, mouseX, mouseY, delta); ToggleSlots(layer.GetLayerName().getString(), layer.GetDrawableSlots()); + // If a primary layer happens to want sub-layers in itself; we draw those here for (ClickableLayer subLayer : layer.GetSubLayers()) { subLayer.renderButton(context, mouseX, mouseY, delta); ToggleSlots(subLayer.GetLayerName().getString(), subLayer.GetDrawableSlots()); } + // TODO: HACK to see if this works + context.drawItem(tempStack, this.x, this.y); // TODO: REMOVE // We only notify the parent to update sub layers. It must manage its own sub layers layer.UpdateSubLayers(); } @@ -69,10 +89,10 @@ public class ShopKeeperMenu extends HandledScreen { private void ToggleSlots(String menuName, Map slotNames) { for (Map.Entry slot : slotNames.entrySet()) { if (slot.getValue()) { - System.out.println("Attempting to turn slot " + slot.getKey() + " to value " + slot.getValue()); +// System.out.println("Attempting to turn slot " + slot.getKey() + " to value " + slot.getValue()); this.getScreenHandler().showSlot(menuName, slot.getKey()); } else { - System.out.println("Attempting to turn slot " + slot.getKey() + " to value " + slot.getValue()); +// System.out.println("Attempting to turn slot " + slot.getKey() + " to value " + slot.getValue()); this.getScreenHandler().hideSlot(menuName, slot.getKey()); } } @@ -83,6 +103,10 @@ public class ShopKeeperMenu extends HandledScreen { layers.add(new NewItemButton(iconId, layerName, imgWidth, imgHeight, drawX, drawY)); } + private void AddNewLayer(ClickableLayer layer) { + layers.add(layer); + } + @Override public void drawForeground(DrawContext context, int mouseX, int mouseY) { // We override this function to intentionally do nothing @@ -108,6 +132,69 @@ public class ShopKeeperMenu extends HandledScreen { return true; } + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + scrollbar.SetDragging(false); + + for (ClickableLayer layer : layers) { + // Scrollbar gets special handling above this. Ignore in loop + if (layer.GetLayerName().getString().equals("scrollbar")) { + continue; + } + // Check main layer first + if (Helper.WithinBounds(layer.getX(), layer.getY(), layer.getWidth(), layer.getHeight(), mouseX, mouseY)) { + layer.mouseReleased(mouseX, mouseY, button); + } + + for (ClickableLayer subLayer : layer.GetSubLayers()) { + + if (subLayer.visible && Helper.WithinBounds(subLayer.getX(), subLayer.getY(), subLayer.getWidth(), subLayer.getHeight(), mouseX, mouseY)) { + subLayer.mouseReleased(mouseX, mouseY, button); + } + } + } + + return true; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + System.out.println("Mouse scrolled. Vert amount is: " + verticalAmount); + scrollbar.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + return true; + } + + + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { +// super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + if (scrollbar.IsDragging()) { + scrollbar.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + for (ClickableLayer layer : layers) { + // Scrollbar layer gets special handling above this for loop. Skip here + if (layer.GetLayerName().getString().equals("scrollbar")) { + continue; + } + + // Check main layer first + if (Helper.WithinBounds(layer.getX(), layer.getY(), layer.getWidth(), layer.getHeight(), mouseX, mouseY)) { + layer.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + for (ClickableLayer subLayer : layer.GetSubLayers()) { + + if (subLayer.visible && Helper.WithinBounds(subLayer.getX(), subLayer.getY(), subLayer.getWidth(), subLayer.getHeight(), mouseX, mouseY)) { + subLayer.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + } + } + + return true; + } + // Check if a click point is within the context of a square (square = x, y, w, h) // public static boolean WithinBounds(double x, double y, double w, double h, double clickX, double clickY) { //// System.out.println("Mouse click X Y: " + clickX + " " + clickY); diff --git a/src/main/java/jesse/keeblarcraft/Entities/ShopKeeper.java b/src/main/java/jesse/keeblarcraft/Entities/ShopKeeper.java index 6308ef4..c22f206 100644 --- a/src/main/java/jesse/keeblarcraft/Entities/ShopKeeper.java +++ b/src/main/java/jesse/keeblarcraft/Entities/ShopKeeper.java @@ -26,6 +26,7 @@ public class ShopKeeper extends VillagerEntity { } private void BeginTrades(PlayerEntity player) { + System.out.println("Beginning trades with player"); super.setCustomer(player); this.sendOffers(player, this.getDisplayName(), this.getVillagerData().getLevel()); } diff --git a/src/main/java/jesse/keeblarcraft/GuiMgr/Factions/FactionBlockScreenHandler.java b/src/main/java/jesse/keeblarcraft/GuiMgr/Factions/FactionBlockScreenHandler.java index ea85711..20a9156 100644 --- a/src/main/java/jesse/keeblarcraft/GuiMgr/Factions/FactionBlockScreenHandler.java +++ b/src/main/java/jesse/keeblarcraft/GuiMgr/Factions/FactionBlockScreenHandler.java @@ -79,7 +79,6 @@ public class FactionBlockScreenHandler extends ScreenHandler { return newStack; } - // From Kaupenjoe video private void addPlayerInventory(PlayerInventory playerInventory) { int spacing = -8; for (int i = 0; i < 3; ++i) { // Rows @@ -92,7 +91,6 @@ public class FactionBlockScreenHandler extends ScreenHandler { } } - // From Kaupenjoe video private void addPlayerHotbar(PlayerInventory playerInventory) { int spacing = -8; for (int i = 0; i < 9; ++i) { diff --git a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperHandler.java b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperHandler.java index 66516b4..5d14895 100644 --- a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperHandler.java +++ b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperHandler.java @@ -1,5 +1,6 @@ package jesse.keeblarcraft.GuiMgr.ShopKeeper; +import jesse.keeblarcraft.ConfigMgr.ConfigManager; import jesse.keeblarcraft.GuiMgr.ScreenHandlerRegistration; import jesse.keeblarcraft.Utils.CustomSlot; import net.minecraft.entity.player.PlayerEntity; @@ -18,12 +19,18 @@ import java.util.Map; public class ShopKeeperHandler extends ScreenHandler { private Merchant merchant; + private ShopKeeperInventory shopKeeperInventory; private MerchantInventory merchantInventory; + ConfigManager config = new ConfigManager(); + String shopName; + // 0 size is default to prevent null. Inventory expanded later + +// private final DefaultedList merchantInventory = DefaultedList.ofSize(0, ItemStack.EMPTY); private boolean canRefreshTrades = false; private boolean isLeveledMerchant = false; private int levelAmount = 0; private int merchantExperience = 0; - private Map slotIdByName = new HashMap<>(); + private Map slotIdByName = new HashMap<>(); ///TODO: Is this deprecated? Seems unused ShopKeeperSlots allSlots = new ShopKeeperSlots(); public ShopKeeperHandler(int syncId, PlayerInventory playerInventory) { @@ -32,12 +39,26 @@ public class ShopKeeperHandler extends ScreenHandler { public ShopKeeperHandler(int syncId, PlayerInventory playerInventory, Merchant merchant) { super(ScreenHandlerRegistration.SHOP_KEEPER_HANDLER_SCREEN_HANDLER_TYPE, syncId); + this.shopName = playerInventory.player.getEntityName(); ///TODO: Needs to be pulled from a shop manager this.merchant = merchant; this.merchantInventory = new MerchantInventory(merchant); + merchantInventory.onOpen(playerInventory.player); // not sure if this is doing anything + this.shopKeeperInventory = new ShopKeeperInventory(merchantInventory); + addPlayerHotbar(playerInventory); RegisterSlots(); - // Add slots below -// this.addSlot(new Slot(this.merchantInventory, 0, 136, 37)); -// this.addSlot(new CustomSlot(this.merchantInventory, 0, 136, 37), Text.of("test")); + } + + public ShopKeeperInventory GetInventory() { + String name = "shops/" + shopName; + if (config.DoesFileExist(name)) { + /// TODO: Add system to pull json shop stuff + System.out.println("Shop exists."); + } else { + System.out.println("[NOWARN]: ShopKeep inventory not found for this shop. Creating one..."); + config.CreateFile(name); + } + + return this.shopKeeperInventory; } public void RegisterSlots() { @@ -90,14 +111,47 @@ public class ShopKeeperHandler extends ScreenHandler { this.canRefreshTrades = isRefreshable; } + // This is just for SHIFT+CLICK moving @Override - public ItemStack quickMove(PlayerEntity player, int slot) { - return null; + public ItemStack quickMove(PlayerEntity player, int invSlot) { + System.out.println("Is client: " + player.getWorld().isClient()); + ItemStack newStack = ItemStack.EMPTY; + Slot slot = this.slots.get(invSlot); + if (slot.hasStack()) { + ItemStack originalStack = slot.getStack(); + newStack = originalStack.copy(); + + // TODO: This is from the YT video and it looks atrocious. Refactor this later + if ((invSlot < this.merchantInventory.size() && !this.insertItem(originalStack, this.merchantInventory.size(), this.slots.size(), true)) || + (!this.insertItem(originalStack, 0, this.merchantInventory.size(), false))) { + return ItemStack.EMPTY; + } + + if (originalStack.isEmpty()) { + slot.setStack(ItemStack.EMPTY); + } else { + slot.markDirty();; + } + } + return newStack; + } + + private void addPlayerHotbar(PlayerInventory playerInventory) { + int spacing = -8; + for (int i = 0; i < 9; ++i) { + // int x = (8 + i * 18) + spacing; // Texture draw position + int x = i * 22 + spacing; // Texture draw position + int y = 162; // Texture draw position + this.addSlot(new Slot(playerInventory, i, x, y)); + } } // Called every tick @Override public boolean canUse(PlayerEntity player) { +// System.out.println("canUse called on screen handler"); +// System.out.println("Can player use? " + this.merchantInventory.canPlayerUse(player)); +// System.out.println("Current customer is : " + this.merchantInventory.); return true; } } diff --git a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperInventory.java b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperInventory.java new file mode 100644 index 0000000..1e9bfd0 --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperInventory.java @@ -0,0 +1,35 @@ +package jesse.keeblarcraft.GuiMgr.ShopKeeper; + +import net.minecraft.village.MerchantInventory; + +import java.util.ArrayList; +import java.util.List; + +public class ShopKeeperInventory { + private final List items; + private final MerchantInventory merchantInventory; + + public ShopKeeperInventory(MerchantInventory merchantInventory) { + items = new ArrayList(); + // This is temporary to see if this stuff works client->server->client etc + items.add(new StoreItem("Among Us Statue", "$$$$$$$$$$", 10000)); + this.merchantInventory = merchantInventory; + } + + public List GetItems() { + return this.items; + } + + public Integer Size() { + System.out.println("Size called..."); + return this.items.size(); + } + + public void Add(StoreItem item) { + this.items.add(item); + } + + public void Remove(String upc) { + this.items.removeIf(item -> item.equals(upc)); + } +} diff --git a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperSlots.java b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperSlots.java index 399e18c..f4dca16 100644 --- a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperSlots.java +++ b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/ShopKeeperSlots.java @@ -3,13 +3,14 @@ package jesse.keeblarcraft.GuiMgr.ShopKeeper; import jesse.keeblarcraft.Utils.CustomSlot; import java.util.HashMap; -import java.util.List; import java.util.Map; // Until I find the will and way to mixin slots to be able to be removed (i.e: not backed by an Inventory) I am patching // slots in its own registration class (like ShopKeeperSlots). The time to do the mixin stuff far exceeds what is worth // it for the time being. public class ShopKeeperSlots { + // Key = The GUI menu the slot belongs to. Helpful in parsing + // Value = Map Key = Name of slot; Value = Slot itself. Name of slot is helpful for parsing if set private final Map> shopKeeperSlots = new HashMap<>(); public ShopKeeperSlots() {} diff --git a/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/StoreItem.java b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/StoreItem.java new file mode 100644 index 0000000..2467e81 --- /dev/null +++ b/src/main/java/jesse/keeblarcraft/GuiMgr/ShopKeeper/StoreItem.java @@ -0,0 +1,30 @@ +package jesse.keeblarcraft.GuiMgr.ShopKeeper; + +// All the custom content that a store item will have. Handled by @see MerchandiseScroller.java +public class StoreItem { + private Integer itemCost; + private String itemName; + private String upc; + + public StoreItem(String itemName, String upc, Integer cost) { + this.itemName = itemName; + this.upc = upc; + this.itemCost = cost; + } + + public String GetName() { + return itemName; + } + + public String GetUPC() { + return this.upc; + } + + public Integer GetCost() { + return this.itemCost; + } + + public boolean equals(String other) { + return upc.equals(other); + } +} diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/minus.png b/src/main/resources/assets/keeblarcraft/textures/gui/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..46b1943684248d09f8d15275e3e53e9dc291bc68 GIT binary patch literal 708 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/scrollbar.png b/src/main/resources/assets/keeblarcraft/textures/gui/scrollbar.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8278380d96acd221923cd3c58c52cdda7b92d5 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QjEnx?oJHr&dIz4ag*6vn?60Eznez~j$49mBhXQS=E4R*OMaXP^3WXsA*ASSD0px@$h9^Kg zxU<)Ao`}2813aP^zX~{|S4RMt0NZG|FNaG7SPJ*`aM>0KIon-;*^%vGNFPIEew(iv z%QqL7pzd)9O@o=fJ1fLgazZIrr-Cn~N^4ZAjD!Xw3`VWW2tqzuxFQq{1Dns_;%(@U z6dr@);gtey(aWlRKDSY!aC+q=?Xoa(%H>ehk!}ScS1Qo>^g1_5&18I-g{iVRO|okr z{8fh8Xp`(&ZLzZ0oy}C+3K~32S;K^Ks$nK&pk?W4*!VhQox|;5d?Z%qusglRI+KiZ zZUoGV6*7!d@y#^Jro!g3T^35^?L$yxQmN} zjvvW^!@)+&X?uOSwP5@>#=PbAZbnhccwIFfipi~IoW7(!bD9d;x@$akZUZ!>VC;+o z)V#nr5nPJRc~G0(aFxyB<}85Opcdeu(j$Xsmxdi0b6ivnyNEf*Bx5}pX%}UqjU3dd zRZ0V4u;La%Pv9D@)qqJ*JmoHz z-6RXPWY1hN)HF@{$Q|y37Ed+k4J_p< z95SiH83y`_w5knyYiggp*JbtjNe`1*1$6`rKoxN>B`k$wcU+&IznWpG0}gPd3MVuy z2O7Om4UZfLivMB!TC38c(=$4pq?Ay4YMQ`PNvjH1>2+GAj<%?kl%+4O|0aHT%W4b* z;#aV*lAcs3{xwV7+g|nR+ zg^-ljomo;+6g=rY1a5uFojK77ob~n4^y3B5G#sMfSc!pJ2Icnn06z~{=l8i;{0G2N z_`*p8-U|5F9taTdDOPUj!B<&a#bG``B=wY+X2agtQ!!RG09yuNs@mfK9S!It(+(&2 z=TGgyG>hl3*kP}M*to%-%%d3R=By-(1FpHKf5fyN-e8WMM;pIFs2sQ|I*QO+s}UMg1-_^M!oJzxJ%YSF zR;QQ0z!{W{1bjaGfgyyCC`=?03Plm2p&?;W5m8Z*5s{J6Lt@0yLnK2YBgOGzNvt$3 zE-q^5uM*;=2{F<*DeHtM02`qwTqFvYMn^_V|Kkz(8A%`U6URqL5{5ERhJYtQdxld3-@AOpfH{V3OA}1OIuUA$)-_OceMUMS++v7KlOEt++X~ zacztJ!!M(;|pZA@)9C#(zK zzGQo5=Y^J29aAs7U%o2(&h>5f8K2%OU3X@e|MQhUegVr!B?DIA0)3uyEa36dc`RpI z39Kp*gocN6v+xfdg`yB7mc$VA8=IQj;<3ccNoAIu$K#SmtF#$er7v+F_^gNhJKgV^ zQmz)?u$Qhnv;0cBqTtfWkIz@Oo|`-Ba#4N$43~C6XzAoFOZHKMdt0jB+x*j*KQ(6F z$`nKyedh}IpCB%}Qg|!89ee+R&2IlbzNjU-V*P}jx1QQ~@jIgA#78ZQU%65<4cERD zbLVd#Ctq0fPM3M=nwDY{W$v=szB~S#M;*womYqPfOAZt5I?wm-i) zC1L5vowL%8HN4RD+7#2-7r~gTO|GcLj)FDLPezPweQkv~89r~fo`FYu!5WBS1T+GF zKygDN#Yh7C>!~C*;o{8o=ZDQ+Gyg5m;YFUmM;%ceiMlO5Rtd&qp-k95>90rVD{&$* zAIqFHt7&Iv2HAZ4dSfu};$53%OD4adc&2&O!M2di&#g+n_Tx80KiMyv?o7%}H_qEJ zB&YSgBZv02m!yQRO}JlN|JBj4QC$~0ezVXp>PBAn#COKTj+`E!{lU7=J1T_j3u?Bv z%>DAl4Ci;MdlO=tyH8(!#xGZ#Qm}Ec)Iw7TgWR%l5tHUOLs1^ToXENs^MszCI;QaYyNAy%%gWb$D*xg` wQB$ENOA?7)n`O?DH7vaO?GsnhPd(U{bT<8o!|C|aC$F?0sQ6(qRMF{w0@`O03jhEB diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.jpeg b/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.jpeg deleted file mode 100644 index 41b57948cc411ed2873469d76107ec77a59ba298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41223 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 SX1HS^9}>-bX{r7FKmXa8%**ls diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.png b/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..70d827be73c2d380fd35bd6db3228bf623f1f166 GIT binary patch literal 6055 zcmbVQXH-+$);&Rlpj43-rDH)66zRQp5D@`Enus(*?=@Fxf=Ce%loBKgf>I0yDZwjI zf*_Dkq(s64qz6%2fKc8EzWaWB;}ze>7#Z1voUzwlYpyx>n&+OSg(2G^*dYJ_*o=+z ztN;MwN&i5Z!2d)}xekC|kRU5V9iXcF_#6Q685-+pTZb1cj$ZOSZi~VH?8ER~Y!eT= z&9-y`s@oiXs|e1Pg@y8~inNBi@-zUY=WxmDpG0hvF zO3d<>iZldcV*-4uKAHd`qxUB9>GgpV^?qY1$wsT&JwmTkg?-jXx_U!yVt4Cc@+AhE zW@%!P3n+s)olVV%r(Fy!w3)j@ZpSKDy7AZS?k7d&5SRcqdlpZ$$?o*h-SyVFKI}O4 zd3Uq(h7!%sDa9zT{0ZS?IV67G&f%28`0XGTkChdora^v=65u(}e5a~c{6SSg8WxMI zy&BAO5=9+r&Q2SMxMp|#5&4r>gId_f&YuvZWIm+uXq!gl2jRUruNy{}3b`7>s4Xi$ zHFqX#D77yxE;)!|C3}Rp`hnIg7y--zuOrvkac(4Q$SzG2Q}b3pbr;)2b#IKTAY3Tz zF+DU#+?+|8VMJI;Fa`H^49BB=iict!G?aVj+4i0+kQr67-58P)Y6(2FHgl=?=xN4lqHoYkVIRtrW)6~)AQmx==-g#bA(eu6RI zkF3^V+w`Ft5(ikV>U`z4ro=J2Oi#I@+jW?=|MYoI0&d+kCw*RbydKUR%aOqo8 zq3{oR`>m4ZbO*~Hik79eoVyKvBJ^fBxmQhtK=UGgCtt)Ax1=Q+8d=T9eWAo@=7E2 z83;FKsc4BqILhPJ>L)F(%wmjw?AMVstHXdN&w}=o4BpIsByRx6!fZm5tojXAl;cn( z9DwRi=<9Gl_R>Cg=@O5xA?p@dCaAvugrJ`X)dMpOfm%&Vv-kPd$h4kF z2oa)fhQ52764pcY3Ib;9bVwA6<+(^MnZ-@>3vf32(*x&`cn8Q_mh{Aw4B(fAoJA_!@4^jTQ17eypwSVmoCN!!G^F)sM?`-3{%8`B;=-DWwGe1LW88>NcG zx&@2WS+Hy1Uldfihc0_~JRf3aLteZ=L+TrpT$|}wU0aWxa%R%6?PAwTK9Y1IpI~O6 zmdgTn#&ZSu6efSDAI=fTwPs$VSD9GGIgc{XjQ*0>m@0lw3+({iu`52L#hYV`&4MwF1ZV z?FFU{(Bi5%f(6ck9Vjst%w3I)8uKxdd3Br3kJBfWU900*vV`ng@we^ac`{PI&lBaw zSw-~no0OvA>1TT}r`^;(E4q8Ro9=Gm=W2^x9}6NZ-Puh|4!I4&L&4ZM)exG{wqMlt zBAkn>VJoRRDSc(LJV_^9)095y|Tijstm-R46(BsfQK4~F)OaGvrnzg6ul<8WWq) zd9Ok`eN@2~7a36K>VEm5G9DX4B)Y#_oo!~0zld;&D7-~=Yqcg;h^jZ@T`x!%^HZoj z*^(>(EI>!^=K6^FH75r?u1|u}*>Ad}J6e8tYSyz)^BHD3Gl6?@vf2{RgT5)r?aL#L zR2KhRPYSD#0Vu(;cHXAWAlq-lllX2>XrH@dl%iJx4j}3TL@9Ah1o>K5V?NCdqufCu zqs(KqTb8R#05Lt2FGunCi!N8m5#~3^mZdWNvv|}%-rGAZ8}ALp#9r4ei>zbCN_N)9 zrl;0t?yCAd2{j&`3zz1D!odW^-f1|@HvmZO=^E6qkK)v3-zm5B1~L#D0WS+QYAU)U zv7;+V9DJfUbki!SZiCnAuX}AnGoN&~MJ>!-3e`zDi_slPSa|8Fk(!p5FvWCOyZgy(Ma%KvDdla`<_G86ygf2Xm@{JrLHMEg;$BVO^ zs!w5U&OiWc{G4O7Fp2Z8LQ(b}R>_~*VLj^! zSf(JDfM?L(SeUSx&i4Y@oJ{g>?!k6gN-Vrr#qHfPA3uyuq(_^QlX}4p=V+D;Bx8J} z?!b1C2Abu>m_NC3S%8QLBlv{A)&Ydoe_34hwzCo(slZJ&+mkD$`e&Ktx3tqf_Pno= z0HDb$HK-~!ZLfup;Ki8Rhv~n>4#~?(u>dOfe>({d)AcxZX-4MPA$4A6x*7w7 z3!rvI`$PdInJXAaH?IEKqy@wi15MhYI)H@>SA`q%8AAF%V&>2mk|)0RHGxo-Ygl}osqa~=_XGn-{7pu*Lz@|oSgsV z`2S21%mdt}e!moPSAN8)7wOKp;2? z0P-k=4KU&Q&kO5kuEs5IE~hRi%VV9r{!t}xpI?YSOFWSv_v2)Bn}W0MBQjng;V&@$ zf5~Y5GnsvIr0#bW7-OL1)gOw|Gl#uSbI9B1g4af1TGib`I#dwR-{>bgATLaCS@VQo zb@%SFMRil1v{!mYN!e|kQmPwB!e{I zOV^Iqw%d4H;?UEFF~*1)8J+V{eM3mal!i=#vS;I~WFfy>en zMm&8MdoJWAXnH`(b5XFmQWNz~~s^es}MV&Kguk64JB6@ya={ zUBQV^JRYV`ZA&~pc;h}tv`lB}L zxs-jb7= zlXzltTIKo&=E0S^%WeXqY!83UyJNpE-t&5-gTSAt&BeH#u#(~xSx}nH2i7P*Ck?s} z09Bp=0Ky84l5k$>bUX|q^63K==~3+jZ;E$`y=OL|_gaMxwdLdo<~jwsG1l||jWO&D zgrLCCsBi4rT&uDaU6Al`BLE5)iDnEwY<50wg{sWOr5w|!xJ~ZQrydse*y}RoGG-6q z9$}Q{lnxE3`w)-rI#JNoW4OofZZiP{yB=IDH%V7&3{(KeP`nNCYF-98ZpBK$X2#t$ zz%lYv+0^n^9vM6{;W&eeuA}-y`rfMC1yosg^4F%QvCWO**nqR^Ltv;^8RTq_bf~w8 z9Aj{bNBS2xQJCWtFWmU{%Qj&LyRY{J_sF9(*-_0Yn_1#YmQG~w?&i2MB>pbKBBL%) zVVp8@3RCPRJug7asbiTjRqW=`SWiu=F3{Nlr>K`t|Ip$ja1nFR)#RG?@VA<~p@ci< zEA7!8A#^iO_sNmnD`l7T^q}5a%6_=4I(Em`Ck8x)Xy1!D^z;I8|G@>rVq?O?mA1Er zr`;MhXdAv+Y9+f4KA_wMHyGFuWT7+7|JEGOUiJcS{l~k}*v^Q@vs@&40e7A1Mvp9p zkRq`^-Rd@%G+EF`A8Uc`_+=(fUFpfl4_+yZ7#5GdFQ;jp5G@*XR{WTAjLhNUZQl(l ziX$Dg09DrM8(W3jmi4p``iqN#9b|Iu?dY`_N)+QoP7Q{w_TWA18%C-3tF6cKe+IS8 z>Njg6g;;S4GA?1EaYC^%TZYH&@?CO}h5^1LNYzbTjHD9`-r8(2PdPBcVd7$TOKy zO_k}tF_f@Gub@Gv+mU^EALD4BimKU&f8~V(Wz$J7ZIA>FRsuQ^|5q`HdIa7V$m6aX>EY8!k3P9AL?($Bw{Q4 zXd%FlB!tEd%&`0@ubmS~fJW=>u=yU;vQ24DuIXZ*Rbd#pu{2RGzM9n<<`xoryUife zCb5A?Y41K?*GE_eT6MKf<$W*C0^e>p=|+0F`-I=Ma|i~k$XXJa?*-rMx8b5)11`#= zSUg0`K=##f#ALH9iosK5!5^;V+F-s_#}x?C1fCB=#>J2qB@${E6q=spyc#cTjN#a= zSKnR7Bqv|r!42Z@yU~-j*QFR4477wLBLiw?6`DxJ95!7i3;O7EZ}@WQ-P@ck^*)1Z zc3&k5{`ixN!0W84#LKG~boZJ>Y*Xda@1xjafnKq@NGFi;Z`6Qz9H~aa{D48P1jt5o zn7`bcWx1J#VDY`Gu{Mz2X9i~6?5xW7zKnoE=UDYKZ${;g$GWcK#}fse+s*GS*hSR9 zD}M9V-gB>~m^xSEtM$VtMg_kPkyNw$%Ax{yx|L_fL0?v%t6>(c7Fq9)W1l%gAHufA z8ebaocl0rO2ODyz=nww~(~LlH5d=DJqtR0db*?u3RaxJqgs?x_!O+(kSGk-?l&5A! zso729Z!?d!VPqB22a(4h@E1PJ_~5_}n(@4X^_E5*=bc=>_a5}S9odXX zQO3ID&rVH}ojwa#7DfRU=j$UIpnBlssZ=uA?l=SxZYrQ0@Pr>)qIX9Id~#nTOsaA{=B4egLM}rqgKlV_0;tHN-}) z@)pwJZK(<5(M*-~$m1`n%IepLx0>^)kx_9Q_~V*~NehUYnmeHxNBxPsMle;BzJcr3 zl*i2BxX&abZ}hiU1t4eC7=!iQ@AR;*z1yB-=GxSb-K54H(j0r1Mpq;;q=O6f4TnX6 zkXm^3s%zHl7bW1~+#aM7+xq(18tY5&{W`n5o$)PmbKnfPhJqjZU+L?6mQqXwbzED#l4gO`Kd};u4Zls%q*Qnp!5NX66=_R?aT2ZtfnQ zUcn)uVc`*xQOPN(Y3Ui6S;Zx#W#tu>Rn0A}ZS5VMU6UqHnL2IyjG40*Enc#8+42=D zS8dw7W$U)>J9h3mboj{8W5-XNJay^vm8;jT-?(|};iJb-o<4j2;^nK4pFV&2`tAFV zpT9u3cne5Ee1_&PU?4Cuv9K_+u!H=?$W#vUxF8Fwq9L1*V<3BCp|FxsBZr97 z#DyCVaw;1KeGpA5y2vG_V)9V+BgkuDpAqM=CbE16_ZY%ow;7y)NrE!)A7}_=CIEH+ zzstbF!1DhV0}nGJFflO;GT1Zxh}*AjXQRP<;E%O=N8_m9_p?$7>RuHOAit*`k&S)J|0_j1Q$HcYFP`xLou$*x^jN`9YQ^FHlAgU9E$ z{~0c=%UieaYU$bMf9)RqXPA@4_Mbr}s^x2by!+pKm-_R6N*H2)U=b6D>z>=n?;7rs@!cKf%l z)%(sb`n}!s$)Qgx&C9mc?}>`LH~W5do%!^2;d7>X-o3xw<3GcvK%jGYzwNy8Ve8Wq zcY*A9u~&bm=iRUTe-UVz=Hd_k8DejK-25Z{^k++d`HK1f1nQZ7+&*?c`QN4g3@y%w z;*>wye~Z6ucl__-zpab!X8mWl`8?pa?)jVhu6~Q(_;>T0^81O;|1vy&w#L*xJ5>9o zS75l;@4M#NYj>A^x@Rl0CHLEZ2KCoJYoE`rc>nNv-#_mChh+0TKCZpqQQCj2?{UOO z@h;u`hd@_+%dyk=@U;J^EYtmf54C&ux0&po&z@m_BYyMO`7QPj`9G>{{OI@VKf{|S z@oxKvX_?>uGklnqA^vsRGn36$Gv25qO6=KY;i@(_`cqQvQkUgtcE-$^JoV+LrDs(x z?NO8u=H%IZOMAPvwrbX^TfQ&zEp319%D!;ngY5JE((dE?uIoQ-cHcZLJ5o1q%Uip1 z*{5&RU;NWu|0Ozmb^NBgg_Zvq{C8}4Y}K&go3WS4OJ`=*#r@Z+_ue(X=D+{@KDVDs WjL!L%eL14H<=4vnr{CHCzX%*K^QXO8X^s(K|E60PMesP?gzJxqOFNTSg61FMbzo%X2J z^B2?aPpgE?=brt)@8Go`(+mG7z2ASKR?{*~BP{z}fb>sGgYcOf^A!z$*hBpc42q?N zy*Iq%EPow2k?r*=+Qa8-@l?xSZJ}|Z%&-7jHG6f>UB7h_XF}87M0@afErkae*E22U zt&^>m?b>;2%547RrqH-!VU>mvPfKH-rn)Lz3zd7w9U%c)5g-^%5W@Gejls6HTkP*o>H!7uj2k)@I= zN-qhxO>O*szG_oIrt(1v!=7uqy#6KX7+;v0xN#n%SE|CMmMr;w#~fl*f;f}w7$@EO on`^Z8;ALQX;!BP2O!M_+&;qhKfEWZW1y2T1p00i_>zopr0Le)h0RR91 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_scrollbar.jpeg b/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_scrollbar.jpeg deleted file mode 100644 index 0c46d57b2b81c617f2ed0ed15ea339097737a76e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1498 zcmex=L?6mQqXwbzED#l4gO`Kd};u4Zls%q*Qnp!5NX66=_R?aT2ZtfnQ zUcn)uVc`*xQOPN(Y3Ui6S;Zx#W#tu>Rn0A}ZS5VMU6UqHnL2IyjG40*Enc#8+42=D zS8dw7W$U)>J9h3mboj{8W5-XNJay^vm8;jT-?(|};iJb-o<4j2;^nK4pFV&2`tAFV zpT9u3cne5Ee1_&PU?4Cuv9K_+u!H=?$W#vUxF8Fwq9L1*V<3BCp|FxsBZr97 z#DyCVaw;1KeGpA5y2vG_V)9V+BgkuDpAqM=CbE16_ZY%ow;7y)NrE!)A7}_=CIEH+ zzstbF!1VtX0}nGJFflO;GT1ZxdHq5DVD#(zZLdGZJ@(!Dk-vRi{x z&ehJp-T%&iz4<>w#!}b7L$yI&z46t8zkgSoR_=88@%iwc^oP51rK2XDQ$4$6!qLif zLA&&ukLKiL6i@E)W}Z{new4UUQvV;H z-**3J`0|@Mxjr$uKJ|xN;iQxr-)U>ulw^LU*xxOz`Ela6Ue=e@;r|)ZTcad8KR+^f zHT}KX&pM0h{wY5`pWUB%(@rM7qWf^2;*ZkAbs1$<&w2~hHa~dlxNO(f5A!y%zBWDD z*Z4>x|H+=~HMXVS=5Ni+T^n^XJF3LzTKS`&S539|*(|DjCNGeOgU$y(qtG+jU^rYL;0PD|1%s~{~;@? zX0n~l&&%Hy{K$V)-&$vL`H%La;*^v6?Qc#0Gw@Y3d+xB>-?k_5;o77}uYYSFl@q(V zHt(&%RTEu5>#%C;E15E^X5tfWyfPEt7Fa9K_uL{+>43BBRJ#c8*|!3}-`}(~>r3MA zGp(~S zn|p_!y*}=Af09%8kw?#`Sbo}3^!ZU`{#(nHf79%DKI>Ok>fd~+?(5IHYaZ+OTgH~h z?fB^WJN}jMeV2`H)4qj$@ZV+a9edvX<|3U_E^e92_9ou@^zCb#==5?kyKVBUk$dc< iCx!0s*3S-#`FBp>$)zmMqLnABSDEkIzUe9d|C<0cc#q5g diff --git a/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_subtract.png b/src/main/resources/assets/keeblarcraft/textures/gui/shopkeeper_subtract.png deleted file mode 100644 index 4d3baae64ebcc0cb3fade84bc52e5ef26e24702c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)EX>4Tx04R}tkv&MmKpe$iQ^gM|4t5Z6$WWauf{F+(wF*V35Nd^19ZW9$f+h_~ zii@M*T5#}VvFhOBtgC~oAP9bdxC>5-E>hzEl0u6Z503ls?%w0>9U#=pOtU&-fTr7K zDiIem*;TRY6#{w?#yDnWW*Kvml!Wj2x<`PocTt|@f9}uGr{*jM1VrK(GfbO!gLrz= zHaPDShgnfpiO-40Ou8WPBi9v=-#8as7IZLMN=c5B95qOtZfq_6u^`-eob@00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=>iE9G87ilcc1_O02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{000z8L_t&-(_>&5e1P#ggV=wDAqW6>i~