mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-15 17:44:55 +00:00
Fix #209. Hardened plugin loading. IC2 machines load only with IC2
This commit is contained in:
1 parent
23ae1abb06
commit
2986536e66
16 files changed
+295
-186
No files matched your search
@@ -11,28 +11,18 @@
|
||||
package forestry.plugins;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import cpw.mods.fml.common.IFuelHandler;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
import cpw.mods.fml.common.network.IGuiHandler;
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
import forestry.Forestry;
|
||||
|
||||
import forestry.core.interfaces.IOreDictionaryHandler;
|
||||
import forestry.core.interfaces.IPacketHandler;
|
||||
import forestry.core.interfaces.IPickupHandler;
|
||||
import forestry.core.interfaces.IResupplyHandler;
|
||||
import forestry.core.interfaces.ISaveEventHandler;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import java.io.File;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import net.minecraft.command.CommandHandler;
|
||||
import net.minecraft.command.ICommand;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
@@ -40,6 +30,16 @@ import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
public class PluginManager {
|
||||
|
||||
public static final String MODULE_CONFIG_FILE_NAME = "modules.cfg";
|
||||
@@ -52,8 +52,8 @@ public class PluginManager {
|
||||
public static ArrayList<IResupplyHandler> resupplyHandlers = Lists.newArrayList();
|
||||
public static ArrayList<IOreDictionaryHandler> dictionaryHandlers = Lists.newArrayList();
|
||||
|
||||
private static final Set<Module> loadedModules = EnumSet.noneOf(Module.class);
|
||||
private static final Set<Module> unloadedModules = EnumSet.allOf(Module.class);
|
||||
private static ArrayList<PluginModule> loadedModules;
|
||||
private static ArrayList<PluginModule> unloadedModules;
|
||||
private static Stage stage = Stage.SETUP;
|
||||
|
||||
public enum Stage {
|
||||
@@ -61,51 +61,52 @@ public class PluginManager {
|
||||
SETUP, PRE_INIT, INIT, POST_INIT, INIT_DISABLED, FINISHED;
|
||||
}
|
||||
|
||||
public enum Module {
|
||||
private static HashMap<Class<? extends ForestryPlugin>, PluginModule> pluginModules = new HashMap<Class<? extends ForestryPlugin>, PluginModule>();
|
||||
|
||||
CORE(new PluginCore()),
|
||||
APICULTURE(new PluginApiculture()),
|
||||
ARBORICULTURE(new PluginArboriculture()),
|
||||
ENERGY(new PluginEnergy()),
|
||||
FACTORY(new PluginFactory()),
|
||||
FARMING(new PluginFarming()),
|
||||
FOOD(new PluginFood()),
|
||||
LEPIDOPTEROLOGY(new PluginLepidopterology()),
|
||||
MAIL(new PluginMail()),
|
||||
STORAGE(new PluginStorage()),
|
||||
BUILDCRAFT(new PluginBuildCraft()),
|
||||
PROPOLIS_PIPE(new PluginPropolisPipe()),
|
||||
EQUIVELENT_EXCHANGE(new PluginEE()),
|
||||
FARM_CRAFTORY(new PluginFarmCraftory()),
|
||||
INDUSTRIALCRAFT(new PluginIC2()),
|
||||
NATURA(new PluginNatura()),;
|
||||
static {
|
||||
ArrayList<Class<? extends ForestryPlugin>> pluginClasses = new ArrayList<Class<? extends ForestryPlugin>>();
|
||||
pluginClasses.add(PluginCore.class);
|
||||
pluginClasses.add(PluginApiculture.class);
|
||||
pluginClasses.add(PluginArboriculture.class);
|
||||
pluginClasses.add(PluginEnergy.class);
|
||||
pluginClasses.add(PluginFactory.class);
|
||||
pluginClasses.add(PluginFarming.class);
|
||||
pluginClasses.add(PluginFood.class);
|
||||
pluginClasses.add(PluginLepidopterology.class);
|
||||
pluginClasses.add(PluginMail.class);
|
||||
pluginClasses.add(PluginStorage.class);
|
||||
pluginClasses.add(PluginBuildCraft.class);
|
||||
pluginClasses.add(PluginPropolisPipe.class);
|
||||
pluginClasses.add(PluginEE.class);
|
||||
pluginClasses.add(PluginFarmCraftory.class);
|
||||
pluginClasses.add(PluginIC2.class);
|
||||
pluginClasses.add(PluginNatura.class);
|
||||
|
||||
private final ForestryPlugin instance;
|
||||
unloadedModules = new ArrayList<PluginModule>();
|
||||
loadedModules = new ArrayList<PluginModule>();
|
||||
|
||||
private Module(ForestryPlugin plugin) {
|
||||
this.instance = plugin;
|
||||
for (Class<? extends ForestryPlugin>pluginClass : pluginClasses) {
|
||||
PluginModule pluginModule = new PluginModule(pluginClass);
|
||||
pluginModules.put(pluginClass, pluginModule);
|
||||
unloadedModules.add(pluginModule);
|
||||
}
|
||||
|
||||
public ForestryPlugin instance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return isModuleLoaded(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Stage getStage() {
|
||||
return stage;
|
||||
}
|
||||
|
||||
public static EnumSet<Module> getLoadedModules() {
|
||||
return EnumSet.copyOf(loadedModules);
|
||||
public static PluginModule getPluginModule(Class<? extends ForestryPlugin> pluginClass) {
|
||||
return pluginModules.get(pluginClass);
|
||||
}
|
||||
|
||||
public static boolean isModuleLoaded(Module module) {
|
||||
return loadedModules.contains(module);
|
||||
public static List<PluginModule> getLoadedModules() {
|
||||
return new ArrayList<PluginModule>(loadedModules);
|
||||
}
|
||||
|
||||
public static boolean isModuleLoaded(Class<? extends ForestryPlugin> pluginClass) {
|
||||
PluginModule pluginModule = pluginModules.get(pluginClass);
|
||||
return loadedModules.contains(pluginModule);
|
||||
}
|
||||
|
||||
public static void addPlugin(ForestryPlugin plugin) {
|
||||
@@ -123,21 +124,20 @@ public class PluginManager {
|
||||
config.addCustomCategoryComment(CATEGORY_MODULES, "Disabling these modules can greatly change how the mod functions.\n"
|
||||
+ "Your milage may vary, please report any issues.");
|
||||
|
||||
Set<Module> toLoad = EnumSet.allOf(Module.class);
|
||||
Iterator<Module> it = toLoad.iterator();
|
||||
ArrayList<PluginModule> toLoad = new ArrayList<PluginModule>(unloadedModules);
|
||||
Iterator<PluginModule> it = toLoad.iterator();
|
||||
while (it.hasNext()) {
|
||||
Module m = it.next();
|
||||
if (m == Module.CORE)
|
||||
PluginModule m = it.next();
|
||||
if (m == getPluginModule(PluginCore.class))
|
||||
continue;
|
||||
if (!isEnabled(config, m)) {
|
||||
it.remove();
|
||||
Proxies.log.info("Module disabled: {0}", m);
|
||||
continue;
|
||||
}
|
||||
ForestryPlugin plugin = m.instance;
|
||||
if (!plugin.isAvailable()) {
|
||||
if (m.instance() == null) {
|
||||
it.remove();
|
||||
Proxies.log.info("Module {0} failed to load: {1}", plugin, plugin.getFailMessage());
|
||||
Proxies.log.info("Module {0} failed to load.", m);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -146,12 +146,17 @@ public class PluginManager {
|
||||
changed = false;
|
||||
it = toLoad.iterator();
|
||||
while (it.hasNext()) {
|
||||
Module m = it.next();
|
||||
Set<Module> deps = m.instance().getDependancies();
|
||||
if (!toLoad.containsAll(deps)) {
|
||||
PluginModule m = it.next();
|
||||
|
||||
Set<Class<? extends ForestryPlugin>> dependenciesClasses = m.instance().getDependencies();
|
||||
Set<PluginModule> dependencies = new HashSet<PluginModule>();
|
||||
for (Class<? extends ForestryPlugin> depClass : dependenciesClasses)
|
||||
dependencies.add(getPluginModule(depClass));
|
||||
|
||||
if (!toLoad.containsAll(dependencies)) {
|
||||
it.remove();
|
||||
changed = true;
|
||||
Proxies.log.warning("Module {0} is missing dependancies: {1}", m, deps);
|
||||
Proxies.log.warning("Module {0} is missing dependencies: {1}", m, dependencies);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -166,8 +171,8 @@ public class PluginManager {
|
||||
Locale.setDefault(locale);
|
||||
|
||||
stage = Stage.PRE_INIT;
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
loadPlugin(plugin);
|
||||
Proxies.log.fine("Pre-Init Start: {0}", plugin);
|
||||
plugin.preInit();
|
||||
@@ -210,8 +215,8 @@ public class PluginManager {
|
||||
|
||||
public static void runInit() {
|
||||
stage = Stage.INIT;
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
Proxies.log.fine("Init Start: {0}", plugin);
|
||||
plugin.registerBackpackItems();
|
||||
plugin.registerCrates();
|
||||
@@ -222,8 +227,8 @@ public class PluginManager {
|
||||
|
||||
public static void runPostInit() {
|
||||
stage = Stage.POST_INIT;
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
Proxies.log.fine("Post-Init Start: {0}", plugin);
|
||||
plugin.registerRecipes();
|
||||
plugin.postInit();
|
||||
@@ -231,11 +236,12 @@ public class PluginManager {
|
||||
}
|
||||
|
||||
stage = Stage.INIT_DISABLED;
|
||||
for (Module m : unloadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
Proxies.log.fine("Disabled-Init Start: {0}", plugin);
|
||||
plugin.disabledInit();
|
||||
Proxies.log.fine("Disabled-Init Complete: {0}", plugin);
|
||||
for (PluginModule m : unloadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
Proxies.log.fine("Disabled-Init Start: {0}", m);
|
||||
if (plugin != null)
|
||||
plugin.disabledInit();
|
||||
Proxies.log.fine("Disabled-Init Complete: {0}", m);
|
||||
}
|
||||
stage = Stage.FINISHED;
|
||||
}
|
||||
@@ -243,8 +249,8 @@ public class PluginManager {
|
||||
public static void serverStarting(MinecraftServer server) {
|
||||
CommandHandler commandManager = (CommandHandler) server.getCommandManager();
|
||||
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
ICommand[] commands = plugin.getConsoleCommands();
|
||||
if (commands == null)
|
||||
continue;
|
||||
@@ -255,21 +261,21 @@ public class PluginManager {
|
||||
|
||||
public static void processIMCMessages(ImmutableList<FMLInterModComms.IMCMessage> messages) {
|
||||
for (FMLInterModComms.IMCMessage message : messages)
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
if (plugin.processIMCMessage(message))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static void generateSurface(World world, Random rand, int chunkX, int chunkZ) {
|
||||
for (Module m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance;
|
||||
for (PluginModule m : loadedModules) {
|
||||
ForestryPlugin plugin = m.instance();
|
||||
plugin.generateSurface(world, rand, chunkX, chunkZ);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isEnabled(Configuration config, Module m) {
|
||||
private static boolean isEnabled(Configuration config, PluginModule m) {
|
||||
boolean defaultValue = true;
|
||||
Property prop = config.get(CATEGORY_MODULES, m.toString().toLowerCase(Locale.ENGLISH).replace('_', '.'), defaultValue);
|
||||
return prop.getBoolean(true);
|
||||
|
||||
Reference in new issue
Block a user