From 740c79f087a0efcc0f1ac1bc162e83aefdf27d27 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 29 Sep 2022 19:10:02 +0100 Subject: [PATCH] Added layers to menus and fixed several bugs (and temporarily removed MythicCraft repos) --- build.gradle.kts | 2 +- .../willfp/eco/core/gui/menu/MenuBuilder.java | 23 +++++- .../willfp/eco/core/gui/menu/MenuLayer.java | 31 ++++++++ .../willfp/eco/core/gui/page/PageChanger.java | 9 ++- .../willfp/eco/core/gui/slot/FillerMask.java | 2 +- .../willfp/eco/internal/gui/menu/EcoMenu.kt | 4 +- .../eco/internal/gui/menu/EcoMenuBuilder.kt | 70 +++++++++++-------- .../gui/menu/MenuRenderedInventory.kt | 11 +-- .../willfp/eco/internal/gui/slot/EcoSlot.kt | 3 +- eco-core/core-plugin/build.gradle | 4 +- .../eco/internal/spigot/EcoSpigotPlugin.kt | 6 +- .../CustomEntitiesMythicMobs.kt | 10 ++- .../customitems/CustomItemsMythicMobs.kt | 17 +---- 13 files changed, 115 insertions(+), 77 deletions(-) create mode 100644 eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuLayer.java diff --git a/build.gradle.kts b/build.gradle.kts index a9ededa7..1397796e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -70,7 +70,7 @@ allprojects { maven("https://nexus.sirblobman.xyz/repository/public/") // MythicMobs - maven("https://mvn.lumine.io/repository/maven-public/") + //maven("https://mvn.lumine.io/repository/maven-public/") // Crunch maven("https://redempt.dev") diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java index 7db36d17..d702dc60 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java @@ -49,15 +49,32 @@ public interface MenuBuilder { /** * Add a component. * + * @param layer The layer. * @param row The row of the top left corner. * @param column The column of the top left corner. * @param component The component. * @return The builder. */ - MenuBuilder addComponent(int row, + MenuBuilder addComponent(@NotNull MenuLayer layer, + int row, int column, @NotNull GUIComponent component); + + /** + * Add a component. + * + * @param row The row of the top left corner. + * @param column The column of the top left corner. + * @param component The component. + * @return The builder. + */ + default MenuBuilder addComponent(final int row, + final int column, + @NotNull final GUIComponent component) { + return this.addComponent(MenuLayer.BACKGROUND, row, column, component); + } + /** * Run function to modify the builder. * @@ -73,7 +90,7 @@ public interface MenuBuilder { * @return The builder. */ default MenuBuilder setMask(@NotNull final FillerMask mask) { - return this.addComponent(0, 0, mask); + return this.addComponent(MenuLayer.BACKGROUND, 1, 1, mask); } /** @@ -83,7 +100,7 @@ public interface MenuBuilder { * @return The builder. */ default MenuBuilder addPage(@NotNull final Page page) { - return this.addComponent(0, 0, page); + return this.addComponent(MenuLayer.TOP, 1, 1, page); } /** diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuLayer.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuLayer.java new file mode 100644 index 00000000..205c867d --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuLayer.java @@ -0,0 +1,31 @@ +package com.willfp.eco.core.gui.menu; + +/** + * Different layers of the menu. + */ +public enum MenuLayer { + /** + * Right at the back. + */ + BACKGROUND, + + /** + * Second from the back. + */ + LOWER, + + /** + * In the middle (default). + */ + MIDDLE, + + /** + * Near the top. + */ + UPPER, + + /** + * At the absolute top. + */ + TOP +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java index c1194adb..db4852b5 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java @@ -59,11 +59,10 @@ public final class PageChanger implements GUIComponent { } @Override - public @Nullable - Slot getSlotAt(final int row, - final int column, - @NotNull final Player player, - @NotNull final Menu menu) { + public @Nullable Slot getSlotAt(final int row, + final int column, + @NotNull final Player player, + @NotNull final Menu menu) { int page = Page.getPage(player, menu); int maxPage = Page.getMaxPage(player, menu); diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerMask.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerMask.java index e685dccb..6c9bb84a 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerMask.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/FillerMask.java @@ -129,6 +129,6 @@ public class FillerMask implements GUIComponent { @Override public @Nullable Slot getSlotAt(final int row, final int column) { - return mask.get(row).get(column); + return mask.get(row - 1).get(column - 1); } } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt index 3e18749e..c1440542 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt @@ -61,13 +61,13 @@ class EcoMenu( override fun open(player: Player): Inventory { val inventory = Bukkit.createInventory(null, rows * 9, title) - inventory.asRenderedInventory()?.render(noSideEffects = true) + MenuHandler.registerInventory(inventory, this, player) player.openInventory(inventory) onOpen.forEach { it.handle(player, this) } - inventory.asRenderedInventory()?.generateCaptive() + inventory.asRenderedInventory()?.render() return inventory } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt index eedf9dbe..44a970a3 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt @@ -4,6 +4,7 @@ import com.willfp.eco.core.gui.component.GUIComponent import com.willfp.eco.core.gui.menu.CloseHandler import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.MenuBuilder +import com.willfp.eco.core.gui.menu.MenuLayer import com.willfp.eco.core.gui.menu.OpenHandler import com.willfp.eco.util.StringUtils import org.bukkit.entity.Player @@ -12,7 +13,7 @@ import java.util.function.Consumer class EcoMenuBuilder(private val rows: Int) : MenuBuilder { private var title = "Menu" - private val components = mutableMapOf>() + private val components = mutableMapOf>>() private var onClose = mutableListOf() private var onOpen = mutableListOf() private var onRender = mutableListOf<(Player, Menu) -> Unit>() @@ -24,14 +25,15 @@ class EcoMenuBuilder(private val rows: Int) : MenuBuilder { return this } - override fun addComponent(row: Int, column: Int, component: GUIComponent): MenuBuilder { - require(!(row < 1 || row > rows)) { "Invalid row number!" } - require(!(column < 1 || column > 9)) { "Invalid column number!" } + override fun addComponent(layer: MenuLayer, row: Int, column: Int, component: GUIComponent): MenuBuilder { + require(row in 1..rows) { "Invalid row number!" } + require(column in 1..9) { "Invalid column number!" } require(column + component.columns - 1 <= 9) { "Component is too large to be placed here!" } require(row + component.rows - 1 <= getRows()) { "Component is too large to be placed here!" } val anchor = Anchor(row, column) - components.computeIfAbsent(anchor) { mutableListOf() } += component + components.computeIfAbsent(layer) { mutableMapOf() } + .computeIfAbsent(anchor) { mutableListOf() } += component return this } @@ -57,37 +59,47 @@ class EcoMenuBuilder(private val rows: Int) : MenuBuilder { } override fun build(): Menu { - val componentsAtPoints = mutableMapOf>() + val layeredComponents = mutableMapOf>>() - // 4 nested for loops? Shut up. Silence. Quiet. - for (row in (1..rows)) { - for (column in (1..9)) { - for ((anchor, availableComponents) in components) { - for (component in availableComponents) { - // Too far to the top / left to be in bounds - if (anchor.row > row || anchor.column > column) { - continue + // 5 nested for loops? Shut up. Silence. Quiet. + for (layer in MenuLayer.values()) { + for (row in (1..rows)) { + for (column in (1..9)) { + for ((anchor, availableComponents) in components.computeIfAbsent(layer) { mutableMapOf() }) { + for (component in availableComponents) { + val rowOffset = 1 + row - anchor.row + val columnOffset = 1 + column - anchor.column + + if (rowOffset <= 0 || columnOffset <= 0) { + continue + } + + if (rowOffset > component.rows || columnOffset > component.columns) { + continue + } + + val point = Anchor(row, column) + + layeredComponents.computeIfAbsent(layer) { mutableMapOf() } + .computeIfAbsent(point) { mutableListOf() } += OffsetComponent( + component, + rowOffset, + columnOffset + ) } - - // Too far to the bottom / left to be in bounds - if (row > anchor.row + component.rows - 1 || column > anchor.column + component.columns - 1) { - continue - } - - val rowOffset = anchor.row - row - val columnOffset = anchor.column - column - - val point = Anchor(row, column) - componentsAtPoints.computeIfAbsent(point) { mutableListOf() } += OffsetComponent( - component, - rowOffset, - columnOffset - ) } } } } + val componentsAtPoints = mutableMapOf>() + + for (menuLayer in MenuLayer.values()) { + for ((anchor, offsetComponents) in layeredComponents[menuLayer] ?: emptyMap()) { + componentsAtPoints[anchor] = offsetComponents + } + } + return EcoMenu(rows, componentsAtPoints, title, onClose, onRender, onOpen) } } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt index db27e1e1..22a9c93b 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt @@ -13,23 +13,18 @@ class MenuRenderedInventory( val captiveItems = mutableListOf() val state = mutableMapOf() - fun render(noSideEffects: Boolean = false) { - if (!noSideEffects) { - generateCaptive() - } + fun render() { + generateCaptive() for (row in (1..menu.rows)) { for (column in (1..9)) { val bukkit = MenuUtils.rowColumnToSlot(row, column) val item = menu.getSlot(row, column, player, menu).getItemStack(player) - inventory.setItem(bukkit, item) } } - if (!noSideEffects) { - menu.runOnRender(player) - } + menu.runOnRender(player) } fun generateCaptive() { diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt index f1c16dc0..25c6ac63 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/slot/EcoSlot.kt @@ -6,6 +6,7 @@ import com.willfp.eco.core.gui.slot.functional.SlotHandler import com.willfp.eco.core.gui.slot.functional.SlotProvider import com.willfp.eco.core.gui.slot.functional.SlotUpdater import com.willfp.eco.internal.gui.menu.getMenu +import com.willfp.eco.util.openMenu import org.bukkit.Material import org.bukkit.entity.Player import org.bukkit.event.inventory.ClickType @@ -28,7 +29,7 @@ open class EcoSlot( } override fun getItemStack(player: Player): ItemStack { - val menu = player.openInventory.topInventory.getMenu() ?: return ItemStack(Material.AIR) + val menu = player.openMenu ?: return ItemStack(Material.AIR) val prev = provider.provide(player, menu) return updater.update(player, menu, prev) ?: ItemStack(Material.AIR) } diff --git a/eco-core/core-plugin/build.gradle b/eco-core/core-plugin/build.gradle index 8e9f3616..9b689a51 100644 --- a/eco-core/core-plugin/build.gradle +++ b/eco-core/core-plugin/build.gradle @@ -48,8 +48,8 @@ dependencies { compileOnly 'com.github.N0RSKA:ScytherAPI:55a' // MythicMobs - compileOnly 'io.lumine:Mythic:5.0.1' - compileOnly 'io.lumine:LumineUtils:1.16.1-SNAPSHOT' + //compileOnly 'io.lumine:Mythic:5.0.1' + //compileOnly 'io.lumine:LumineUtils:1.16.1-SNAPSHOT' // CombatLogX V10 + NewbieHelper Expansion compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT' diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt index 3fc90d28..79617c8e 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt @@ -93,12 +93,10 @@ import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefRPGHorses import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefSuperiorSkyblock2 import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard -import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsCustomCrafting import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsExecutableItems import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsMythicMobs import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsScyther import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting @@ -281,7 +279,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { IntegrationLoader("Alice") { AnticheatManager.register(AnticheatAlice()) }, // Custom Entities - IntegrationLoader("MythicMobs") { CustomEntitiesManager.register(CustomEntitiesMythicMobs()) }, + //IntegrationLoader("MythicMobs") { CustomEntitiesManager.register(CustomEntitiesMythicMobs()) }, // Custom Items IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) }, @@ -292,7 +290,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { CustomItemsManager.register(CustomItemsCustomCrafting()) CraftingRecipeListener.registerValidator(CustomRecipeCustomCrafting()) }, - IntegrationLoader("MythicMobs") { CustomItemsManager.register(CustomItemsMythicMobs(this)) }, + //IntegrationLoader("MythicMobs") { CustomItemsManager.register(CustomItemsMythicMobs(this)) }, IntegrationLoader("Scyther") { CustomItemsManager.register(CustomItemsScyther()) }, // Shop diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customentities/CustomEntitiesMythicMobs.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customentities/CustomEntitiesMythicMobs.kt index f1e801fa..ffe8be8d 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customentities/CustomEntitiesMythicMobs.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customentities/CustomEntitiesMythicMobs.kt @@ -1,10 +1,6 @@ package com.willfp.eco.internal.spigot.integrations.customentities -import com.willfp.eco.core.entities.CustomEntity -import com.willfp.eco.core.integrations.customentities.CustomEntitiesIntegration -import io.lumine.mythic.bukkit.MythicBukkit -import org.bukkit.NamespacedKey - +/* class CustomEntitiesMythicMobs : CustomEntitiesIntegration { override fun registerAllEntities() { val mobManager = MythicBukkit.inst().mobManager @@ -29,4 +25,6 @@ class CustomEntitiesMythicMobs : CustomEntitiesIntegration { override fun getPluginName(): String { return "MythicMobs" } -} \ No newline at end of file +} + + */ \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsMythicMobs.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsMythicMobs.kt index b9508d9b..4ea6ae4d 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsMythicMobs.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsMythicMobs.kt @@ -1,20 +1,6 @@ package com.willfp.eco.internal.spigot.integrations.customitems -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.core.integrations.customitems.CustomItemsIntegration -import com.willfp.eco.core.items.Items -import com.willfp.eco.core.recipe.parts.EmptyTestableItem -import io.lumine.mythic.api.adapters.AbstractItemStack -import io.lumine.mythic.api.config.MythicLineConfig -import io.lumine.mythic.api.drops.DropMetadata -import io.lumine.mythic.api.drops.IItemDrop -import io.lumine.mythic.bukkit.adapters.BukkitItemStack -import io.lumine.mythic.bukkit.events.MythicDropLoadEvent -import org.bukkit.Material -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener -import org.bukkit.inventory.ItemStack - +/* class CustomItemsMythicMobs( private val plugin: EcoPlugin ) : CustomItemsIntegration, Listener { @@ -52,3 +38,4 @@ class CustomItemsMythicMobs( } } } + */ \ No newline at end of file