diff options
Diffstat (limited to 'src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java | 95 |
1 files changed, 46 insertions, 49 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java index 621730344..8f91e7e0e 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java @@ -4,7 +4,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import com.mojang.datafixers.util.Pair; import me.shedaniel.rei.api.IRecipePlugin; import net.minecraft.util.ResourceLocation; import org.apache.logging.log4j.LogManager; @@ -13,14 +12,16 @@ import org.dimdev.riftloader.ModInfo; import org.dimdev.riftloader.RiftLoader; import org.dimdev.riftloader.listener.InitializationListener; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.StandardOpenOption; +import java.io.File; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.Reader; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.jar.JarFile; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; public class RoughlyEnoughItemsPlugin implements InitializationListener { @@ -28,10 +29,11 @@ public class RoughlyEnoughItemsPlugin implements InitializationListener { public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); private static final Map<ResourceLocation, IRecipePlugin> plugins = Maps.newHashMap(); private static JsonParser parser = new JsonParser(); + private static List<ResourceLocation> disablingPlugins; public static IRecipePlugin registerPlugin(ResourceLocation resourceLocation, IRecipePlugin plugin) { plugins.put(resourceLocation, plugin); - RoughlyEnoughItemsPlugin.LOGGER.info("REI: Registered Plugin from %s by %s.", resourceLocation.toString(), plugin.getClass()); + RoughlyEnoughItemsPlugin.LOGGER.info("REI: Registered Plugin from %s by %s.", resourceLocation.toString(), plugin.getClass().getSimpleName()); return plugin; } @@ -46,66 +48,61 @@ public class RoughlyEnoughItemsPlugin implements InitializationListener { return null; } + public static void disablePlugin(ResourceLocation location) { + if (disablingPlugins.stream().noneMatch(location1 -> {return location.equals(location1);})) + disablingPlugins.add(location); + } + @Override public void onInitialization() { discoverPlugins(); } private void discoverPlugins() { + LOGGER.info("REI: Discovering Plugins."); + disablingPlugins = Lists.newArrayList(); Collection<ModInfo> modInfoCollection = RiftLoader.instance.getMods(); - List<Pair<ResourceLocation, String>> plugins = Lists.newArrayList(); - modInfoCollection.forEach(modContainer -> { - JsonElement jsonArray = null; - if (modContainer.source.isFile()) - try (JarFile file = new JarFile(modContainer.source)) { - ZipEntry entry = file.getEntry("plugins" + File.separatorChar + "roughlyenoughitems.plugin.json"); + modInfoCollection.forEach(modInfo -> { + try { + if (modInfo.source.isDirectory()) { + File pluginFile = new File(modInfo.source, "plugins/roughlyenoughitems.plugin.json"); + if (pluginFile.exists()) + loadPluginInfo(modInfo, new FileReader(pluginFile)); + } else { + JarFile jarFile = new JarFile(modInfo.source); + ZipEntry entry = jarFile.getEntry("plugins/roughlyenoughitems.plugin.json"); if (entry != null) - jsonArray = readFromInputStream(file.getInputStream(entry)); - } catch (Exception e) { - RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to read plugin file from %s. (%s)", modContainer.id, e.getLocalizedMessage()); + loadPluginInfo(modInfo, new InputStreamReader(jarFile.getInputStream(entry))); } - else if (modContainer.source.isDirectory()) { - File modInfo = new File(modContainer.source, "plugins" + File.separatorChar + "roughlyenoughitems.plugin.json"); - if (modInfo.exists()) - try { - jsonArray = readFromInputStream(Files.newInputStream(modInfo.toPath(), StandardOpenOption.READ)); - } catch (Exception e) { - RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to read plugin file from %s. (%s)", modContainer.id, e.getLocalizedMessage()); - } - } - if (jsonArray != null && jsonArray.isJsonArray()) { - try { - jsonArray.getAsJsonArray().forEach(element -> { - String id = element.getAsJsonObject().get("id").getAsString(); - String initializer = element.getAsJsonObject().get("initializer").getAsString(); - plugins.add(new Pair<>(new ResourceLocation(modContainer.id, id), initializer)); - }); - } catch (Exception e) { - RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to grab plugin from %s. (%s)", modContainer.id, e.getLocalizedMessage()); - } - } - }); - plugins.stream().forEachOrdered(pair -> { - try { - Class<?> aClass = Class.forName(pair.getSecond()); - IRecipePlugin plugin = IRecipePlugin.class.cast(aClass.newInstance()); - RoughlyEnoughItemsPlugin.registerPlugin(pair.getFirst(), plugin); } catch (Exception e) { - RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to register plugin from %s. (%s)", pair.getFirst().toString(), e.getLocalizedMessage()); + RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to load plugin file from %s. (%s)", (Object) modInfo.id, (Object) e.getLocalizedMessage()); } }); + plugins.forEach((location, plugin) -> plugin.onFirstLoad()); + plugins.keySet().stream().filter(location -> { + return disablingPlugins.contains(location); + }).collect(Collectors.toList()).forEach(location -> { + plugins.remove(location); + LOGGER.info("REI: Disabled REI plugin %s.", location.toString()); + }); + LOGGER.info("REI: Discovered %d REI Plugins%s", plugins.size(), (plugins.size() > 0 ? ": " + String.join(", ", plugins.keySet().stream().map(ResourceLocation::toString).collect(Collectors.toList())) : ".")); } - private JsonElement readFromInputStream(InputStream stream) throws IOException { - JsonElement element = readFromReader(new InputStreamReader(stream)); - stream.close(); - return element; + private void loadPluginInfo(ModInfo modInfo, Reader reader) throws Exception { + JsonElement infoElement = parser.parse(reader); + if (infoElement.isJsonArray()) + for(JsonElement jsonElement : infoElement.getAsJsonArray()) + parseAndRegisterPlugin(modInfo.id, jsonElement); + else + parseAndRegisterPlugin(modInfo.id, infoElement); + reader.close(); } - private JsonElement readFromReader(Reader reader) throws IOException { - JsonElement element = parser.parse(reader); - reader.close(); - return element; + private void parseAndRegisterPlugin(String modId, JsonElement jsonElement) throws Exception { + ResourceLocation location = new ResourceLocation(modId, jsonElement.getAsJsonObject().getAsJsonPrimitive("id").getAsString()); + Class<?> aClass = Class.forName(jsonElement.getAsJsonObject().getAsJsonPrimitive("initializer").getAsString()); + IRecipePlugin plugin = IRecipePlugin.class.cast(aClass.newInstance()); + registerPlugin(location, plugin); } } |
