diff --git a/API/src/main/java/com/bgsoftware/superiorskyblock/api/hooks/PricesProvider.java b/API/src/main/java/com/bgsoftware/superiorskyblock/api/hooks/PricesProvider.java index de5bc5c49..83a77fb14 100644 --- a/API/src/main/java/com/bgsoftware/superiorskyblock/api/hooks/PricesProvider.java +++ b/API/src/main/java/com/bgsoftware/superiorskyblock/api/hooks/PricesProvider.java @@ -4,6 +4,7 @@ import javax.annotation.Nullable; import java.math.BigDecimal; +import java.util.concurrent.CompletableFuture; public interface PricesProvider { @@ -25,4 +26,11 @@ public interface PricesProvider { @Nullable Key getBlockKey(Key blockKey); + /** + * Get a CompletableFuture that is completed when all prices and data of this provider are ready. + */ + default CompletableFuture getWhenPricesAreReady() { + return CompletableFuture.completedFuture(null); + } + } diff --git a/Hook_ShopGUIPlus78/src/main/java/com/bgsoftware/superiorskyblock/external/prices/PricesProvider_ShopGUIPlus78.java b/Hook_ShopGUIPlus78/src/main/java/com/bgsoftware/superiorskyblock/external/prices/PricesProvider_ShopGUIPlus78.java index 7db52b207..ba1055281 100644 --- a/Hook_ShopGUIPlus78/src/main/java/com/bgsoftware/superiorskyblock/external/prices/PricesProvider_ShopGUIPlus78.java +++ b/Hook_ShopGUIPlus78/src/main/java/com/bgsoftware/superiorskyblock/external/prices/PricesProvider_ShopGUIPlus78.java @@ -6,21 +6,33 @@ import com.bgsoftware.superiorskyblock.api.key.KeyMap; import com.bgsoftware.superiorskyblock.core.logging.Log; import net.brcdev.shopgui.ShopGuiPlugin; +import net.brcdev.shopgui.event.ShopGUIPlusPostEnableEvent; import net.brcdev.shopgui.shop.Shop; import net.brcdev.shopgui.shop.item.ShopItem; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import java.math.BigDecimal; +import java.util.concurrent.CompletableFuture; public class PricesProvider_ShopGUIPlus78 implements PricesProvider { private final ShopGuiPlugin shopPlugin = ShopGuiPlugin.getInstance(); private final KeyMap cachedPrices = KeyMap.createConcurrentKeyMap(); + private final CompletableFuture readyFuture = new CompletableFuture<>(); private final SuperiorSkyblockPlugin plugin; public PricesProvider_ShopGUIPlus78(SuperiorSkyblockPlugin plugin) { this.plugin = plugin; Log.info("Using ShopGUIPlus as a prices provider."); + Bukkit.getPluginManager().registerEvents(new Listener() { + @EventHandler + public void onShopsLoaded(ShopGUIPlusPostEnableEvent event) { + readyFuture.complete(null); + } + }, plugin); } @Override @@ -62,4 +74,9 @@ public Key getBlockKey(Key blockKey) { return cachedPrices.getKey(blockKey, null); } + @Override + public CompletableFuture getWhenPricesAreReady() { + return this.readyFuture; + } + } diff --git a/src/main/java/com/bgsoftware/superiorskyblock/external/ProvidersManagerImpl.java b/src/main/java/com/bgsoftware/superiorskyblock/external/ProvidersManagerImpl.java index 2fef944b2..6f6f06f9d 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/external/ProvidersManagerImpl.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/external/ProvidersManagerImpl.java @@ -63,6 +63,7 @@ public class ProvidersManagerImpl extends Manager implements ProvidersManager { private static final BigDecimal MAX_DOUBLE = BigDecimal.valueOf(Double.MAX_VALUE); private final List AFKProvidersList = new LinkedList<>(); + private List pricesLoadCallbacks = new LinkedList<>(); private SpawnersProvider spawnersProvider = new SpawnersProvider_Default(); private StackedBlocksProvider stackedBlocksProvider = new StackedBlocksProvider_Default(); private EconomyProvider economyProvider = new EconomyProvider_Default(); @@ -209,6 +210,10 @@ public PricesProvider getPricesProvider() { @Override public void setPricesProvider(PricesProvider pricesProvider) { this.pricesProvider = pricesProvider; + this.pricesProvider.getWhenPricesAreReady().whenComplete((result, error) -> { + this.pricesLoadCallbacks.forEach(Runnable::run); + this.pricesLoadCallbacks = null; + }); } @Override @@ -246,6 +251,14 @@ public void unregisterStackedBlocksListener(IStackedBlocksListener stackedBlocks this.stackedBlocksListeners.remove(stackedBlocksListener); } + public void addPricesLoadCallback(Runnable callback) { + if (this.pricesLoadCallbacks == null) { + callback.run(); + } else { + this.pricesLoadCallbacks.add(callback); + } + } + public void notifyStackedBlocksListeners(OfflinePlayer offlinePlayer, Block block, IStackedBlocksListener.Action action) { this.stackedBlocksListeners.forEach(stackedBlocksListener -> diff --git a/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java b/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java index 5b345ac49..1b0c160d5 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/island/SIsland.java @@ -296,9 +296,8 @@ public SIsland(IslandBuilderImpl builder) { } }); if (!builder.blockCounts.isEmpty()) { - BukkitExecutor.sync(() -> builder.blockCounts.forEach((block, count) -> - handleBlockPlace(block, count, false, false) - ), 20L); + plugin.getProviders().addPricesLoadCallback(() -> builder.blockCounts.forEach((block, count) -> + handleBlockPlace(block, count, false, false))); } builder.warpCategories.forEach(warpCategoryRecord -> {