From 775b153b684deb08745e6c3ff573636a97481d6c Mon Sep 17 00:00:00 2001 From: DarkGuardsman Date: Fri, 20 Sep 2013 08:52:37 -0400 Subject: [PATCH] Added system to detect annotations and use them Untested but then again the entire registration system is so... --- .../core/registration/ModObjectRegistry.java | 80 ++++++++++++++++--- .../core/registration/TileEntityUser.java | 2 +- 2 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/dark/core/registration/ModObjectRegistry.java b/src/dark/core/registration/ModObjectRegistry.java index cf25e196..eda4541d 100644 --- a/src/dark/core/registration/ModObjectRegistry.java +++ b/src/dark/core/registration/ModObjectRegistry.java @@ -1,11 +1,12 @@ package dark.core.registration; import java.io.File; +import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Set; import net.minecraft.block.Block; @@ -111,18 +112,76 @@ public class ModObjectRegistry public static void finishCreation(Block block, BlockBuildData data) { - if (data != null && block != null) + if (data != null) { - if (data.tiles != null) + if (block != null) { - for (Pair> par : data.tiles) + // Read block class annotions + for (Annotation annotian : block.getClass().getDeclaredAnnotations()) { - GameRegistry.registerTileEntityWithAlternatives(par.getValue(), par.getKey(), "DM" + par.getKey()); + if (annotian instanceof TileEntityUser) + { + Class[] tileEntities = ((TileEntityUser) annotian).tileEntities(); + String[] tileEntitiesNames = ((TileEntityUser) annotian).tileEntitiesNames(); + + if (tileEntities != null && tileEntities.length > 0 && tileEntitiesNames != null && tileEntitiesNames.length > 0) + { + for (int i = 0; i < tileEntities.length && i < tileEntitiesNames.length; i++) + { + GameRegistry.registerTileEntityWithAlternatives(tileEntities[i], tileEntitiesNames[i], "DM" + tileEntitiesNames[i]); + } + } + } + } + + // Read threw the block class looking for annotions on fields + for (Method method : block.getClass().getMethods()) + { + for (Annotation annotian : method.getDeclaredAnnotations()) + { + if (annotian instanceof BlockConfigFile) + { + Type[] types = method.getParameterTypes(); + if (types.length == 1 && types[0] instanceof Configuration) + { + Configuration extraBlockConfig = new Configuration(new File(Loader.instance().getConfigDir(), "Dark/blocks/" + block.getUnlocalizedName() + ".cfg")); + extraBlockConfig.load(); + try + { + method.setAccessible(true); + method.invoke(null, extraBlockConfig); + } + catch (IllegalAccessException e) + { + e.printStackTrace(); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(); + } + catch (InvocationTargetException e) + { + e.printStackTrace(); + } + extraBlockConfig.save(); + + } + } + } + } + + // Load data from BlockBuildData + if (data.tiles != null) + { + for (Pair> par : data.tiles) + { + GameRegistry.registerTileEntityWithAlternatives(par.getValue(), par.getKey(), "DM" + par.getKey()); + } + } + if (data.creativeTab != null) + { + block.setCreativeTab(data.creativeTab); } - } - if (data.creativeTab != null) - { - block.setCreativeTab(data.creativeTab); } } if (block instanceof IExtraObjectInfo) @@ -142,6 +201,7 @@ public class ModObjectRegistry GameRegistry.registerTileEntityWithAlternatives(par.getValue(), par.getKey(), "DM" + par.getKey()); } } + } public static void registerBlock(Block block, Class itemClass, String name, String modID) diff --git a/src/dark/core/registration/TileEntityUser.java b/src/dark/core/registration/TileEntityUser.java index 3f14745d..cc9b8ca3 100644 --- a/src/dark/core/registration/TileEntityUser.java +++ b/src/dark/core/registration/TileEntityUser.java @@ -16,5 +16,5 @@ public @interface TileEntityUser /** Array of tile entities names that are used to register the tile entity. Is a parallel array * in combo with tileEntities */ - Class[] tileEntitiesNames() default {}; + String[] tileEntitiesNames() default {}; }