diff options
Diffstat (limited to 'src/main/java/me/shedaniel/rei/api')
3 files changed, 119 insertions, 4 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java b/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java index 44fb1ad4d..dbc4a7204 100644 --- a/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java @@ -2,7 +2,12 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.gui.widget.IWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; +import me.shedaniel.rei.gui.widget.RecipeViewingWidget; import me.shedaniel.rei.listeners.IMixinGuiContainer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -27,4 +32,13 @@ public interface IRecipeCategory<T extends IRecipeDisplay> { return Arrays.asList(new RecipeBaseWidget(bounds)); } + default public void drawCategoryBackground(Rectangle bounds) { + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderHelper.disableStandardItemLighting(); + Minecraft.getInstance().getTextureManager().bindTexture(RecipeViewingWidget.CHEST_GUI_TEXTURE); + new Gui() { + + }.drawTexturedModalRect((int) bounds.getX(), (int) bounds.getY(), 0, 0, (int) bounds.getWidth(), (int) bounds.getHeight()); + } + } diff --git a/src/main/java/me/shedaniel/rei/api/REIPluginInfo.java b/src/main/java/me/shedaniel/rei/api/REIPluginInfo.java new file mode 100644 index 000000000..38519f743 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/REIPluginInfo.java @@ -0,0 +1,34 @@ +package me.shedaniel.rei.api; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class REIPluginInfo { + + public static Gson GSON = new GsonBuilder().create(); + + private List<REIPlugin> plugins; + + public List<REIPlugin> getPlugins() { + return plugins; + } + + public static class REIPlugin { + private String identifier; + @SerializedName("class") private String pluginClass; + + public String getIdentifier() { + if (identifier == null) + return "null:null"; + return identifier; + } + + public String getPluginClass() { + return pluginClass; + } + } + +} diff --git a/src/main/java/me/shedaniel/rei/api/RoughlyEnoughItemsPlugin.java b/src/main/java/me/shedaniel/rei/api/RoughlyEnoughItemsPlugin.java index 9930ca63f..d1db0cc3f 100644 --- a/src/main/java/me/shedaniel/rei/api/RoughlyEnoughItemsPlugin.java +++ b/src/main/java/me/shedaniel/rei/api/RoughlyEnoughItemsPlugin.java @@ -1,19 +1,33 @@ package me.shedaniel.rei.api; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.plugin.DefaultPlugin; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; 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.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +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(); - public static final ResourceLocation DEFAULT_PLUGIN = new ResourceLocation("roughlyenoughitems", "default_plugin"); public static IRecipePlugin registerPlugin(ResourceLocation ResourceLocation, IRecipePlugin plugin) { plugins.put(ResourceLocation, plugin); @@ -33,7 +47,60 @@ public class RoughlyEnoughItemsPlugin implements InitializationListener { @Override public void onInitialization() { - RoughlyEnoughItemsPlugin.registerPlugin(RoughlyEnoughItemsPlugin.DEFAULT_PLUGIN, new DefaultPlugin()); + discoverPlugins(); + } + + private void discoverPlugins() { + Collection<ModInfo> modInfoCollection = RiftLoader.instance.getMods(); + List<REIPluginInfo> pluginInfoList = Lists.newArrayList(); + JsonParser parser = new JsonParser(); + modInfoCollection.forEach(modContainer -> { + JsonElement jsonElement = null; + if (modContainer.source.isFile()) + try (JarFile file = new JarFile(modContainer.source)) { + ZipEntry entry = file.getEntry("plugins" + File.separatorChar + "rei.plugin.json"); + if (entry != null) { + Reader reader = new InputStreamReader(file.getInputStream(entry)); + jsonElement = parser.parse(reader); + reader.close(); + } + } catch (Exception e) { + RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to load plugin file from " + modContainer.id + ". (" + e.getLocalizedMessage() + ")"); + } + else if (modContainer.source.isDirectory()) { + File modInfo = new File(modContainer.source, "plugins" + File.separatorChar + "rei.plugin.json"); + if (modInfo.exists()) + try { + Reader reader = new InputStreamReader(Files.newInputStream(modInfo.toPath(), StandardOpenOption.READ)); + jsonElement = parser.parse(reader); + reader.close(); + } catch (Exception e) { + RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to load plugin file from " + modContainer.id + ". (" + e.getLocalizedMessage() + ")"); + } + } + if (jsonElement != null && jsonElement.isJsonObject()) { + try { + REIPluginInfo info = REIPluginInfo.GSON.fromJson(jsonElement, REIPluginInfo.class); + if (info != null) + pluginInfoList.add(info); + } catch (Exception e) { + RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to load REI plugin info from " + modContainer.id + ". (" + e.getLocalizedMessage() + ")"); + } + } + }); + pluginInfoList.stream().forEachOrdered(reiPluginInfo -> { + reiPluginInfo.getPlugins().forEach(reiPlugin -> { + try { + ResourceLocation identifier = new ResourceLocation(reiPlugin.getIdentifier()); + Class<?> aClass = Class.forName(reiPlugin.getPluginClass()); + IRecipePlugin plugin = IRecipePlugin.class.cast(aClass.newInstance()); + RoughlyEnoughItemsPlugin.registerPlugin(identifier, plugin); + RoughlyEnoughItemsPlugin.LOGGER.info("REI: Registered REI plugin: " + reiPlugin.getIdentifier()); + } catch (Exception e) { + RoughlyEnoughItemsPlugin.LOGGER.error("REI: Failed to register REI plugin: " + reiPlugin.getIdentifier() + ". (" + e.getLocalizedMessage() + ")"); + } + }); + }); } } |
