From e36f3a1694fc9cc03bd03b57d06cb44a9700761a Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:04:19 +0200 Subject: [PATCH] Optimized list gui mapped to gui initialisation --- .../alexcrea/cuanvil/api/UnitRepairApi.java | 14 +++--- .../config/global/CustomRecipeConfigGui.java | 19 ++++---- .../gui/config/global/EnchantConflictGui.java | 7 +-- .../gui/config/global/GroupConfigGui.java | 7 +-- .../config/global/UnitRepairConfigGui.java | 19 ++++---- .../config/list/MappedGuiListConfigGui.java | 46 ++++++++++++++++--- .../config/list/UnitRepairElementListGui.java | 10 +--- .../elements/CustomRecipeSubSettingGui.java | 5 +- .../list/elements/ElementMappedToListGui.java | 3 -- .../EnchantConflictSubSettingGui.java | 6 +-- .../elements/GroupConfigSubSettingGui.java | 5 +- .../elements/MappedToListSubSettingGui.java | 8 ---- .../xyz/alexcrea/cuanvil/util/LazyValue.java | 36 +++++++++++++++ 13 files changed, 119 insertions(+), 66 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/util/LazyValue.java diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java index d471b19..fb68448 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/UnitRepairApi.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.config.ConfigHolder; import xyz.alexcrea.cuanvil.dependency.DependencyManager; import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui; +import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui; import java.util.ArrayList; @@ -94,9 +95,9 @@ public class UnitRepairApi { // Add to gui UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance(); if(repairConfigGui != null) { - UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit); + UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored(); - elementGui.updateValueForGeneric(repairableName, true); + if(elementGui != null) elementGui.updateValueForGeneric(repairableName, true); repairConfigGui.updateValueForGeneric(unit, true); } @@ -124,14 +125,15 @@ public class UnitRepairApi { boolean lastValue = false; if(config.isConfigurationSection(unitName.toLowerCase())) { ConfigurationSection section = config.getConfigurationSection(unitName.toLowerCase()); - if(section.getKeys(false).isEmpty()) { + + if(section != null && section.getKeys(false).isEmpty()) { lastValue = true; config.set(unitName.toLowerCase(), null); } } else if (config.isConfigurationSection(unitName.toUpperCase())) { ConfigurationSection section = config.getConfigurationSection(unitName.toUpperCase()); - if(section.getKeys(false).isEmpty()) { + if(section != null && section.getKeys(false).isEmpty()) { lastValue = true; config.set(unitName.toUpperCase(), null); } @@ -146,9 +148,9 @@ public class UnitRepairApi { // Remove from gui UnitRepairConfigGui repairConfigGui = UnitRepairConfigGui.getCurrentInstance(); if(repairConfigGui != null) { - UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit); + UnitRepairElementListGui elementGui = repairConfigGui.getInstanceOrCreate(unit).getStored(); - elementGui.removeGeneric(repairableName); + if(elementGui != null) elementGui.removeGeneric(repairableName); if(lastValue){ repairConfigGui.removeGeneric(unit); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java index 5a68e6e..953f37f 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java @@ -17,7 +17,8 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; import java.util.Collection; -public class CustomRecipeConfigGui extends MappedGuiListConfigGui { +public class CustomRecipeConfigGui extends MappedGuiListConfigGui> { private static CustomRecipeConfigGui INSTANCE = new CustomRecipeConfigGui(); @@ -44,15 +45,15 @@ public class CustomRecipeConfigGui extends MappedGuiListConfigGui newInstanceOfGui(AnvilCustomRecipe generic, GuiItem item) { + return new LazyElement<>(item, () -> new CustomRecipeSubSettingGui(this, generic)); } @Override diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java index e9525f4..912e6cb 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java @@ -18,7 +18,8 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; import java.util.Collection; -public class EnchantConflictGui extends MappedGuiListConfigGui { +public class EnchantConflictGui extends MappedGuiListConfigGui> { private static EnchantConflictGui INSTANCE; @@ -86,8 +87,8 @@ public class EnchantConflictGui extends MappedGuiListConfigGui newInstanceOfGui(EnchantConflictGroup conflict, GuiItem item) { + return new LazyElement<>(item, () -> new EnchantConflictSubSettingGui(this, conflict)); } @Override diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java index 8684d4d..8e20751 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java @@ -15,12 +15,13 @@ import xyz.alexcrea.cuanvil.group.ItemGroupManager; import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.list.elements.GroupConfigSubSettingGui; import xyz.alexcrea.cuanvil.util.CasedStringUtil; +import xyz.alexcrea.cuanvil.util.LazyValue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -public class GroupConfigGui extends MappedGuiListConfigGui { +public class GroupConfigGui extends MappedGuiListConfigGui> { private static GroupConfigGui INSTANCE; @@ -73,8 +74,8 @@ public class GroupConfigGui extends MappedGuiListConfigGui newInstanceOfGui(IncludeGroup group, GuiItem item) { + return new LazyElement<>(item, () -> new GroupConfigSubSettingGui(this, group)); } @Override diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java index 833aea1..0e366ae 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java @@ -18,7 +18,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -public class UnitRepairConfigGui extends MappedGuiListConfigGui { +public class UnitRepairConfigGui extends + MappedGuiListConfigGui> { private static UnitRepairConfigGui INSTANCE; @@ -41,10 +42,12 @@ public class UnitRepairConfigGui extends MappedGuiListConfigGui newInstanceOfGui(Material material, GuiItem item) { + return new LazyElement<>(item, () -> { + UnitRepairElementListGui element = new UnitRepairElementListGui(material, this); + element.init(); + return element; + }); } @Override @@ -115,7 +118,7 @@ public class UnitRepairConfigGui extends MappedGuiListConfigGui getInstanceOrCreate(Material mat){ + LazyElement element = this.elementGuiMap.get(mat); if(element == null){ updateValueForGeneric(mat, false); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java index cf4b852..3aa18e0 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/MappedGuiListConfigGui.java @@ -3,15 +3,19 @@ package xyz.alexcrea.cuanvil.gui.config.list; import com.github.stefvanschie.inventoryframework.gui.GuiItem; import io.delilaheve.CustomAnvil; import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.gui.config.list.elements.ElementMappedToListGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions; +import xyz.alexcrea.cuanvil.util.LazyValue; import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.Supplier; -public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGui> extends MappedElementListConfigGui< T, S > { +public abstract class MappedGuiListConfigGui< T, S extends MappedGuiListConfigGui.LazyElement> + extends MappedElementListConfigGui< T, S > { protected MappedGuiListConfigGui(@NotNull String title) { super(title); @@ -20,7 +24,10 @@ public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGu @Override public void reloadValues() { - this.elementGuiMap.forEach((conflict, gui) -> gui.cleanAndBeUnusable()); + this.elementGuiMap.forEach((conflict, element) -> { + ElementMappedToListGui gui = element.getStored(); + if(gui != null) gui.cleanAndBeUnusable(); + }); this.elementGuiMap.clear(); super.reloadValues(); @@ -30,23 +37,24 @@ public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGu protected S newElementRequested(T generic, GuiItem newItem) { S element = newInstanceOfGui(generic, newItem); - newItem.setAction(GuiGlobalActions.openGuiAction(element.getMappedGui())); + newItem.setAction(element.openAction()); return element; } @Override protected GuiItem findItemFromElement(T generic, S element) { - return element.getParentItemForThisGui(); + return element.getParentItem(); } @Override protected void updateElement(T generic, S element) { - element.updateLocal(); + ElementMappedToListGui gui = element.getStored(); + if(gui != null) gui.updateLocal(); } @Override protected GuiItem findGuiItemForRemoval(T generic, S element) { - return element.getParentItemForThisGui(); + return element.getParentItem(); } @Override @@ -90,7 +98,7 @@ public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGu updateValueForGeneric(generic, true); // show the new conflict config to the player - this.elementGuiMap.get(generic).getMappedGui().show(player); + this.elementGuiMap.get(generic).get().getMappedGui().show(player); update(); }; @@ -105,4 +113,28 @@ public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGu protected abstract T createAndSaveNewEmptyGeneric(String name); + public static class LazyElement extends LazyValue { + + private final GuiItem parentItem; + private final LazyValue> lazyOpenConsumer; + public LazyElement(GuiItem parentItem, Supplier valueSupplier) { + super(valueSupplier); + this.parentItem = parentItem; + + this.lazyOpenConsumer = new LazyValue<>(() -> + GuiGlobalActions.openGuiAction(this.get().getMappedGui())) + ; + } + + public GuiItem getParentItem() { + return parentItem; + } + + @NotNull + public Consumer openAction(){ + return event -> lazyOpenConsumer.get().accept(event); + } + + } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java index 0bf2a03..35f8ebb 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/UnitRepairElementListGui.java @@ -26,17 +26,14 @@ import java.util.function.Consumer; public class UnitRepairElementListGui extends SettingGuiListConfigGui implements ElementMappedToListGui { - private final GuiItem parentItem; private final Material parentMaterial; private final UnitRepairConfigGui parentGui; private final String materialName; private boolean shouldWork = true; public UnitRepairElementListGui(@NotNull Material parentMaterial, - @NotNull UnitRepairConfigGui parentGui, - @NotNull GuiItem parentItem) { + @NotNull UnitRepairConfigGui parentGui) { super("§e" + CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.name().toLowerCase()) + " §rUnit repair"); - this.parentItem = parentItem; this.parentMaterial = parentMaterial; this.parentGui = parentGui; this.materialName = CasedStringUtil.snakeToUpperSpacedCase(parentMaterial.name().toLowerCase()); @@ -165,11 +162,6 @@ public class UnitRepairElementListGui extends SettingGuiListConfigGui { + + private final Supplier valueSupplier; + private T storedValue; + + public LazyValue(Supplier valueSupplier) { + this.valueSupplier = valueSupplier; + this.storedValue = null; + } + + @Nullable + public T getStored(){ + return storedValue; + } + + @NotNull + public T get(){ + if (storedValue != null) return storedValue; + + synchronized(this) { + if(storedValue == null) { + storedValue = valueSupplier.get(); + } + } + + return storedValue; + } + +}