diff --git a/gradle.properties b/gradle.properties index 86a40e31..c01b64ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.10.8 # Mod Properties - mod_version = 0.8.5-beta + mod_version = 0.8.6-beta maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/integration/AdornIntegration.java b/src/main/java/ru/betterend/integration/AdornIntegration.java new file mode 100644 index 00000000..f87fc0c0 --- /dev/null +++ b/src/main/java/ru/betterend/integration/AdornIntegration.java @@ -0,0 +1,27 @@ +package ru.betterend.integration; + +import java.lang.reflect.Method; + +import ru.betterend.BetterEnd; + +public class AdornIntegration extends ModIntegration { + public AdornIntegration() { + super("adorn"); + } + + @Override + public void register() { + Class adornBlockBuilder = getClass("juuxel.adorn.api.block.AdornBlockBuilder"); + Class blockVariantWood = getClass("juuxel.adorn.api.block.BlockVariant$Wood"); + Class blockVariant = getClass("juuxel.adorn.api.block.BlockVariant"); + + Object testVariant = newInstance(blockVariantWood, BetterEnd.MOD_ID + "/mossy_glowshroom"); + Method create = getMethod(adornBlockBuilder, "create", blockVariant); + Object builder = executeMethod(adornBlockBuilder, create, testVariant); + getAndExecuteRuntime(builder, "withEverything"); + getAndExecuteRuntime(builder, "registerIn", "adorn"); + } + + @Override + public void addBiomes() {} +} diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index bdd07499..063f9687 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -9,6 +9,7 @@ import ru.betterend.integration.byg.BYGIntegration; public class Integrations { public static final List INTEGRATIONS = Lists.newArrayList(); public static final ModIntegration BYG = register(new BYGIntegration()); + public static final ModIntegration ADORN = register(new AdornIntegration()); public static void register() { INTEGRATIONS.forEach((integration) -> { diff --git a/src/main/java/ru/betterend/integration/ModIntegration.java b/src/main/java/ru/betterend/integration/ModIntegration.java index cd02bb65..0e560852 100644 --- a/src/main/java/ru/betterend/integration/ModIntegration.java +++ b/src/main/java/ru/betterend/integration/ModIntegration.java @@ -1,5 +1,9 @@ package ru.betterend.integration; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -11,6 +15,7 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.Feature; +import ru.betterend.BetterEnd; import ru.betterend.world.features.EndFeature; public abstract class ModIntegration { @@ -61,4 +66,106 @@ public abstract class ModIntegration { public Biome getBiome(String name) { return BuiltinRegistries.BIOME.get(getID(name)); } + + public Class getClass(String path) { + Class cl = null; + try { + cl = Class.forName(path); + } + catch (ClassNotFoundException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + return cl; + } + + public Method getMethod(Class cl, String functionName, Class... args) { + if (cl != null) { + try { + return cl.getMethod(functionName, args); + } + catch (NoSuchMethodException | SecurityException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Method getInstanceMethod(Object instance, String functionName, Class... args) { + if (instance != null) { + try { + return instance.getClass().getDeclaredMethod(functionName, args); + } + catch (NoSuchMethodException | SecurityException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object executeMethod(Object instance, Method method, Object... args) { + if (method != null) { + try { + return method.invoke(instance, args); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + return null; + } + + public Object getAndExecuteStatic(Class cl, String functionName, Object... args) { + if (cl != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getMethod(cl, functionName, classes); + return executeMethod(null, method, args); + } + return null; + } + + public Object getAndExecuteRuntime(Object instance, String functionName, Object... args) { + if (instance != null) { + Class[] classes = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + classes[i] = args[i].getClass(); + } + Method method = getInstanceMethod(instance, functionName, classes); + return executeMethod(instance, method, args); + } + return null; + } + + public Object newInstance(Class cl, Object... args) { + if (cl != null) { + for (Constructor constructor: cl.getConstructors()) { + if (constructor.getParameterCount() == args.length) { + try { + return constructor.newInstance(args); + } + catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + BetterEnd.LOGGER.error(e.getMessage()); + if (BetterEnd.isDevEnvironment()) { + e.printStackTrace(); + } + } + } + } + } + return null; + } }