From c8136451e0e7ebcf1cd22ac790821b86e5090218 Mon Sep 17 00:00:00 2001 From: zontreck Date: Tue, 9 Jan 2024 03:14:14 -0700 Subject: [PATCH] ADD: Multipage chestgui support, javadoc --- gradle.properties | 2 +- .../dev/zontreck/libzontreck/LibZontreck.java | 5 + .../libzontreck/chestgui/ChestGUI.java | 205 +++++++++++++++++- .../libzontreck/chestgui/ChestGUIButton.java | 12 + .../libzontreck/items/CreativeModeTabs.java | 46 ++++ .../zontreck/libzontreck/items/ModItems.java | 29 +++ .../assets/libzontreck/lang/en_us.json | 9 + .../libzontreck/models/item/chestgui_add.json | 6 + .../models/item/chestgui_back.json | 6 + .../models/item/chestgui_forward.json | 6 + .../models/item/chestgui_remove.json | 6 + .../models/item/chestgui_reset.json | 6 + .../textures/item/chestgui_add.png | Bin 0 -> 125 bytes .../textures/item/chestgui_back.png | Bin 0 -> 156 bytes .../textures/item/chestgui_forward.png | Bin 0 -> 162 bytes .../textures/item/chestgui_remove.png | Bin 0 -> 104 bytes .../textures/item/chestgui_reset.png | Bin 0 -> 206 bytes 17 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dev/zontreck/libzontreck/items/CreativeModeTabs.java create mode 100644 src/main/java/dev/zontreck/libzontreck/items/ModItems.java create mode 100644 src/main/resources/assets/libzontreck/lang/en_us.json create mode 100644 src/main/resources/assets/libzontreck/models/item/chestgui_add.json create mode 100644 src/main/resources/assets/libzontreck/models/item/chestgui_back.json create mode 100644 src/main/resources/assets/libzontreck/models/item/chestgui_forward.json create mode 100644 src/main/resources/assets/libzontreck/models/item/chestgui_remove.json create mode 100644 src/main/resources/assets/libzontreck/models/item/chestgui_reset.json create mode 100644 src/main/resources/assets/libzontreck/textures/item/chestgui_add.png create mode 100644 src/main/resources/assets/libzontreck/textures/item/chestgui_back.png create mode 100644 src/main/resources/assets/libzontreck/textures/item/chestgui_forward.png create mode 100644 src/main/resources/assets/libzontreck/textures/item/chestgui_remove.png create mode 100644 src/main/resources/assets/libzontreck/textures/item/chestgui_reset.png diff --git a/gradle.properties b/gradle.properties index c863f5b..b793eb8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -53,7 +53,7 @@ mod_name=Zontreck Library Mod # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=GPLv3 # The mod version. See https://semver.org/ -mod_version=1.10.010824.1717 +mod_version=1.10.010924.0311 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/dev/zontreck/libzontreck/LibZontreck.java b/src/main/java/dev/zontreck/libzontreck/LibZontreck.java index 94d8736..fff9192 100644 --- a/src/main/java/dev/zontreck/libzontreck/LibZontreck.java +++ b/src/main/java/dev/zontreck/libzontreck/LibZontreck.java @@ -13,10 +13,13 @@ import dev.zontreck.eventsbus.Bus; import dev.zontreck.libzontreck.chestgui.ChestGUIRegistry; import dev.zontreck.libzontreck.currency.Bank; import dev.zontreck.libzontreck.currency.CurrencyHelper; +import dev.zontreck.libzontreck.items.CreativeModeTabs; +import dev.zontreck.libzontreck.items.ModItems; import dev.zontreck.libzontreck.menus.ChestGUIScreen; import dev.zontreck.libzontreck.types.ModMenuTypes; import dev.zontreck.libzontreck.networking.NetworkEvents; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraftforge.registries.RegisterEvent; import org.slf4j.Logger; import com.mojang.logging.LogUtils; @@ -89,6 +92,8 @@ public class LibZontreck { Bus.Reset(); ModMenuTypes.REGISTRY.register(bus); + //CreativeModeTabs.register(bus); + ModItems.register(bus); Bus.Register(CurrencyHelper.class, null); Bus.Register(Bank.class, null); diff --git a/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUI.java b/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUI.java index 3bac901..ca879f9 100644 --- a/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUI.java +++ b/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUI.java @@ -3,6 +3,7 @@ package dev.zontreck.libzontreck.chestgui; import dev.zontreck.libzontreck.LibZontreck; import dev.zontreck.libzontreck.events.CloseGUIEvent; import dev.zontreck.libzontreck.events.OpenGUIEvent; +import dev.zontreck.libzontreck.items.ModItems; import dev.zontreck.libzontreck.menus.ChestGUIMenu; import dev.zontreck.libzontreck.networking.ModMessages; import dev.zontreck.libzontreck.networking.packets.S2CCloseChestGUI; @@ -13,6 +14,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.items.ItemStackHandler; @@ -29,14 +31,215 @@ public class ChestGUI private UUID player; public List buttons = new ArrayList<>(); private ResourceLocation id; + private int page =0; + private boolean hasAdd = false; + private boolean hasReset = false; + private boolean hasRemove = false; + + private Runnable onAdd; + private Runnable onReset; + private Runnable onRemove; + + + public ChestGUI withAdd(Runnable onAdd) + { + hasAdd=true; + this.onAdd=onAdd; + return this; + } + + public ChestGUI withReset(Runnable onReset) + { + hasReset = true; + this.onReset = onReset; + return this; + } + + private ChestGUI withRemove(Runnable onRemove) + { + hasRemove = true; + this.onRemove=onRemove; + return this; + } public ChestGUI withButton(ChestGUIButton button) { buttons.add(button); - container.setStackInSlot(button.getSlotNum(), button.buildIcon()); + //container.setStackInSlot(button.getSlotNum(), button.buildIcon()); return this; } + /** + * Increment to the next page + */ + public void nextPage() + { + page++; + + checkPageButtons(); + } + + /** + * Go back a previous page, if possible + */ + public void prevPage() + { + page--; + + checkPageButtons(); + } + + /* + X X X X X X X X X + X X X X X X X X X + < 0 0 - @ + 0 0 > + */ + + // LEGEND: + // X = ChestGUIButton + // < = Previous Page Button + // 0 = Empty Slot + // - = Remove / Subtract + // @ = Reset / Refresh + // + = Add + // > = Next Page + + /** + * Sanity checks the page update + */ + public void checkPageButtons() { + int maxPerPage = 2 * 9; + int maxForPage = maxPerPage * page; + + int totalButtons = buttons.size(); + int totalPages = (totalButtons - 1) / maxPerPage; // Calculate total pages + + // Ensure the current page is within bounds + if (page < 0) { + page = 0; + } else if (page > totalPages) { + page = totalPages; + } + + // Perform additional logic if needed for displaying buttons on the GUI + // ... + + updateContainerForPage(); // Update the container for the current page + } + + /** + * Update the container with the page's buttons + */ + public void updateContainerForPage() { + int maxPerPage = 2 * 9; + int startIndex = maxPerPage * page; + int endIndex = Math.min(startIndex + maxPerPage, buttons.size()); + + // Logic to update the container based on buttons for the current page + ItemStackHandler pageContainer = new ItemStackHandler((9 * 3)); // Create a new container for the page + + for (int i = startIndex; i < endIndex; i++) { + ChestGUIButton button = buttons.get(i); + + // Calculate position relative to the page + int relativeIndex = i - startIndex; + int row = relativeIndex / 9; + int col = relativeIndex % 9; + + Vector2i position = new Vector2i(row, col); // Create position for the button + button.withPosition(position); // Set the button's position + + int slot = row * 9 + col; // Calculate the slot based on (row, column) + pageContainer.setStackInSlot(slot, button.buildIcon()); // Add button to the container + } + + if(hasMultiPage()) + { + if(!isFirstPage()) + { + ItemStack backStack = new ItemStack(ModItems.CHESTGUI_BACK.get(), 1); + ChestGUIButton prev = new ChestGUIButton(backStack, ()->{ + close(); + prevPage(); + open(); + }, new Vector2i(3, 0)); + + pageContainer.setStackInSlot(prev.getSlotNum(), prev.buildIcon()); + } + + if(!isLastPage()) + { + + ItemStack forwardStack = new ItemStack(ModItems.CHESTGUI_FORWARD.get(), 1); + ChestGUIButton nxt = new ChestGUIButton(forwardStack, ()->{ + close(); + prevPage(); + open(); + }, new Vector2i(3, 8)); + + pageContainer.setStackInSlot(nxt.getSlotNum(), nxt.buildIcon()); + } + } + + if(hasRemove) + { + ItemStack remStack = new ItemStack(ModItems.CHESTGUI_REM.get(), 1); + + ChestGUIButton rem = new ChestGUIButton(remStack, ()-> { + onRemove.run(); + }, new Vector2i(3, 3)); + + pageContainer.setStackInSlot(rem.getSlotNum(), rem.buildIcon()); + } + + if(hasReset) + { + ItemStack resStack = new ItemStack(ModItems.CHESTGUI_RESET.get(), 1); + + ChestGUIButton rem = new ChestGUIButton(resStack, ()-> { + onReset.run(); + }, new Vector2i(3, 4)); + + pageContainer.setStackInSlot(rem.getSlotNum(), rem.buildIcon()); + + } + + if(hasAdd) + { + + ItemStack remStack = new ItemStack(ModItems.CHESTGUI_ADD.get(), 1); + + ChestGUIButton rem = new ChestGUIButton(remStack, ()-> { + onAdd.run(); + }, new Vector2i(3, 5)); + + pageContainer.setStackInSlot(rem.getSlotNum(), rem.buildIcon()); + } + + this.container = pageContainer; // Update the container with the new page content + } + public boolean isFirstPage() { + return page == 0; + } + + public boolean isLastPage() { + int maxPerPage = 2 * 9; + int totalButtons = buttons.size(); + int totalPages = (totalButtons - 1) / maxPerPage; + + return page >= totalPages; + } + + + /** + * Checks if the number of buttons warrants adding the next/previous buttons to the utility row + * @return True if the number of buttons exceeds (2*9) + */ + public boolean hasMultiPage() + { + return (buttons.size() > (2*9)); + } + public ChestGUI withTitle(String title) { MenuTitle = title; diff --git a/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUIButton.java b/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUIButton.java index 903bd65..68b49ad 100644 --- a/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUIButton.java +++ b/src/main/java/dev/zontreck/libzontreck/chestgui/ChestGUIButton.java @@ -103,6 +103,18 @@ public class ChestGUIButton return this; } + /** + * Sets the position and returns the builder + * @param pos New button position + * @return This button instance + */ + public ChestGUIButton withPosition(Vector2i pos) + { + this.position=pos; + + return this; + } + /** * Check if the slot's row and column match (X,Y) * @param slot diff --git a/src/main/java/dev/zontreck/libzontreck/items/CreativeModeTabs.java b/src/main/java/dev/zontreck/libzontreck/items/CreativeModeTabs.java new file mode 100644 index 0000000..5a24937 --- /dev/null +++ b/src/main/java/dev/zontreck/libzontreck/items/CreativeModeTabs.java @@ -0,0 +1,46 @@ +package dev.zontreck.libzontreck.items; + +import dev.zontreck.libzontreck.LibZontreck; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +//@Mod.EventBusSubscriber(modid = LibZontreck.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class CreativeModeTabs +{ + public static final DeferredRegister REGISTRY = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, LibZontreck.MOD_ID); + + public static final List> LZ_MOD_ITEMS = new ArrayList<>(); + + public static final RegistryObject LIBZONTRECK_TAB = REGISTRY.register("libzontreck", ()->CreativeModeTab.builder() + .title(Component.translatable("itemGroup.tabs.libzontreck")) + .icon(Items.BARRIER::getDefaultInstance) + .displayItems((display,output)->LZ_MOD_ITEMS.forEach(it->output.accept(it.get()))) + .build() + ); + + public static RegistryObject addToLZTab(RegistryObject item) + { + LZ_MOD_ITEMS.add(item); + return item; + } + + + public static void register(IEventBus bus) + { + REGISTRY.register(bus); + } + +} diff --git a/src/main/java/dev/zontreck/libzontreck/items/ModItems.java b/src/main/java/dev/zontreck/libzontreck/items/ModItems.java new file mode 100644 index 0000000..e869f85 --- /dev/null +++ b/src/main/java/dev/zontreck/libzontreck/items/ModItems.java @@ -0,0 +1,29 @@ +package dev.zontreck.libzontreck.items; + +import dev.zontreck.libzontreck.LibZontreck; +import net.minecraft.world.item.Item; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class ModItems +{ + public static final DeferredRegister REGISTRY = DeferredRegister.create(ForgeRegistries.ITEMS, LibZontreck.MOD_ID); + + public static final RegistryObject CHESTGUI_ADD = REGISTRY.register("chestgui_add", ()->new Item(new Item.Properties())); + + public static final RegistryObject CHESTGUI_REM = REGISTRY.register("chestgui_remove", ()->new Item(new Item.Properties())); + + public static final RegistryObject CHESTGUI_BACK = REGISTRY.register("chestgui_back", ()->new Item(new Item.Properties())); + + public static final RegistryObject CHESTGUI_RESET = REGISTRY.register("chestgui_reset", ()->new Item(new Item.Properties())); + + public static final RegistryObject CHESTGUI_FORWARD = REGISTRY.register("chestgui_forward", ()->new Item(new Item.Properties())); + + + public static void register(IEventBus bus) + { + REGISTRY.register(bus); + } +} diff --git a/src/main/resources/assets/libzontreck/lang/en_us.json b/src/main/resources/assets/libzontreck/lang/en_us.json new file mode 100644 index 0000000..6edf1bb --- /dev/null +++ b/src/main/resources/assets/libzontreck/lang/en_us.json @@ -0,0 +1,9 @@ +{ + "itemGroup.tabs.libzontreck": "Aria's Library", + + "item.libzontreck.chestgui_add": "Add", + "item.libzontreck.chestgui_remove": "Remove", + "item.libzontreck.chestgui_back": "Previous Page", + "item.libzontreck.chestgui_forward": "Next Page", + "item.libzontreck.chestgui_reset": "Reset" +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/models/item/chestgui_add.json b/src/main/resources/assets/libzontreck/models/item/chestgui_add.json new file mode 100644 index 0000000..f4d7910 --- /dev/null +++ b/src/main/resources/assets/libzontreck/models/item/chestgui_add.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "libzontreck:item/chestgui_add" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/models/item/chestgui_back.json b/src/main/resources/assets/libzontreck/models/item/chestgui_back.json new file mode 100644 index 0000000..5f591c7 --- /dev/null +++ b/src/main/resources/assets/libzontreck/models/item/chestgui_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "libzontreck:item/chestgui_back" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/models/item/chestgui_forward.json b/src/main/resources/assets/libzontreck/models/item/chestgui_forward.json new file mode 100644 index 0000000..25bf73c --- /dev/null +++ b/src/main/resources/assets/libzontreck/models/item/chestgui_forward.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "libzontreck:item/chestgui_forward" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/models/item/chestgui_remove.json b/src/main/resources/assets/libzontreck/models/item/chestgui_remove.json new file mode 100644 index 0000000..1dc6f1d --- /dev/null +++ b/src/main/resources/assets/libzontreck/models/item/chestgui_remove.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "libzontreck:item/chestgui_remove" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/models/item/chestgui_reset.json b/src/main/resources/assets/libzontreck/models/item/chestgui_reset.json new file mode 100644 index 0000000..b2052c8 --- /dev/null +++ b/src/main/resources/assets/libzontreck/models/item/chestgui_reset.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "libzontreck:item/chestgui_reset" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/libzontreck/textures/item/chestgui_add.png b/src/main/resources/assets/libzontreck/textures/item/chestgui_add.png new file mode 100644 index 0000000000000000000000000000000000000000..5c06a63942f7529f101f13d05f3369f00384517b GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|%spKkLo9le z6C|!In9=yK-jMlleNEO3jjbsX5(hYvD;{#___DFJy^c7t-SKPC8>T%8CQ|J{~t7(8A5T-G@yGywn$ CJT^@L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/libzontreck/textures/item/chestgui_forward.png b/src/main/resources/assets/libzontreck/textures/item/chestgui_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..4da62d2b98ee6ffa27d23ecad9f0c1c058ec295e GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Vmw_OLo9le z6C}PI=x%&iugQG4KIW583(tkLgoGWZ4jgDWFVM7LO5;O&#pxHW3#1sjNifGUi8r*K zG+PnZ)aVh~aF*L;H%P(%P__>76WeC4kyv2yOQWxP7Bj=-TICf^*O&bO+QZ=K>gTe~ HDWM4fS-Lws literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/libzontreck/textures/item/chestgui_remove.png b/src/main/resources/assets/libzontreck/textures/item/chestgui_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..191a5ed36efbb26b392ad6cc93e4942e3eab5fad GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|lssJ=Lo9le z6C_v)4|Y_X6hrB^7+iprvVKCx7Cu(m<%r4Iq2+c5dF$?>(;aVMe)}k=X5Ck z%HAA3i6|==$_bZH&3t~;zv2MQMuzYXQzjis+5G@`(|BdxPH!*m+`njxgN@xNA D-L6U= literal 0 HcmV?d00001