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.