diff --git a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java index 77e2b9c90..67f83b409 100644 --- a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java @@ -2,22 +2,28 @@ package com.volmit.iris.core.link; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.data.IrisBlockData; import lombok.Getter; +import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.MissingResourceException; +@Getter @RequiredArgsConstructor public abstract class ExternalDataProvider { - @Getter + @NonNull private final String pluginId; + @Nullable public Plugin getPlugin() { return Bukkit.getPluginManager().getPlugin(pluginId); } @@ -28,23 +34,60 @@ public abstract class ExternalDataProvider { public abstract void init(); - public BlockData getBlockData(Identifier blockId) throws MissingResourceException { + /** + * @see ExternalDataProvider#getBlockData(Identifier, KMap) + */ + @NotNull + public BlockData getBlockData(@NotNull Identifier blockId) throws MissingResourceException { return getBlockData(blockId, new KMap<>()); } - public abstract BlockData getBlockData(Identifier blockId, KMap state) throws MissingResourceException; + /** + * This method returns a {@link BlockData} corresponding to the blockID + * it is used in any place Iris accepts {@link BlockData} + * + * @param blockId The id of the block to get + * @param state The state of the block to get + * @return Corresponding {@link BlockData} to the blockId + * may return {@link IrisBlockData} for blocks that need a world for placement + * @throws MissingResourceException when the blockId is invalid + */ + @NotNull + public abstract BlockData getBlockData(@NotNull Identifier blockId, @NotNull KMap state) throws MissingResourceException; - public ItemStack getItemStack(Identifier itemId) throws MissingResourceException { + /** + * @see ExternalDataProvider#getItemStack(Identifier) + */ + @NotNull + public ItemStack getItemStack(@NotNull Identifier itemId) throws MissingResourceException { return getItemStack(itemId, new KMap<>()); } - public abstract ItemStack getItemStack(Identifier itemId, KMap customNbt) throws MissingResourceException; + /** + * This method returns a {@link ItemStack} corresponding to the itemID + * it is used in loot tables + * + * @param itemId The id of the item to get + * @param customNbt Custom nbt to apply to the item + * @return Corresponding {@link ItemStack} to the itemId + * @throws MissingResourceException when the itemId is invalid + */ + @NotNull + public abstract ItemStack getItemStack(@NotNull Identifier itemId, @NotNull KMap customNbt) throws MissingResourceException; - public void processUpdate(Engine engine, Block block, Identifier blockId) {} + /** + * This method is used for placing blocks that need to use the plugins api + * it will only be called when the {@link ExternalDataProvider#getBlockData(Identifier, KMap)} returned a {@link IrisBlockData} + * + * @param engine The engine of the world the block is being placed in + * @param block The block where the block should be placed + * @param blockId The blockId to place + */ + public void processUpdate(@NotNull Engine engine, @NotNull Block block, @NotNull Identifier blockId) {} - public abstract Identifier[] getBlockTypes(); + public abstract @NotNull Identifier @NotNull [] getBlockTypes(); - public abstract Identifier[] getItemTypes(); + public abstract @NotNull Identifier @NotNull [] getItemTypes(); - public abstract boolean isValidProvider(Identifier id, boolean isItem); + public abstract boolean isValidProvider(@NotNull Identifier id, boolean isItem); } diff --git a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java index 983996eae..c71224a99 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java @@ -26,6 +26,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.plugin.IrisService; import lombok.Data; +import lombok.NonNull; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -99,6 +100,18 @@ public class ExternalDataSVC implements IrisService { } } + public void registerProvider(@NonNull ExternalDataProvider provider) { + String plugin = provider.getPluginId(); + if (providers.stream().map(ExternalDataProvider::getPluginId).anyMatch(plugin::equals)) + throw new IllegalArgumentException("A provider with the same plugin id already exists."); + + providers.add(provider); + if (provider.isReady()) { + activeProviders.add(provider); + provider.init(); + } + } + public Optional getBlockData(final Identifier key) { var pair = parseState(key); Identifier mod = pair.getA();