From 05f05e2ddfd64654972ae77ec7a06cc854445063 Mon Sep 17 00:00:00 2001 From: siansxint Date: Tue, 7 Jan 2025 21:33:32 -0400 Subject: [PATCH 01/28] feat: set hooks as active when they really are --- .../lojosho/hibiscuscommons/hooks/Hook.java | 19 ++++++-- .../lojosho/hibiscuscommons/hooks/Hooks.java | 44 +++++++++++++++---- .../hooks/items/HookDenizen.java | 1 + .../hibiscuscommons/hooks/items/HookEco.java | 1 + .../hooks/items/HookGeary.java | 1 + .../hooks/items/HookItemAdder.java | 25 +++++++---- .../hooks/items/HookMMOItems.java | 1 + .../hooks/items/HookMythic.java | 5 ++- .../hibiscuscommons/hooks/items/HookNexo.java | 17 ++++--- .../hooks/items/HookOraxen.java | 1 + .../hibiscuscommons/hooks/misc/HookCMI.java | 1 + .../hooks/misc/HookCustomFishing.java | 1 + .../hibiscuscommons/hooks/misc/HookGSit.java | 1 + .../hooks/misc/HookHMCColor.java | 1 + .../hooks/misc/HookLibsDisguises.java | 1 + .../hooks/misc/HookModelEngine.java | 1 + .../hooks/misc/HookPremiumVanish.java | 1 + .../hooks/misc/HookSuperVanish.java | 1 + .../placeholders/HookPlaceholderAPI.java | 1 + 19 files changed, 96 insertions(+), 28 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java index e4ed002..e27640e 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java @@ -10,8 +10,11 @@ import org.jetbrains.annotations.Nullable; * Represents a hook into other minecraft plugins */ public abstract class Hook implements Listener { + private final String id; + private boolean active = false; + private boolean itemHook = false; private boolean entityHook = false; @@ -27,6 +30,7 @@ public abstract class Hook implements Listener { break; } } + Hooks.addHook(this); } @@ -35,10 +39,11 @@ public abstract class Hook implements Listener { * * @implNote By default, this method does nothing. It should be overridden by child classes to implement any necessary loading logic */ - public void load() { } + public void load() {} /** * Gets an {@link ItemStack} that is associated with the provided id from the hooked plugin + * * @param itemId The id of the {@link ItemStack} * @return The {@link ItemStack} with the id provided. If an invalid id was provided or if the hook doesn't have any related {@link ItemStack}s then this will return null * @implNote By default, this method returns null. It should be overridden by child classes if you will to have your hook return a related {@link ItemStack} @@ -60,6 +65,7 @@ public abstract class Hook implements Listener { /** * Gets whether this hook has been activated + * * @return true if this hook is active, false otherwise * @deprecated As of release 2.2.5+, replaced by {@link #isActive()} */ @@ -70,6 +76,7 @@ public abstract class Hook implements Listener { /** * Gets whether this hook has been activated + * * @return true if this hook is active, false otherwise * @since 2.2.5 */ @@ -79,16 +86,21 @@ public abstract class Hook implements Listener { /** * Sets whether this hook is active + * * @param active true to activate the hook, false otherwise */ public final void setActive(boolean active) { this.active = active; + + if (active) { + Hooks.checkHookLoadingStatus(); + } } /** * Whether the method {@link #getItem(String)} should return a non-null value - * @return true if {@link #getItem(String)} should return a non-null value, false otherwise * + * @return true if {@link #getItem(String)} should return a non-null value, false otherwise * @apiNote Even though this method returns true does not mean that {@link #getItem(String)} won't return null, rather if this returns false then {@link #getItem(String)} should return false everytime */ public final boolean hasEnabledItemHook() { @@ -101,6 +113,7 @@ public abstract class Hook implements Listener { /** * Sets whether the method {@link #getItem(String)} should return a non-null value + * * @param enabled true if {@link #getItem(String)} should return a non-null value, false otherwise */ public final void setEnabledItemHook(boolean enabled) { @@ -118,4 +131,4 @@ public abstract class Hook implements Listener { public String getEntityString(@NotNull Entity entity) { return null; } -} +} \ No newline at end of file diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index db555dd..a8d23fa 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -3,6 +3,7 @@ package me.lojosho.hibiscuscommons.hooks; import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.api.events.AllHooksActiveEvent; import me.lojosho.hibiscuscommons.hooks.items.*; import me.lojosho.hibiscuscommons.hooks.misc.*; import me.lojosho.hibiscuscommons.hooks.placeholders.HookPlaceholderAPI; @@ -15,10 +16,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.Map; public class Hooks { - private static final HashMap hooks = new HashMap<>(); + private static final HashMap HOOK_POOL = new HashMap<>(); + private static final HookNexo NEXO_HOOK = new HookNexo(); private static final HookOraxen ORAXEN_HOOK = new HookOraxen(); private static final HookItemAdder ITEMADDER_HOOK = new HookItemAdder(); @@ -37,16 +40,19 @@ public class Hooks { private static final HookCustomFishing CF_HOOK = new HookCustomFishing(); private static final HookGSit GSIT_HOOK = new HookGSit(); + private static final Map HOOKED = new HashMap<>(); + private static boolean allHooksActive = false; + public static Hook getHook(@NotNull String id) { - return hooks.get(id.toLowerCase()); + return HOOK_POOL.get(id.toLowerCase()); } public static boolean isItemHook(@NotNull String id) { - return hooks.containsKey(id.toLowerCase()); + return HOOK_POOL.containsKey(id.toLowerCase()); } public static void addHook(Hook hook) { - hooks.put(hook.getId().toLowerCase(), hook); + HOOK_POOL.put(hook.getId().toLowerCase(), hook); } public static void addPlaceholderAPI(PlaceholderExpansion expansion) { @@ -63,16 +69,38 @@ public class Hooks { } public static void setup() { - for (Hook hook : hooks.values()) { + for (Hook hook : HOOK_POOL.values()) { if (Bukkit.getPluginManager().getPlugin(hook.getId()) != null) { HibiscusCommonsPlugin.getInstance().getServer().getPluginManager().registerEvents(hook, HibiscusCommonsPlugin.getInstance()); - hook.setActive(true); hook.load(); + + HOOKED.put(hook.getId(), hook); + HibiscusCommonsPlugin.getInstance().getLogger().info("Successfully hooked into " + hook.getId()); } } } + /** + * Checks if all hooked hooks are actually active + * so {@link AllHooksActiveEvent} is called. + * This is an operation that occurs only once to allow plugins + * load their stuff successfully when all hooks are active. + */ + static void checkHookLoadingStatus() { + if (allHooksActive) { + return; + } + + if (!HOOKED.values().stream() + .allMatch(Hook::isActive)) { + return; + } + + allHooksActive = true; + Bukkit.getPluginManager().callEvent(new AllHooksActiveEvent()); + } + @Nullable public static ItemStack getItem(@NotNull String raw) { if (!raw.contains(":")) { @@ -93,7 +121,7 @@ public class Hooks { } public static String getStringItem(ItemStack itemStack) { - for (Hook hook : hooks.values()) { + for (Hook hook : HOOK_POOL.values()) { if (hook.isActive() && hook.hasEnabledItemHook()) { String stringyItem = hook.getItemString(itemStack); if (stringyItem == null) continue; @@ -104,7 +132,7 @@ public class Hooks { } public static String getStringEntity(Entity entity) { - for (Hook hook : hooks.values()) { + for (Hook hook : HOOK_POOL.values()) { if (hook.isActive() && hook.hasEnabledEntityHook()) { String stringyEntity = hook.getEntityString(entity); if (stringyEntity != null) return hook.getId() + ":" + stringyEntity; diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookDenizen.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookDenizen.java index 0770095..205bd05 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookDenizen.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookDenizen.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.NotNull; public class HookDenizen extends Hook { public HookDenizen() { super("denizen", HookFlag.ITEM_SUPPORT); + setActive(true); } /** diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookEco.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookEco.java index 01ddb37..9b2b359 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookEco.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookEco.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull; public class HookEco extends Hook { public HookEco() { super("Eco", HookFlag.ITEM_SUPPORT); + setActive(true); } @Override diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookGeary.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookGeary.java index a7ff5ba..c67d503 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookGeary.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookGeary.java @@ -21,6 +21,7 @@ public class HookGeary extends Hook { public HookGeary() { super("geary", HookFlag.ITEM_SUPPORT); + setActive(true); } /** diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java index 0886d3b..89faf4a 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java @@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull; */ @SuppressWarnings("SpellCheckingInspection") public class HookItemAdder extends Hook { - private boolean enabled = false; public HookItemAdder() { super("itemsadder", HookFlag.ITEM_SUPPORT); @@ -32,7 +31,7 @@ public class HookItemAdder extends Hook { */ @Override public ItemStack getItem(@NotNull String itemId) { - if (enabled) { + if (isActive()) { CustomStack stack = CustomStack.getInstance(itemId); if (stack == null) return null; return stack.getItemStack().clone(); @@ -43,10 +42,13 @@ public class HookItemAdder extends Hook { @EventHandler(priority = EventPriority.MONITOR) public void onItemAdderDataLoad(ItemsAdderLoadDataEvent event) { - HibiscusHookReload.ReloadType reloadType = enabled ? HibiscusHookReload.ReloadType.RELOAD : HibiscusHookReload.ReloadType.INITIAL; - this.enabled = true; - HibiscusHookReload newEvent = new HibiscusHookReload(this, reloadType); - Bukkit.getPluginManager().callEvent(newEvent); + HibiscusHookReload.ReloadType type = HibiscusHookReload.ReloadType.RELOAD; + if (!isActive()) { + type = HibiscusHookReload.ReloadType.INITIAL; + setActive(true); + } + + Bukkit.getPluginManager().callEvent(new HibiscusHookReload(this, type)); } @EventHandler(priority = EventPriority.MONITOR) @@ -69,7 +71,14 @@ public class HookItemAdder extends Hook { return CustomStack.byItemStack(itemStack).getId(); } + /** + * Checks if ItemsAdder hook is enabled + * @return whether ItemsAdder hook is enabled or not + * @deprecated as you can just check if the hook is active + * by calling {@link #isActive()} + */ + @Deprecated public boolean getIAEnabled() { - return enabled; + return isActive(); } -} +} \ No newline at end of file diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMMOItems.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMMOItems.java index 20ac493..f247498 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMMOItems.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMMOItems.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull; public class HookMMOItems extends Hook { public HookMMOItems() { super("MMOItems", HookFlag.ITEM_SUPPORT); + setActive(true); } @Override diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMythic.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMythic.java index a7fb53d..a1d0e7b 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMythic.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookMythic.java @@ -9,16 +9,17 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; /** - * A hook that integrates the plugin {@link io.lumine.mythic.bukkit.MythicBukkit MythicBukkit} to provide custom items + * A hook that integrates the plugin {@link MythicBukkit MythicBukkit} to provide custom items */ @SuppressWarnings("SpellCheckingInspection") public class HookMythic extends Hook { public HookMythic() { super("mythicmobs", HookFlag.ITEM_SUPPORT, HookFlag.ENTITY_SUPPORT); + setActive(true); } /** - * Gets a cosmetic {@link ItemStack} that is associated with the provided id from the plugin {@link io.lumine.mythic.bukkit.MythicBukkit MythicBukkit} + * Gets a cosmetic {@link ItemStack} that is associated with the provided id from the plugin {@link MythicBukkit MythicBukkit} */ @Override public ItemStack getItem(@NotNull String itemId) { diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java index b5e2067..e36c567 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.NotNull; */ @SuppressWarnings("SpellCheckingInspection") public class HookNexo extends Hook { - private boolean enabled = false; + public HookNexo() { super("nexo", HookFlag.ITEM_SUPPORT); } @@ -27,7 +27,7 @@ public class HookNexo extends Hook { */ @Override public ItemStack getItem(@NotNull String itemId) { - return NexoItems.optionalItemFromId(itemId).map(ItemBuilder::build).orElse(enabled ? new ItemStack(Material.AIR) : null); + return NexoItems.optionalItemFromId(itemId).map(ItemBuilder::build).orElse(isActive() ? new ItemStack(Material.AIR) : null); } @Override @@ -39,9 +39,12 @@ public class HookNexo extends Hook { @EventHandler public void onLoadItems(NexoItemsLoadedEvent event) { - HibiscusHookReload.ReloadType reloadType = enabled ? HibiscusHookReload.ReloadType.RELOAD : HibiscusHookReload.ReloadType.INITIAL; - this.enabled = true; - HibiscusHookReload newEvent = new HibiscusHookReload(this, reloadType); - Bukkit.getPluginManager().callEvent(newEvent); + HibiscusHookReload.ReloadType type = HibiscusHookReload.ReloadType.RELOAD; + if (!isActive()) { + type = HibiscusHookReload.ReloadType.INITIAL; + setActive(true); + } + + Bukkit.getPluginManager().callEvent(new HibiscusHookReload(this, type)); } -} +} \ No newline at end of file diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookOraxen.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookOraxen.java index 27792fe..29a9882 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookOraxen.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookOraxen.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.NotNull; public class HookOraxen extends Hook { public HookOraxen() { super("oraxen", HookFlag.ITEM_SUPPORT); + setActive(true); } /** diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java index cd7623b..158e8ae 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java @@ -16,6 +16,7 @@ import org.jetbrains.annotations.NotNull; public class HookCMI extends Hook { public HookCMI() { super("CMI"); + setActive(true); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCustomFishing.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCustomFishing.java index dc933a7..bfa9462 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCustomFishing.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCustomFishing.java @@ -12,6 +12,7 @@ public class HookCustomFishing extends Hook { public HookCustomFishing() { super("CustomFishing"); + setActive(true); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookGSit.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookGSit.java index 150faa7..428115d 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookGSit.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookGSit.java @@ -12,6 +12,7 @@ public class HookGSit extends Hook { public HookGSit() { super("GSit"); + setActive(true); } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookHMCColor.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookHMCColor.java index d3748b9..97cb687 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookHMCColor.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookHMCColor.java @@ -6,5 +6,6 @@ import me.lojosho.hibiscuscommons.hooks.Hook; public class HookHMCColor extends Hook { public HookHMCColor() { super("HMCColor"); + setActive(true); } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java index 8626024..3886ac8 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.NotNull; public class HookLibsDisguises extends Hook { public HookLibsDisguises() { super("LibsDisguises"); + setActive(true); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookModelEngine.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookModelEngine.java index cbd0132..28cb875 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookModelEngine.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookModelEngine.java @@ -9,6 +9,7 @@ public class HookModelEngine extends Hook { public HookModelEngine() { super("ModelEngine"); + setActive(true); } @Override diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java index 24e2fcc..982c68e 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull; public class HookPremiumVanish extends Hook { public HookPremiumVanish() { super("PremiumVanish"); + setActive(true); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java index 0ab7779..3b1dcaf 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull; public class HookSuperVanish extends Hook { public HookSuperVanish() { super("SuperVanish"); + setActive(true); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/placeholders/HookPlaceholderAPI.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/placeholders/HookPlaceholderAPI.java index e8e41b9..3e453c8 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/placeholders/HookPlaceholderAPI.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/placeholders/HookPlaceholderAPI.java @@ -11,6 +11,7 @@ public class HookPlaceholderAPI extends Hook { public HookPlaceholderAPI() { super("PlaceholderAPI"); + setActive(true); } public void registerPlaceholder(PlaceholderExpansion placeholderExpansion) { From cd27258bf20cf944cf0c740a955552bb86b367ed Mon Sep 17 00:00:00 2001 From: siansxint Date: Tue, 7 Jan 2025 21:34:23 -0400 Subject: [PATCH 02/28] feat: add AllHooksActiveEvent so external plugins actually know when to load their stuff --- .../api/events/AllHooksActiveEvent.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java b/common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java new file mode 100644 index 0000000..11cef5e --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java @@ -0,0 +1,19 @@ +package me.lojosho.hibiscuscommons.api.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class AllHooksActiveEvent extends Event { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} \ No newline at end of file From 4fd443d21c5f58b5acb3d5fc98edee9ba333d29d Mon Sep 17 00:00:00 2001 From: siansxint Date: Wed, 8 Jan 2025 12:34:26 -0400 Subject: [PATCH 03/28] ref: rename from AllHooksActiveEvent.java -> HibiscusHooksAllActiveEvent --- ...oksActiveEvent.java => HibiscusHooksAllActiveEvent.java} | 2 +- .../main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename common/src/main/java/me/lojosho/hibiscuscommons/api/events/{AllHooksActiveEvent.java => HibiscusHooksAllActiveEvent.java} (87%) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java b/common/src/main/java/me/lojosho/hibiscuscommons/api/events/HibiscusHooksAllActiveEvent.java similarity index 87% rename from common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java rename to common/src/main/java/me/lojosho/hibiscuscommons/api/events/HibiscusHooksAllActiveEvent.java index 11cef5e..a9e0bbb 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/api/events/AllHooksActiveEvent.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/api/events/HibiscusHooksAllActiveEvent.java @@ -4,7 +4,7 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; -public class AllHooksActiveEvent extends Event { +public class HibiscusHooksAllActiveEvent extends Event { private static final HandlerList HANDLER_LIST = new HandlerList(); diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index a8d23fa..0773cbb 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -3,7 +3,7 @@ package me.lojosho.hibiscuscommons.hooks; import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; -import me.lojosho.hibiscuscommons.api.events.AllHooksActiveEvent; +import me.lojosho.hibiscuscommons.api.events.HibiscusHooksAllActiveEvent; import me.lojosho.hibiscuscommons.hooks.items.*; import me.lojosho.hibiscuscommons.hooks.misc.*; import me.lojosho.hibiscuscommons.hooks.placeholders.HookPlaceholderAPI; @@ -83,7 +83,7 @@ public class Hooks { /** * Checks if all hooked hooks are actually active - * so {@link AllHooksActiveEvent} is called. + * so {@link HibiscusHooksAllActiveEvent} is called. * This is an operation that occurs only once to allow plugins * load their stuff successfully when all hooks are active. */ @@ -98,7 +98,7 @@ public class Hooks { } allHooksActive = true; - Bukkit.getPluginManager().callEvent(new AllHooksActiveEvent()); + Bukkit.getPluginManager().callEvent(new HibiscusHooksAllActiveEvent()); } @Nullable From 09faac9131bd36630f10317ed7add3142ffc1024 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 9 Jan 2025 15:47:28 -0600 Subject: [PATCH 04/28] feat: improve activating AllHooksActive event to better handle late loading --- .../lojosho/hibiscuscommons/hooks/Hook.java | 25 ++++++++++++++++--- .../hibiscuscommons/hooks/HookFlag.java | 1 + .../lojosho/hibiscuscommons/hooks/Hooks.java | 23 +++++++++++------ .../hooks/items/HookItemAdder.java | 2 +- .../hibiscuscommons/hooks/items/HookNexo.java | 2 +- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java index e27640e..e784d67 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java @@ -13,10 +13,12 @@ public abstract class Hook implements Listener { private final String id; + private boolean detected = false; private boolean active = false; private boolean itemHook = false; private boolean entityHook = false; + private boolean lateLoadHook = false; public Hook(@NotNull String id, HookFlag... flags) { this.id = id; @@ -28,6 +30,9 @@ public abstract class Hook implements Listener { case ENTITY_SUPPORT: setEnabledEntityHook(true); break; + case LATE_LOAD: + setEnabledLateLoadHook(true); + break; } } @@ -92,9 +97,15 @@ public abstract class Hook implements Listener { public final void setActive(boolean active) { this.active = active; - if (active) { - Hooks.checkHookLoadingStatus(); - } + if (hasEnabledLateLoadHook()) Hooks.checkHookLoadingStatus(); + } + + public final boolean isDetected() { + return this.detected; + } + + public final void setDetected(boolean detected) { + this.detected = detected; } /** @@ -111,6 +122,10 @@ public abstract class Hook implements Listener { return entityHook; } + public final boolean hasEnabledLateLoadHook() { + return lateLoadHook; + } + /** * Sets whether the method {@link #getItem(String)} should return a non-null value * @@ -124,6 +139,10 @@ public abstract class Hook implements Listener { entityHook = enabled; } + public final void setEnabledLateLoadHook(boolean enabled) { + lateLoadHook = enabled; + } + public String getItemString(@NotNull ItemStack itemStack) { return null; } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/HookFlag.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/HookFlag.java index 168e9fb..6f4bde7 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/HookFlag.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/HookFlag.java @@ -3,4 +3,5 @@ package me.lojosho.hibiscuscommons.hooks; public enum HookFlag { ITEM_SUPPORT, ENTITY_SUPPORT, + LATE_LOAD } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index 0773cbb..4f38211 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -7,6 +7,7 @@ import me.lojosho.hibiscuscommons.api.events.HibiscusHooksAllActiveEvent; import me.lojosho.hibiscuscommons.hooks.items.*; import me.lojosho.hibiscuscommons.hooks.misc.*; import me.lojosho.hibiscuscommons.hooks.placeholders.HookPlaceholderAPI; +import me.lojosho.hibiscuscommons.util.MessagesUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -16,12 +17,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; public class Hooks { private static final HashMap HOOK_POOL = new HashMap<>(); - private static final HookNexo NEXO_HOOK = new HookNexo(); private static final HookOraxen ORAXEN_HOOK = new HookOraxen(); private static final HookItemAdder ITEMADDER_HOOK = new HookItemAdder(); @@ -40,7 +41,6 @@ public class Hooks { private static final HookCustomFishing CF_HOOK = new HookCustomFishing(); private static final HookGSit GSIT_HOOK = new HookGSit(); - private static final Map HOOKED = new HashMap<>(); private static boolean allHooksActive = false; public static Hook getHook(@NotNull String id) { @@ -72,10 +72,9 @@ public class Hooks { for (Hook hook : HOOK_POOL.values()) { if (Bukkit.getPluginManager().getPlugin(hook.getId()) != null) { HibiscusCommonsPlugin.getInstance().getServer().getPluginManager().registerEvents(hook, HibiscusCommonsPlugin.getInstance()); + hook.setDetected(true); hook.load(); - HOOKED.put(hook.getId(), hook); - HibiscusCommonsPlugin.getInstance().getLogger().info("Successfully hooked into " + hook.getId()); } } @@ -87,16 +86,26 @@ public class Hooks { * This is an operation that occurs only once to allow plugins * load their stuff successfully when all hooks are active. */ - static void checkHookLoadingStatus() { + public static void checkHookLoadingStatus() { if (allHooksActive) { return; } - if (!HOOKED.values().stream() - .allMatch(Hook::isActive)) { + List lateLoadHooks = HOOK_POOL.values().stream().filter(Hook::isDetected).filter(Hook::hasEnabledLateLoadHook).toList(); + if (lateLoadHooks.isEmpty()) { + MessagesUtil.sendDebugMessages("Not awaiting anymore plugins... All hooks are now active."); + setAllHooksActive(); return; } + List activeLateHooks = lateLoadHooks.stream().filter(Hook::isActive).toList(); + if (activeLateHooks.size() == lateLoadHooks.size()) { + MessagesUtil.sendDebugMessages("Match Hook"); + setAllHooksActive(); + } + } + + private static void setAllHooksActive() { allHooksActive = true; Bukkit.getPluginManager().callEvent(new HibiscusHooksAllActiveEvent()); } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java index 89faf4a..a7102b8 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookItemAdder.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.NotNull; public class HookItemAdder extends Hook { public HookItemAdder() { - super("itemsadder", HookFlag.ITEM_SUPPORT); + super("itemsadder", HookFlag.ITEM_SUPPORT, HookFlag.LATE_LOAD); } /** diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java index e36c567..7c4015b 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/items/HookNexo.java @@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull; public class HookNexo extends Hook { public HookNexo() { - super("nexo", HookFlag.ITEM_SUPPORT); + super("nexo", HookFlag.ITEM_SUPPORT, HookFlag.LATE_LOAD); } /** From d1ce3d2737dde7ebd1bde48100171d9c542a9767 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 9 Jan 2025 15:53:54 -0600 Subject: [PATCH 05/28] fix: readd checkHookLoadingStatus at end of setup method (fixes not running event when no late loads are there) --- .../src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index 4f38211..59673e5 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -78,6 +78,8 @@ public class Hooks { HibiscusCommonsPlugin.getInstance().getLogger().info("Successfully hooked into " + hook.getId()); } } + + checkHookLoadingStatus(); } /** From b3f3b2ddbfa25c8dc1d41384dd23c22414962ac2 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:08:57 -0600 Subject: [PATCH 06/28] chore: update apache lang3 to 3.17.0 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 00e40be..2d1c913 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -109,7 +109,7 @@ allprojects { compileOnly("net.kyori:adventure-api:4.18.0") compileOnly("net.kyori:adventure-text-minimessage:4.18.0") compileOnly("net.kyori:adventure-platform-bukkit:4.3.4") - compileOnly("org.apache.commons:commons-lang3:3.14.0") + compileOnly("org.apache.commons:commons-lang3:3.17.0") // Shaded Dependencies implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") @@ -218,7 +218,7 @@ bukkit { "net.kyori:adventure-api:4.18.0", "net.kyori:adventure-text-minimessage:4.18.0", "net.kyori:adventure-platform-bukkit:4.3.4", - "org.apache.commons:commons-lang3:3.14.0" + "org.apache.commons:commons-lang3:3.17.0" //"org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT" // Readd when 4.2.0 releases ) } From b0336c67dea999453dd3eb2277887b48ba7574f1 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:09:29 -0600 Subject: [PATCH 07/28] chore: update lombok to 1.18.36 --- build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2d1c913..085e22a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -100,10 +100,10 @@ allprojects { compileOnly("org.joml:joml:1.10.5") // Lombok <3 - annotationProcessor("org.projectlombok:lombok:1.18.34") - compileOnly("org.projectlombok:lombok:1.18.34") - testCompileOnly("org.projectlombok:lombok:1.18.34") - testAnnotationProcessor("org.projectlombok:lombok:1.18.34") + annotationProcessor("org.projectlombok:lombok:1.18.36") + compileOnly("org.projectlombok:lombok:1.18.36") + testCompileOnly("org.projectlombok:lombok:1.18.36") + testAnnotationProcessor("org.projectlombok:lombok:1.18.36") // Spigot Auto Loader Libraries compileOnly("net.kyori:adventure-api:4.18.0") From 14c9f1b3f8effbeea18b391f3659dd7e37632dff Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:09:54 -0600 Subject: [PATCH 08/28] chore: update joml to 1.10.8 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 085e22a..83b36c8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -97,7 +97,7 @@ allprojects { compileOnly("com.github.Xiao-MoMi:Custom-Fishing:2.2.26") compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.2") compileOnly("com.comphenix.protocol:ProtocolLib:5.3.0") - compileOnly("org.joml:joml:1.10.5") + compileOnly("org.joml:joml:1.10.8") // Lombok <3 annotationProcessor("org.projectlombok:lombok:1.18.36") From 0bda261d1c4a44ae7eb708787f96d5d32ee843c6 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:11:23 -0600 Subject: [PATCH 09/28] chore: update eco to 6.74.5 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 83b36c8..1a113b5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -89,7 +89,7 @@ allprojects { compileOnly("io.lumine:Mythic-Dist:5.2.1") compileOnly("com.github.LeonMangler:SuperVanish:6.2.17") compileOnly("net.Indyuce:MMOItems-API:6.9.4-SNAPSHOT") - compileOnly("com.willfp:eco:6.67.2") + compileOnly("com.willfp:eco:6.74.5") compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("LibsDisguises:LibsDisguises:10.0.44") { exclude("org.spigotmc", "spigot") From b91b81f0bd99ef4646112b352103ae17fdaf9a79 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:11:57 -0600 Subject: [PATCH 10/28] chore: update fastutils to 8.5.15 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1a113b5..2eef135 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -84,7 +84,7 @@ allprojects { compileOnly("com.nexomc:nexo:0.8.0-dev.8") compileOnly("com.github.LoneDev6:API-ItemsAdder:3.6.3-beta-14") compileOnly("com.mineinabyss:geary-papermc:0.31.0-dev.4") - compileOnly("it.unimi.dsi:fastutil:8.5.13") + compileOnly("it.unimi.dsi:fastutil:8.5.15") compileOnly("com.denizenscript:denizen:1.2.7-SNAPSHOT") compileOnly("io.lumine:Mythic-Dist:5.2.1") compileOnly("com.github.LeonMangler:SuperVanish:6.2.17") From b3b10df0b37acd6c5a759cf9f70b8f4ca9f53b44 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:15:46 -0600 Subject: [PATCH 11/28] chore: update authlib to 3.13.56 --- build.gradle.kts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2eef135..caa6c73 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -76,7 +76,7 @@ allprojects { compileOnly(fileTree("${project.rootDir}/lib") { include("*.jar") }) // Included externally - compileOnly("com.mojang:authlib:1.5.25") + compileOnly("com.mojang:authlib:3.13.56") //compileOnly("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:26.0.1") @@ -131,7 +131,6 @@ dependencies { tasks { compileJava { options.encoding = Charsets.UTF_8.name() - //options.release.set(17) } runServer { From e53d4c327a8dcfa75b0e23e56d66c4ba44dac3cd Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 10 Jan 2025 13:17:44 -0600 Subject: [PATCH 12/28] chore: update bstats to 3.1.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index caa6c73..a9a5376 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -113,7 +113,7 @@ allprojects { // Shaded Dependencies implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") - implementation("org.bstats:bstats-bukkit:3.0.2") + implementation("org.bstats:bstats-bukkit:3.1.0") implementation("com.jeff_media:SpigotUpdateChecker:3.0.0") implementation("com.github.BG-Software-LLC:CommentedConfiguration:bed3c46369") } From 9a5ce14bfe06a9f5b2c6b4ed577719da68acf7da Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Mon, 13 Jan 2025 23:56:48 -0600 Subject: [PATCH 13/28] fix: check if hook is detected in getItem. --- .../src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index 59673e5..a6988e8 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -127,7 +127,7 @@ public class Hooks { if (!isItemHook(split[0])) return null; Hook hook = getHook(split[0]); if (!hook.hasEnabledItemHook()) return null; - if (!hook.isActive()) return null; + if (!hook.isDetected() || !hook.isActive()) return null; return hook.getItem(split[1]); } From ac75a010d938e7b65460a9ce8244201d89c5e882 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Tue, 14 Jan 2025 12:17:11 -0600 Subject: [PATCH 14/28] chore: update error message to say to update HibiscusCommons --- .../main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java index 29acaed..30cf84d 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java @@ -51,7 +51,7 @@ public class NMSHandlers { HibiscusCommonsPlugin.getInstance().getLogger().severe(" - " + supportedVersion); } HibiscusCommonsPlugin.getInstance().getLogger().severe(" "); - HibiscusCommonsPlugin.getInstance().getLogger().severe("Please report this issue to the developer."); + HibiscusCommonsPlugin.getInstance().getLogger().severe("Please update HibiscusCommons that supports this version."); throw new RuntimeException("Failed to detect the server version."); } From 8d24cf37274984c39244beed311667de8301cc85 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Tue, 14 Jan 2025 12:21:51 -0600 Subject: [PATCH 15/28] fix: check if all color nodes are there when applying color --- .../hibiscuscommons/config/serializer/ItemSerializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java b/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java index b26adef..d408fcf 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java @@ -171,7 +171,7 @@ public class ItemSerializer implements TypeSerializer { if (!colorNode.virtual()) { if (ColorBuilder.canBeColored(item.getType())) { - if (!redNode.virtual()) { + if (!redNode.virtual() && !greenNode.virtual() && !blueNode.virtual()) { itemMeta = ColorBuilder.color(itemMeta, Color.fromRGB(redNode.getInt(0), greenNode.getInt(0), blueNode.getInt(0))); } else { itemMeta = ColorBuilder.color(itemMeta, ServerUtils.hex2Rgb(colorNode.getString("#FFFFFF"))); From e4eca0c1c9dfc1027c544e707b9e78f7cb34e6c8 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 16 Jan 2025 13:48:13 -0600 Subject: [PATCH 16/28] feat: add getViewers in ServerUtils that uses new canSee method --- .../hibiscuscommons/util/ServerUtils.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java index e82436a..014e9bc 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java @@ -4,10 +4,14 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedSignedProperty; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import org.bukkit.Color; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class ServerUtils { @@ -92,6 +96,21 @@ public class ServerUtils { return nextYaw; } + /** + * Get the viewers of an entity (Players only) that can see the entity in the world. + * This ignores config view distances and checks directly with the server. + * @param entity + * @return + */ + @NotNull + public static List getViewers(@NotNull Entity entity) { + ArrayList viewers = new ArrayList<>(); + for (Player player : entity.getLocation().getWorld().getPlayers()) { + if (player.canSee(entity)) viewers.add(player); + } + return viewers; + } + public static boolean hasClass(String className) { try { Class.forName(className); From 85d65299022d5a5cbd7fc70a693838a12b82b05f Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 16 Jan 2025 19:50:18 -0600 Subject: [PATCH 17/28] feat: add hook ability to check invisibility --- .../me/lojosho/hibiscuscommons/hooks/Hook.java | 10 ++++++++++ .../me/lojosho/hibiscuscommons/hooks/Hooks.java | 11 +++++++++++ .../hibiscuscommons/hooks/misc/HookCMI.java | 11 +++++++++++ .../hooks/misc/HookLibsDisguises.java | 10 ++++++++++ .../hooks/misc/HookPremiumVanish.java | 16 ++++++++++++++++ .../hooks/misc/HookSuperVanish.java | 17 +++++++++++++++++ 6 files changed, 75 insertions(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java index e784d67..bade716 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hook.java @@ -6,6 +6,8 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.UUID; + /** * Represents a hook into other minecraft plugins */ @@ -150,4 +152,12 @@ public abstract class Hook implements Listener { public String getEntityString(@NotNull Entity entity) { return null; } + + /** + * Whether the entity is invisible (as defined by the hook) + * @return true if the entity is invisible, false otherwise (or if the hook does not support entity invisibility) + */ + public boolean isInvisible(UUID uuid) { + return false; + } } \ No newline at end of file diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index a6988e8..8483125 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; public class Hooks { @@ -158,4 +159,14 @@ public class Hooks { if (hook == null) return false; return hook.isActive(); } + + public static boolean isInvisible(UUID uuid) { + boolean invisible = false; + for (Hook hook : HOOK_POOL.values()) { + if (hook.isActive()) { + if (hook.isInvisible(uuid)) invisible = true; + } + } + return invisible; + } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java index 158e8ae..a50a3a9 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookCMI.java @@ -1,15 +1,19 @@ package me.lojosho.hibiscuscommons.hooks.misc; +import com.Zrips.CMI.CMI; import com.Zrips.CMI.events.CMIPlayerUnVanishEvent; import com.Zrips.CMI.events.CMIPlayerVanishEvent; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerUnVanishEvent; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerVanishEvent; import me.lojosho.hibiscuscommons.hooks.Hook; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + /** * A hook that integrates the plugin {@link com.Zrips.CMI.CMI CMI} */ @@ -30,4 +34,11 @@ public class HookCMI extends Hook { HibiscusPlayerUnVanishEvent newEvent = new HibiscusPlayerUnVanishEvent(this, event.getPlayer()); Bukkit.getPluginManager().callEvent(newEvent); } + + @Override + public boolean isInvisible(UUID uuid) { + Player onlinePlayer = Bukkit.getPlayer(uuid); + if (onlinePlayer == null) return false; + return CMI.getInstance().getVanishManager().getAllVanished().contains(uuid); + } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java index 3886ac8..add4c87 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookLibsDisguises.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.hooks.misc; +import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerUnVanishEvent; @@ -11,6 +12,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + public class HookLibsDisguises extends Hook { public HookLibsDisguises() { super("LibsDisguises"); @@ -30,4 +33,11 @@ public class HookLibsDisguises extends Hook { HibiscusPlayerUnVanishEvent newEvent = new HibiscusPlayerUnVanishEvent(this, player); Bukkit.getPluginManager().callEvent(newEvent); } + + @Override + public boolean isInvisible(UUID uuid) { + Player onlinePlayer = Bukkit.getPlayer(uuid); + if (onlinePlayer == null) return false; + return DisguiseAPI.isDisguised(onlinePlayer); + } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java index 982c68e..1f401c4 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookPremiumVanish.java @@ -2,14 +2,19 @@ package me.lojosho.hibiscuscommons.hooks.misc; import de.myzelyam.api.vanish.PlayerHideEvent; import de.myzelyam.api.vanish.PlayerShowEvent; +import de.myzelyam.api.vanish.VanishAPI; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerUnVanishEvent; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerVanishEvent; import me.lojosho.hibiscuscommons.hooks.Hook; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + /** * A hook that integrates the plugin {@link de.myzelyam.api.vanish.VanishAPI Supervanish} * @@ -32,4 +37,15 @@ public class HookPremiumVanish extends Hook { HibiscusPlayerUnVanishEvent newEvent = new HibiscusPlayerUnVanishEvent(this, event.getPlayer()); Bukkit.getPluginManager().callEvent(newEvent); } + + @Override + public boolean isInvisible(UUID uuid) { + OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); + if (!player.isOnline()) { + return VanishAPI.isInvisibleOffline(uuid); + } + Player onlinePlayer = player.getPlayer(); + if (onlinePlayer == null) return false; + return VanishAPI.isInvisible(onlinePlayer); + } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java index 3b1dcaf..3610d78 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/misc/HookSuperVanish.java @@ -2,14 +2,20 @@ package me.lojosho.hibiscuscommons.hooks.misc; import de.myzelyam.api.vanish.PlayerHideEvent; import de.myzelyam.api.vanish.PlayerShowEvent; +import de.myzelyam.api.vanish.VanishAPI; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerUnVanishEvent; import me.lojosho.hibiscuscommons.api.events.HibiscusPlayerVanishEvent; import me.lojosho.hibiscuscommons.hooks.Hook; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerJoinEvent; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + /** * A hook that integrates the plugin {@link de.myzelyam.api.vanish.VanishAPI Supervanish} * @@ -32,4 +38,15 @@ public class HookSuperVanish extends Hook { HibiscusPlayerUnVanishEvent newEvent = new HibiscusPlayerUnVanishEvent(this, event.getPlayer()); Bukkit.getPluginManager().callEvent(newEvent); } + + @Override + public boolean isInvisible(UUID uuid) { + OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); + if (!player.isOnline()) { + return VanishAPI.isInvisibleOffline(uuid); + } + Player onlinePlayer = player.getPlayer(); + if (onlinePlayer == null) return false; + return VanishAPI.isInvisible(onlinePlayer); + } } From 471343a30914317de025f0a6e6e2f0f72b317fc6 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 16 Jan 2025 21:16:27 -0600 Subject: [PATCH 18/28] fix: use isDetected instead of inActive in isInvisible --- .../src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index 8483125..f5207fe 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -163,7 +163,7 @@ public class Hooks { public static boolean isInvisible(UUID uuid) { boolean invisible = false; for (Hook hook : HOOK_POOL.values()) { - if (hook.isActive()) { + if (hook.isDetected()) { if (hook.isInvisible(uuid)) invisible = true; } } From 10b32c81faaa345ed168bc76051331c137cb6a2a Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 16 Jan 2025 21:18:12 -0600 Subject: [PATCH 19/28] clean: clean code for isInvisible method --- .../main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index f5207fe..842f166 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -161,12 +161,11 @@ public class Hooks { } public static boolean isInvisible(UUID uuid) { - boolean invisible = false; for (Hook hook : HOOK_POOL.values()) { if (hook.isDetected()) { - if (hook.isInvisible(uuid)) invisible = true; + if (hook.isInvisible(uuid)) return true; } } - return invisible; + return false; } } From 0d4a5d826e99d276f7ea9d44af5feccd6392e150 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 17 Jan 2025 13:29:18 -0600 Subject: [PATCH 20/28] feat: If on paper, simply check for tracked entities rather than recalculating it --- .../main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java index 014e9bc..4d6ffaf 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java @@ -2,6 +2,7 @@ package me.lojosho.hibiscuscommons.util; import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedSignedProperty; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import org.bukkit.Color; import org.bukkit.entity.Entity; @@ -104,6 +105,7 @@ public class ServerUtils { */ @NotNull public static List getViewers(@NotNull Entity entity) { + if (HibiscusCommonsPlugin.isOnPaper()) return List.copyOf(entity.getTrackedBy()); ArrayList viewers = new ArrayList<>(); for (Player player : entity.getLocation().getWorld().getPlayers()) { if (player.canSee(entity)) viewers.add(player); From 67042106d535a59a66e990e3d9cf32752a9b8603 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 17 Jan 2025 13:30:57 -0600 Subject: [PATCH 21/28] feat: check for Paper before attempting to get NMS classes --- .../hibiscuscommons/HibiscusCommonsPlugin.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java index 22bcae2..cc15c94 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java @@ -20,13 +20,6 @@ public final class HibiscusCommonsPlugin extends HibiscusPlugin { public void onStart() { instance = this; - try { - NMSHandlers.setup(); - } catch (RuntimeException e) { - getServer().getPluginManager().disablePlugin(this); - return; - } - // Detects if a user is running a paper server if (ServerUtils.hasClass("com.destroystokyo.paper.PaperConfig") || ServerUtils.hasClass("io.papermc.paper.configuration.Configuration")) { onPaper = true; @@ -38,6 +31,13 @@ public final class HibiscusCommonsPlugin extends HibiscusPlugin { getLogger().warning("Download Paper at: https://papermc.io/"); } + try { + NMSHandlers.setup(); + } catch (RuntimeException e) { + getServer().getPluginManager().disablePlugin(this); + return; + } + // Plugin startup logic Hooks.setup(); From 80a0ca2b1561ad11c362bed8d81a171e6662ab8e Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 17 Jan 2025 13:36:04 -0600 Subject: [PATCH 22/28] clean: resource update checker create version variable --- .../main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java index 6992540..f56c3cc 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java @@ -63,12 +63,13 @@ public abstract class HibiscusPlugin extends JavaPlugin { .onSuccess((commandSenders, latestVersion) -> { this.latestVersion = (String) latestVersion; String pluginName = getDescription().getName(); + String version = getDescription().getVersion(); - if (!this.latestVersion.equalsIgnoreCase(getDescription().getVersion())) { + if (!this.latestVersion.equalsIgnoreCase(version)) { getLogger().info("+++++++++++++++++++++++++++++++++++"); getLogger().info("There is a new update for " + pluginName + "!"); getLogger().info("Please download it as soon as possible for possible fixes and new features."); - getLogger().info("Current Version " + getDescription().getVersion() + " | Latest Version " + latestVersion); + getLogger().info("Current Version " + version + " | Latest Version " + latestVersion); //getLogger().info("Spigot: https://www.spigotmc.org/resources/100107/"); getLogger().info("Polymart: https://polymart.org/resource/" + resourceID); getLogger().info("+++++++++++++++++++++++++++++++++++"); From 4210ae2eddb75a3ed7e905cf88e9b5301c68c5fa Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 17 Jan 2025 13:57:27 -0600 Subject: [PATCH 23/28] clean: clean up ItemSerializer a bit --- .../config/serializer/ItemSerializer.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java b/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java index d408fcf..e35f41d 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/config/serializer/ItemSerializer.java @@ -81,11 +81,8 @@ public class ItemSerializer implements TypeSerializer { if (itemMeta == null) return item; if (!nameNode.virtual()) { - if (HibiscusCommonsPlugin.isOnPaper()) { - itemMeta.displayName(AdventureUtils.MINI_MESSAGE.deserialize(nameNode.getString(""))); - } else { - itemMeta.setDisplayName(StringUtils.parseStringToString(nameNode.getString(""))); - } + if (HibiscusCommonsPlugin.isOnPaper()) itemMeta.displayName(AdventureUtils.MINI_MESSAGE.deserialize(nameNode.getString(""))); + else itemMeta.setDisplayName(StringUtils.parseStringToString(nameNode.getString(""))); } if (!unbreakableNode.virtual()) itemMeta.setUnbreakable(unbreakableNode.getBoolean()); if (!glowingNode.virtual()) { @@ -93,13 +90,12 @@ public class ItemSerializer implements TypeSerializer { itemMeta.addEnchant(Enchantment.LUCK, 1, true); } if (!loreNode.virtual()) { - if (HibiscusCommonsPlugin.isOnPaper()) { + if (HibiscusCommonsPlugin.isOnPaper()) itemMeta.lore(loreNode.getList(String.class, new ArrayList<>()). stream().map(AdventureUtils.MINI_MESSAGE::deserialize).collect(Collectors.toList())); - } else { - itemMeta.setLore(loreNode.getList(String.class, new ArrayList<>()). + else itemMeta.setLore(loreNode.getList(String.class, new ArrayList<>()). stream().map(StringUtils::parseStringToString).collect(Collectors.toList())); - } + } if (!modelDataNode.virtual()) itemMeta.setCustomModelData(modelDataNode.getInt()); @@ -113,13 +109,13 @@ public class ItemSerializer implements TypeSerializer { for (ConfigurationNode enchantNode : enchantsNode.childrenMap().values()) { String enchantName = enchantNode.key().toString().toLowerCase(); NamespacedKey key = NamespacedKey.minecraft(enchantName); - Enchantment enchant = Enchantment.getByKey(key); + Enchantment enchant = Registry.ENCHANTMENT.get(key); if (enchant == null) continue; itemMeta.addEnchant(enchant, enchantNode.getInt(1), true); } } - try { + if (!itemFlagsNode.virtual()) { for (String itemFlag : itemFlagsNode.getList(String.class)) { if (!EnumUtils.isValidEnum(ItemFlag.class, itemFlag)) continue; @@ -127,9 +123,6 @@ public class ItemSerializer implements TypeSerializer { itemMeta.addItemFlags(ItemFlag.valueOf(itemFlag)); } } - } catch (Exception e) { - e.printStackTrace(); - } if (item.getType() == Material.PLAYER_HEAD) { SkullMeta skullMeta = (SkullMeta) itemMeta; @@ -150,7 +143,7 @@ public class ItemSerializer implements TypeSerializer { skullMeta.getPersistentDataContainer().set(InventoryUtils.getSkullTexture(), PersistentDataType.STRING, textureString); } // Decodes the texture string and sets the texture url to the skull - PlayerProfile profile = Bukkit.createPlayerProfile(UUID.randomUUID()); + PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID()); PlayerTextures textures = profile.getTextures(); String decoded = new String(Base64.getDecoder().decode(textureString)); @@ -166,7 +159,6 @@ public class ItemSerializer implements TypeSerializer { skullMeta.setOwnerProfile(profile); } } - itemMeta = skullMeta; } if (!colorNode.virtual()) { @@ -186,6 +178,5 @@ public class ItemSerializer implements TypeSerializer { public void serialize(final Type type, @Nullable final ItemStack obj, final ConfigurationNode node) throws SerializationException { } - } From d2398071ddd42d5ae7457e4643398bf5afcc7008 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Fri, 17 Jan 2025 14:01:48 -0600 Subject: [PATCH 24/28] chore: update paperweight to 2.0.0-beta.14 --- build.gradle.kts | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a9a5376..eba19f1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "me.lojosho" -version = "0.6.0${getGitCommitHash()}" +version = "0.6.1${getGitCommitHash()}" allprojects { apply(plugin = "java") diff --git a/gradle.properties b/gradle.properties index d36e203..14a7ad3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -userdevVersion=2.0.0-beta.11 \ No newline at end of file +userdevVersion=2.0.0-beta.14 \ No newline at end of file From 3a7a552abd6ac32f20b6d999d1bf7dd31696f427 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Sun, 19 Jan 2025 16:02:13 -0600 Subject: [PATCH 25/28] fix: getStringItem and getStringEntity not checking for hook detection --- .../src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index 842f166..de29e67 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -134,7 +134,7 @@ public class Hooks { public static String getStringItem(ItemStack itemStack) { for (Hook hook : HOOK_POOL.values()) { - if (hook.isActive() && hook.hasEnabledItemHook()) { + if (hook.isDetected() && hook.hasEnabledItemHook()) { String stringyItem = hook.getItemString(itemStack); if (stringyItem == null) continue; return hook.getId() + ":" + stringyItem; @@ -145,7 +145,7 @@ public class Hooks { public static String getStringEntity(Entity entity) { for (Hook hook : HOOK_POOL.values()) { - if (hook.isActive() && hook.hasEnabledEntityHook()) { + if (hook.isDetected() && hook.hasEnabledEntityHook()) { String stringyEntity = hook.getEntityString(entity); if (stringyEntity != null) return hook.getId() + ":" + stringyEntity; } From c65fac2482eff4f92a401e5fa9bf1a6f2982c50d Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Mon, 20 Jan 2025 15:43:15 -0600 Subject: [PATCH 26/28] fix: isActiveHook not taking into account detection --- common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java index de29e67..b8a986c 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/hooks/Hooks.java @@ -157,6 +157,7 @@ public class Hooks { public static boolean isActiveHook(String id) { Hook hook = getHook(id); if (hook == null) return false; + if (!hook.isDetected()) return false; return hook.isActive(); } From d90aee52009b77a0204ebeaf45801e9e55469527 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Mon, 27 Jan 2025 15:25:32 -0600 Subject: [PATCH 27/28] chore: update test server to 1.21.4 --- build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index eba19f1..f1e5a7c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -108,6 +108,7 @@ allprojects { // Spigot Auto Loader Libraries compileOnly("net.kyori:adventure-api:4.18.0") compileOnly("net.kyori:adventure-text-minimessage:4.18.0") + compileOnly("net.kyori:adventure-text-serializer-gson:4.18.0") compileOnly("net.kyori:adventure-platform-bukkit:4.3.4") compileOnly("org.apache.commons:commons-lang3:3.17.0") @@ -136,7 +137,7 @@ tasks { runServer { dependsOn(shadowJar) dependsOn(jar) - minecraftVersion("1.21.1") + minecraftVersion("1.21.4") downloadPlugins { hangar("PlaceholderAPI", "2.11.6") @@ -216,6 +217,7 @@ bukkit { libraries = listOf( "net.kyori:adventure-api:4.18.0", "net.kyori:adventure-text-minimessage:4.18.0", + "net.kyori:adventure-text-serializer-gson:4.18.0", "net.kyori:adventure-platform-bukkit:4.3.4", "org.apache.commons:commons-lang3:3.17.0" //"org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT" // Readd when 4.2.0 releases From 15b9dbdf998c4a784fb176bad065f71daf784031 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Mon, 27 Jan 2025 15:32:32 -0600 Subject: [PATCH 28/28] feat: add sendToastPacket --- .../hibiscuscommons/nms/NMSPackets.java | 3 + .../nms/v1_20_R3/NMSPackets.java | 16 ++++ .../nms/v1_20_R4/NMSPackets.java | 79 +++++++++++++++++++ .../nms/v1_21_R1/NMSPackets.java | 79 +++++++++++++++++++ .../nms/v1_21_R2/NMSPackets.java | 79 +++++++++++++++++++ .../nms/v1_21_R3/NMSPackets.java | 79 +++++++++++++++++++ 6 files changed, 335 insertions(+) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java index 088009c..06b7e47 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -1,6 +1,7 @@ package me.lojosho.hibiscuscommons.nms; import it.unimi.dsi.fastutil.ints.IntList; +import net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; @@ -74,4 +75,6 @@ public interface NMSPackets { int blockLight, int skyLight, float viewRange, float width, float height, ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, List sendTo); + + void sendToastPacket(Player player, ItemStack icon, Component title, Component description); } diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index b153ced..d3501df 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -1,13 +1,23 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R3; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -26,6 +36,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -295,4 +306,9 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); for (Player p : sendTo) sendPacket(p, packet); } + + @Override + public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { + throw new UnsupportedOperationException("Not implemented in this version."); + } } diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index ffa83ca..afe43fb 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -1,13 +1,22 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R4; +import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -26,6 +35,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -293,4 +303,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); for (Player p : sendTo) sendPacket(p, packet); } + + @Override + public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { + final var key = new ResourceLocation("hibiscuscommons", UUID.randomUUID().toString()); + + JsonObject json = new JsonObject(); + + // Creating the "criteria" object + JsonObject impossibleCriteria = new JsonObject(); + JsonObject impossible = new JsonObject(); + impossible.addProperty("trigger", "minecraft:impossible"); + impossibleCriteria.add("impossible", impossible); + json.add("criteria", impossibleCriteria); + + // Creating the "display" object + JsonObject display = new JsonObject(); + JsonObject iconObj = new JsonObject(); + iconObj.addProperty("id", icon.getType().getKey().toString()); + + if (icon.hasItemMeta()) { + ItemMeta meta = icon.getItemMeta(); + JsonObject components = new JsonObject(); + + if (!meta.getEnchants().isEmpty()) { + components.addProperty("minecraft:enchantment_glint_override", true); + } + + if (meta.hasCustomModelData()) { + components.addProperty("minecraft:custom_model_data", meta.getCustomModelData()); + } + + iconObj.add("components", components); + } + + display.add("icon", iconObj); + display.add("title", GsonComponentSerializer.gson().serializeToTree(title)); + display.add("description", GsonComponentSerializer.gson().serializeToTree(description)); + display.addProperty("description", "Toast Description"); + display.addProperty("frame", "task"); + display.addProperty("announce_to_chat", false); + display.addProperty("show_toast", true); + display.addProperty("hidden", true); + + json.add("display", display); + + final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json); + final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow()); + + final var nmsPlayer = ((CraftPlayer) player).getHandle(); + final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder); + MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder)); + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria)); + + Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> { + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria)); + MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key)); + + // Remove the advancement from the player's client to prevent it from being displayed again + // Was not working without this? + ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket( + false, + Collections.emptyList(), + Set.of(key), + Map.of() + ); + + sendPacket(player, removePacket); + }, 2L); + } } diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index ac711e2..0433390 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -1,14 +1,23 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R1; +import com.google.gson.JsonObject; import com.mojang.datafixers.kinds.Const; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -27,6 +36,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -302,4 +312,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); for (Player p : sendTo) sendPacket(p, packet); } + + @Override + public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { + final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString()); + + JsonObject json = new JsonObject(); + + // Creating the "criteria" object + JsonObject impossibleCriteria = new JsonObject(); + JsonObject impossible = new JsonObject(); + impossible.addProperty("trigger", "minecraft:impossible"); + impossibleCriteria.add("impossible", impossible); + json.add("criteria", impossibleCriteria); + + // Creating the "display" object + JsonObject display = new JsonObject(); + JsonObject iconObj = new JsonObject(); + iconObj.addProperty("id", icon.getType().getKey().toString()); + + if (icon.hasItemMeta()) { + ItemMeta meta = icon.getItemMeta(); + JsonObject components = new JsonObject(); + + if (!meta.getEnchants().isEmpty()) { + components.addProperty("minecraft:enchantment_glint_override", true); + } + + if (meta.hasCustomModelData()) { + components.addProperty("minecraft:custom_model_data", meta.getCustomModelData()); + } + + iconObj.add("components", components); + } + + display.add("icon", iconObj); + display.add("title", GsonComponentSerializer.gson().serializeToTree(title)); + display.add("description", GsonComponentSerializer.gson().serializeToTree(description)); + display.addProperty("description", "Toast Description"); + display.addProperty("frame", "task"); + display.addProperty("announce_to_chat", false); + display.addProperty("show_toast", true); + display.addProperty("hidden", true); + + json.add("display", display); + + final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json); + final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow()); + + final var nmsPlayer = ((CraftPlayer) player).getHandle(); + final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder); + MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder)); + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria)); + + Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> { + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria)); + MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key)); + + // Remove the advancement from the player's client to prevent it from being displayed again + // Was not working without this? + ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket( + false, + Collections.emptyList(), + Set.of(key), + Map.of() + ); + + sendPacket(player, removePacket); + }, 2L); + } } diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index 80093b0..6170489 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -1,13 +1,22 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R2; +import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; @@ -29,6 +38,7 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -281,4 +291,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); for (Player p : sendTo) sendPacket(p, packet); } + + @Override + public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { + final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString()); + + JsonObject json = new JsonObject(); + + // Creating the "criteria" object + JsonObject impossibleCriteria = new JsonObject(); + JsonObject impossible = new JsonObject(); + impossible.addProperty("trigger", "minecraft:impossible"); + impossibleCriteria.add("impossible", impossible); + json.add("criteria", impossibleCriteria); + + // Creating the "display" object + JsonObject display = new JsonObject(); + JsonObject iconObj = new JsonObject(); + iconObj.addProperty("id", icon.getType().getKey().toString()); + + if (icon.hasItemMeta()) { + ItemMeta meta = icon.getItemMeta(); + JsonObject components = new JsonObject(); + + if (!meta.getEnchants().isEmpty()) { + components.addProperty("minecraft:enchantment_glint_override", true); + } + + if (meta.hasCustomModelData()) { + components.addProperty("minecraft:custom_model_data", meta.getCustomModelData()); + } + + iconObj.add("components", components); + } + + display.add("icon", iconObj); + display.add("title", GsonComponentSerializer.gson().serializeToTree(title)); + display.add("description", GsonComponentSerializer.gson().serializeToTree(description)); + display.addProperty("description", "Toast Description"); + display.addProperty("frame", "task"); + display.addProperty("announce_to_chat", false); + display.addProperty("show_toast", true); + display.addProperty("hidden", true); + + json.add("display", display); + + final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json); + final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow()); + + final var nmsPlayer = ((CraftPlayer) player).getHandle(); + final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder); + MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder)); + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria)); + + Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> { + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria)); + MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key)); + + // Remove the advancement from the player's client to prevent it from being displayed again + // Was not working without this? + ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket( + false, + Collections.emptyList(), + Set.of(key), + Map.of() + ); + + sendPacket(player, removePacket); + }, 2L); + } } diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 861c811..72f1426 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -1,13 +1,22 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R3; +import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; +import net.minecraft.advancements.*; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; @@ -29,6 +38,7 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -42,6 +52,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor linkConstructor; static Constructor cameraConstructor; static Constructor lookAtConstructor; + static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -281,4 +292,72 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); for (Player p : sendTo) sendPacket(p, packet); } + + public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { + final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString()); + + JsonObject json = new JsonObject(); + + // Creating the "criteria" object + JsonObject impossibleCriteria = new JsonObject(); + JsonObject impossible = new JsonObject(); + impossible.addProperty("trigger", "minecraft:impossible"); + impossibleCriteria.add("impossible", impossible); + json.add("criteria", impossibleCriteria); + + // Creating the "display" object + JsonObject display = new JsonObject(); + JsonObject iconObj = new JsonObject(); + iconObj.addProperty("id", icon.getType().getKey().toString()); + + if (icon.hasItemMeta()) { + ItemMeta meta = icon.getItemMeta(); + JsonObject components = new JsonObject(); + + if (!meta.getEnchants().isEmpty()) { + components.addProperty("minecraft:enchantment_glint_override", true); + } + + if (meta.hasCustomModelData()) { + components.addProperty("minecraft:custom_model_data", meta.getCustomModelData()); + } + + iconObj.add("components", components); + } + + display.add("icon", iconObj); + display.add("title", GsonComponentSerializer.gson().serializeToTree(title)); + display.add("description", GsonComponentSerializer.gson().serializeToTree(description)); + display.addProperty("description", "Toast Description"); + display.addProperty("frame", "task"); + display.addProperty("announce_to_chat", false); + display.addProperty("show_toast", true); + display.addProperty("hidden", true); + + json.add("display", display); + + final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json); + final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow()); + + final var nmsPlayer = ((CraftPlayer) player).getHandle(); + final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder); + MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder)); + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria)); + + Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> { + progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria)); + MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key)); + + // Remove the advancement from the player's client to prevent it from being displayed again + // Was not working without this? + ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket( + false, + Collections.emptyList(), + Set.of(key), + Map.of() + ); + + sendPacket(player, removePacket); + }, 2L); + } }