From 6d3dbf84ef18ed773359ea6d6e3f7946d9caf586 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 7 Mar 2024 17:24:09 +0100 Subject: [PATCH] add HMCLeaves compatibility --- .../iris/core/link/HMCLeavesDataProvider.java | 121 ++++++++++++++++++ .../iris/core/service/ExternalDataSVC.java | 4 + 2 files changed, 125 insertions(+) create mode 100644 core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java new file mode 100644 index 000000000..e060569f1 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -0,0 +1,121 @@ +package com.volmit.iris.core.link; + +import com.volmit.iris.Iris; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.reflect.WrappedField; +import com.volmit.iris.util.reflect.WrappedReturningMethod; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; +import java.util.MissingResourceException; +import java.util.function.Supplier; + +public class HMCLeavesDataProvider extends ExternalDataProvider { + private Object apiInstance; + private WrappedReturningMethod worldBlockType; + private WrappedReturningMethod setCustomBlock; + private Map blockDataMap = Map.of(); + private Map> itemDataField = Map.of(); + + public HMCLeavesDataProvider() { + super("HMCLeaves"); + } + + @Override + public String getPluginId() { + return "HMCLeaves"; + } + + @Override + public void init() { + try { + worldBlockType = new WrappedReturningMethod<>((Class) Class.forName("io.github.fisher2911.hmcleaves.data.BlockData"), "worldBlockType"); + apiInstance = getApiInstance(Class.forName("io.github.fisher2911.hmcleaves.api.HMCLeavesAPI")); + setCustomBlock = new WrappedReturningMethod<>((Class) apiInstance.getClass(), "setCustomBlock"); + Object config = getLeavesConfig(apiInstance.getClass()); + blockDataMap = getMap(config, "blockDataMap"); + itemDataField = getMap(config, "itemSupplierMap"); + } catch (Throwable e) { + Iris.error("Failed to initialize HMCLeavesDataProvider: " + e.getMessage()); + } + } + + @Override + public BlockData getBlockData(Identifier blockId) throws MissingResourceException { + Object o = blockDataMap.get(blockId.key()); + if (o == null) + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + Material material = worldBlockType.invoke(o, new Object[0]); + if (material == null) + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + return Bukkit.createBlockData(material); + } + + @Override + public ItemStack getItemStack(Identifier itemId) throws MissingResourceException { + if (!itemDataField.containsKey(itemId.key())) + throw new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key()); + return itemDataField.get(itemId.key()).get(); + } + + @Override + public void processUpdate(Engine engine, Location location, Identifier blockId) { + setCustomBlock.invoke(apiInstance, new Object[]{location, blockId.key(), true}); + } + + @Override + public Identifier[] getBlockTypes() { + KList names = new KList<>(); + for (String name : blockDataMap.keySet()) { + try { + Identifier key = new Identifier("hmcleaves", name); + if (getBlockData(key) != null) + names.add(key); + } catch (MissingResourceException ignored) { + } + } + + return names.toArray(new Identifier[0]); + } + + @Override + public Identifier[] getItemTypes() { + KList names = new KList<>(); + for (String name : itemDataField.keySet()) { + try { + Identifier key = new Identifier("hmcleaves", name); + if (getItemStack(key) != null) + names.add(key); + } catch (MissingResourceException ignored) { + } + } + + return names.toArray(new Identifier[0]); + } + + @Override + public boolean isValidProvider(Identifier id, boolean isItem) { + return (isItem ? itemDataField.keySet() : blockDataMap.keySet()).contains(id.key()); + } + + private Map getMap(C config, String name) { + WrappedField> field = new WrappedField<>((Class) config.getClass(), name); + return field.get(config); + } + + private A getApiInstance(Class apiClass) { + WrappedReturningMethod instance = new WrappedReturningMethod<>(apiClass, "getInstance"); + return instance.invoke(); + } + + private C getLeavesConfig(Class apiClass) { + WrappedReturningMethod instance = new WrappedReturningMethod<>(apiClass, "getInstance"); + WrappedField config = new WrappedField<>(apiClass, "config"); + return config.get(instance.invoke()); + } +} 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 a7136fe51..d466269ad 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 @@ -56,6 +56,10 @@ public class ExternalDataSVC implements IrisService { if (Bukkit.getPluginManager().getPlugin("ExecutableItems") != null) { Iris.info("ExecutableItems found, loading ExecutableItemsDataProvider..."); } + providers.add(new HMCLeavesDataProvider()); + if (Bukkit.getPluginManager().getPlugin("HMCLeaves") != null) { + Iris.info("BlockAdder found, loading HMCLeavesDataProvider..."); + } for (ExternalDataProvider p : providers) { if (p.isReady()) {