aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java
diff options
context:
space:
mode:
authorUnknown <shekwancheung0528@gmail.com>2019-01-22 20:11:04 +0800
committerUnknown <shekwancheung0528@gmail.com>2019-01-22 20:11:04 +0800
commit999b71d9da9c4c9dcc251f7be4578819a90d215f (patch)
tree1b73c92fbe9b23af74d16f79973c8c9e9d54b1d5 /src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java
parentbbb92072372d8ceab79bb86186637af02cae6779 (diff)
downloadRoughlyEnoughItems-2.1.0.13.tar.gz
RoughlyEnoughItems-2.1.0.13.tar.bz2
RoughlyEnoughItems-2.1.0.13.zip
v2.1.0.13v2.1.0.13
Diffstat (limited to 'src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java')
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java
new file mode 100644
index 000000000..621730344
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsPlugin.java
@@ -0,0 +1,111 @@
+package me.shedaniel.rei;
+
+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;
+import org.apache.logging.log4j.Logger;
+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.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+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();
+
+ 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());
+ return plugin;
+ }
+
+ public static List<IRecipePlugin> getPlugins() {
+ return new LinkedList<>(plugins.values());
+ }
+
+ public static ResourceLocation getPluginResourceLocation(IRecipePlugin plugin) {
+ for(ResourceLocation ResourceLocation : plugins.keySet())
+ if (plugins.get(ResourceLocation).equals(plugin))
+ return ResourceLocation;
+ return null;
+ }
+
+ @Override
+ public void onInitialization() {
+ discoverPlugins();
+ }
+
+ private void discoverPlugins() {
+ 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");
+ 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());
+ }
+ 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());
+ }
+ });
+ }
+
+ private JsonElement readFromInputStream(InputStream stream) throws IOException {
+ JsonElement element = readFromReader(new InputStreamReader(stream));
+ stream.close();
+ return element;
+ }
+
+ private JsonElement readFromReader(Reader reader) throws IOException {
+ JsonElement element = parser.parse(reader);
+ reader.close();
+ return element;
+ }
+
+}