package lumien.extendedpotions; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import lumien.extendedpotions.asm.MCPNames; import lumien.extendedpotions.library.Reference; import net.minecraft.enchantment.Enchantment; import net.minecraft.potion.Potion; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.event.FMLConstructionEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; @Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.MOD_VERSION, dependencies = "before:*") public class ExtendedPotions { @Instance(value = Reference.MOD_ID) public static ExtendedPotions INSTANCE; Logger logger; int newPotionSize; @EventHandler public void preInit(FMLPreInitializationEvent event) { logger = event.getModLog(); Configuration configuration = new Configuration(event.getSuggestedConfigurationFile()); newPotionSize = configuration.get("Settings", "PotionIDLimit", 4096, "What should be the new potion id limit (Vanilla is 32)").getInt(4096); ErrorHandler.log = configuration.get("Settings", "LogConflicts", true, "Whether Potion ID Conflicts are supposed to be logged to the console. (Otherwise they will be logged to the DEBUG log)").getBoolean(true); if (configuration.hasChanged()) { configuration.save(); } extendPotionArray(); } @EventHandler public void postInit(FMLPostInitializationEvent event) { ErrorHandler.displayConflicts(); } private void extendPotionArray() { try { Field potionTypesField = Potion.class.getDeclaredField(MCPNames.field("field_76425_a")); makeModifiable(potionTypesField); int potionArraySize = Potion.potionTypes.length; if (potionArraySize < newPotionSize) { Potion[] newArray = new Potion[newPotionSize]; for (int i = 0; i < potionArraySize; i++) { newArray[i] = Potion.potionTypes[i]; } potionTypesField.set(null, newArray); logger.log(Level.INFO, "Extended Potion Array to " + newPotionSize); } } catch (Exception e) { e.printStackTrace(); logger.log(Level.INFO, "Could not extend Potion Array"); } } private void makeModifiable(Field nameField) throws Exception { nameField.setAccessible(true); int modifiers = nameField.getModifiers(); Field modifierField = nameField.getClass().getDeclaredField("modifiers"); modifiers = modifiers & ~Modifier.FINAL; modifierField.setAccessible(true); modifierField.setInt(nameField, modifiers); } }