From 9f0dc68220b72a0f6dfd9625474d27e2f0f57524 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 20 Jun 2026 16:26:14 -0700 Subject: [PATCH] fix: retry Vault hook after addons enable BentoBox hooks Vault during early hooks, before addons are enabled. An addon may register a Vault economy provider in its own onEnable (e.g. InvSwitcher, which provides per-world balances), after that early attempt already failed for lack of any economy. A failed hook is discarded by HooksManager, so getVault() stayed empty even though an economy now exists - leaving economy-dependent addons (e.g. Bank) unable to start. Re-attempt the Vault hook once after enableAddons() so an economy provided by an addon is picked up. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../java/world/bentobox/bentobox/BentoBox.java | 5 +++++ .../bentobox/hooks/BentoBoxHookRegistrar.java | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/BentoBox.java b/src/main/java/world/bentobox/bentobox/BentoBox.java index 5ade339ba..b66a5614e 100644 --- a/src/main/java/world/bentobox/bentobox/BentoBox.java +++ b/src/main/java/world/bentobox/bentobox/BentoBox.java @@ -206,6 +206,11 @@ private void completeSetup(long loadTime) { // Enable addons addonsManager.enableAddons(); + // Addons may register a Vault economy provider during their onEnable (e.g. InvSwitcher), + // after the early Vault hook already failed for lack of any economy. Retry now so getVault() + // reflects an economy an addon has since provided. + hookRegistrar.registerVaultHookIfNeeded(); + // Register default gamemode placeholders addonsManager.getGameModeAddons().forEach(placeholdersManager::registerDefaultPlaceholders); diff --git a/src/main/java/world/bentobox/bentobox/hooks/BentoBoxHookRegistrar.java b/src/main/java/world/bentobox/bentobox/hooks/BentoBoxHookRegistrar.java index dfd30ee64..985dcb572 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/BentoBoxHookRegistrar.java +++ b/src/main/java/world/bentobox/bentobox/hooks/BentoBoxHookRegistrar.java @@ -36,6 +36,22 @@ public void registerEarlyHooks() { hooksManager.registerHook(new PlaceholderAPIHook()); } + /** + * Re-attempts the Vault economy hook after addons have been enabled. + *

+ * BentoBox hooks Vault during {@link #registerEarlyHooks()}, before addons are enabled. An addon + * may register a Vault economy provider in its own {@code onEnable()} (e.g. InvSwitcher, which + * provides per-world balances), after that early attempt already failed for lack of any economy. + * A failed hook is discarded by {@link HooksManager}, so {@link BentoBox#getVault()} would stay + * empty even though an economy now exists. This gives the now-present economy a chance to be + * picked up. No-op if Vault is already hooked. + */ + public void registerVaultHookIfNeeded() { + if (plugin.getVault().isEmpty()) { + hooksManager.registerHook(new VaultHook()); + } + } + /** * Registers world-manager hooks (Multiverse variants) that load after BentoBox worlds. * Must be called after {@code islandWorldManager.registerWorldsToMultiverse()} is ready.