getAliases() {
+ return aliases;
+ }
+
+ @FunctionalInterface
+ public interface ICommand {
+
+ void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException;
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/integration/jei/SavedJEIValues.java b/src/main/java/com/nomiceu/nomilabs/integration/jei/SavedJEIValues.java
new file mode 100644
index 00000000..09679642
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/integration/jei/SavedJEIValues.java
@@ -0,0 +1,8 @@
+package com.nomiceu.nomilabs.integration.jei;
+
+import mezz.jei.ingredients.IngredientFilter;
+
+public class SavedJEIValues {
+
+ public static IngredientFilter savedFilter;
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/jei/JeiStarterMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/jei/JeiStarterMixin.java
index 16bececd..72db47c6 100644
--- a/src/main/java/com/nomiceu/nomilabs/mixin/jei/JeiStarterMixin.java
+++ b/src/main/java/com/nomiceu/nomilabs/mixin/jei/JeiStarterMixin.java
@@ -2,27 +2,67 @@
import java.util.List;
+import net.minecraft.util.NonNullList;
+
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.cleanroommc.groovyscript.compat.mods.jei.JeiPlugin;
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.nomiceu.nomilabs.NomiLabs;
import com.nomiceu.nomilabs.groovy.mixinhelper.LabsJEIApplied;
+import com.nomiceu.nomilabs.integration.jei.SavedJEIValues;
import mezz.jei.api.IJeiRuntime;
import mezz.jei.api.IModPlugin;
+import mezz.jei.api.ingredients.IIngredientRegistry;
+import mezz.jei.gui.ingredients.IIngredientListElement;
+import mezz.jei.ingredients.IngredientBlacklistInternal;
+import mezz.jei.ingredients.IngredientFilter;
+import mezz.jei.ingredients.IngredientListElementFactory;
+import mezz.jei.startup.IModIdHelper;
import mezz.jei.startup.JeiStarter;
import mezz.jei.startup.ModRegistry;
/**
* Fix GrS JEI Hiding Issues, by re-checking if applied, and if not, applying at end of registers,
* instead of before ProgressManager.pop(). This can happen due to HEI's new 'Progress Bar' config.
+ *
+ * Also allows for 'fast' reloading of JEI, reusing the existing Ingredient Filter, Search Trees and Bookmarks Data.
*/
@Mixin(value = JeiStarter.class, remap = false)
public class JeiStarterMixin {
+ @SuppressWarnings("rawtypes")
+ @Redirect(method = "start",
+ at = @At(value = "INVOKE",
+ target = "Lmezz/jei/ingredients/IngredientListElementFactory;createBaseList(Lmezz/jei/api/ingredients/IIngredientRegistry;Lmezz/jei/startup/IModIdHelper;)Lnet/minecraft/util/NonNullList;"),
+ require = 1)
+ private NonNullList stopRegenerationOfList(IIngredientRegistry ingredientType,
+ IModIdHelper ingredientRegistry) {
+ if (SavedJEIValues.savedFilter == null)
+ return IngredientListElementFactory.createBaseList(ingredientType, ingredientRegistry);
+ return null;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @WrapOperation(method = "start",
+ at = @At(value = "NEW",
+ target = "(Lmezz/jei/ingredients/IngredientBlacklistInternal;Lnet/minecraft/util/NonNullList;)Lmezz/jei/ingredients/IngredientFilter;"),
+ require = 1)
+ private IngredientFilter reuseIngredientBlacklist(IngredientBlacklistInternal blacklist,
+ NonNullList ingredients,
+ Operation original) {
+ if (SavedJEIValues.savedFilter == null) return original.call(blacklist, ingredients);
+
+ NomiLabs.LOGGER.info("[Fast JEI Reload] Using Saved JEI Ingredient Filter...");
+ return SavedJEIValues.savedFilter;
+ }
+
@Inject(method = "registerPlugins", at = @At("TAIL"))
private static void handleAfterRegister(List plugins, ModRegistry modRegistry, CallbackInfo ci) {
if (LabsJEIApplied.afterRegisterApplied) {
diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsFastReloadMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsFastReloadMessage.java
new file mode 100644
index 00000000..c97bd313
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/network/LabsFastReloadMessage.java
@@ -0,0 +1,40 @@
+package com.nomiceu.nomilabs.network;
+
+import net.minecraft.client.Minecraft;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+import com.cleanroommc.groovyscript.GroovyScript;
+import com.cleanroommc.groovyscript.registry.ReloadableRegistryManager;
+import com.nomiceu.nomilabs.integration.jei.SavedJEIValues;
+
+import io.netty.buffer.ByteBuf;
+import mezz.jei.Internal;
+
+public class LabsFastReloadMessage implements IMessage {
+
+ public LabsFastReloadMessage() {}
+
+ @Override
+ public void fromBytes(ByteBuf buf) {}
+
+ @Override
+ public void toBytes(ByteBuf buf) {}
+
+ public static class MessageHandler extends MainThreadMessageHandler {
+
+ @Override
+ protected IMessage executeClient(LabsFastReloadMessage message, MessageContext ctx) {
+ // Save existing JEI values
+ SavedJEIValues.savedFilter = Internal.getIngredientFilter();
+
+ // noinspection UnstableApiUsage
+ ReloadableRegistryManager.reloadJei(true);
+
+ SavedJEIValues.savedFilter = null;
+
+ GroovyScript.postScriptRunResult(Minecraft.getMinecraft().player, true, true, true, 0);
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsLangReloadMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsLangReloadMessage.java
new file mode 100644
index 00000000..c408b005
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/network/LabsLangReloadMessage.java
@@ -0,0 +1,43 @@
+package com.nomiceu.nomilabs.network;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.text.TextComponentString;
+import net.minecraftforge.client.resource.VanillaResourceType;
+import net.minecraftforge.fml.client.FMLClientHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+import com.cleanroommc.groovyscript.GroovyScript;
+import com.cleanroommc.groovyscript.registry.ReloadableRegistryManager;
+
+import io.netty.buffer.ByteBuf;
+
+public class LabsLangReloadMessage implements IMessage {
+
+ public LabsLangReloadMessage() {}
+
+ @Override
+ public void fromBytes(ByteBuf buf) {}
+
+ @Override
+ public void toBytes(ByteBuf buf) {}
+
+ public static class MessageHandler extends MainThreadMessageHandler {
+
+ @Override
+ protected IMessage executeClient(LabsLangReloadMessage message, MessageContext ctx) {
+ // Reload Textures, but ONLY Lang
+ long time = System.currentTimeMillis();
+ FMLClientHandler.instance().refreshResources(VanillaResourceType.LANGUAGES);
+ time = System.currentTimeMillis() - time;
+ Minecraft.getMinecraft().player.sendMessage(
+ new TextComponentString("Reloading Language Resources took " + time + "ms"));
+
+ // noinspection UnstableApiUsage
+ ReloadableRegistryManager.reloadJei(true);
+
+ GroovyScript.postScriptRunResult(Minecraft.getMinecraft().player, true, true, true, 0);
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java b/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java
index ce667fc8..f623419a 100644
--- a/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java
+++ b/src/main/java/com/nomiceu/nomilabs/network/LabsNetworkHandler.java
@@ -29,6 +29,10 @@ public static void preInit() {
registerMessage(4, LabsP2PAddAsInputMessage.MessageHandler.class, LabsP2PAddAsInputMessage.class);
registerMessage(5, LabsP2PAddAsOutputMessage.MessageHandler.class, LabsP2PAddAsOutputMessage.class);
}
+
+ registerMessage(6, LabsLangReloadMessage.MessageHandler.class, LabsLangReloadMessage.class);
+ registerMessage(7, LabsFastReloadMessage.MessageHandler.class, LabsFastReloadMessage.class);
+ registerMessage(8, LabsNoJeiReloadMessage.MessageHandler.class, LabsNoJeiReloadMessage.class);
}
@SuppressWarnings("SameParameterValue")
diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsNoJeiReloadMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsNoJeiReloadMessage.java
new file mode 100644
index 00000000..63cb1bb3
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/network/LabsNoJeiReloadMessage.java
@@ -0,0 +1,29 @@
+package com.nomiceu.nomilabs.network;
+
+import net.minecraft.client.Minecraft;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+import com.cleanroommc.groovyscript.GroovyScript;
+
+import io.netty.buffer.ByteBuf;
+
+public class LabsNoJeiReloadMessage implements IMessage {
+
+ public LabsNoJeiReloadMessage() {}
+
+ @Override
+ public void fromBytes(ByteBuf buf) {}
+
+ @Override
+ public void toBytes(ByteBuf buf) {}
+
+ public static class MessageHandler extends MainThreadMessageHandler {
+
+ @Override
+ protected IMessage executeClient(LabsNoJeiReloadMessage message, MessageContext ctx) {
+ GroovyScript.postScriptRunResult(Minecraft.getMinecraft().player, true, true, true, 0);
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/network/MainThreadMessageHandler.java b/src/main/java/com/nomiceu/nomilabs/network/MainThreadMessageHandler.java
new file mode 100644
index 00000000..60c2ffbf
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/network/MainThreadMessageHandler.java
@@ -0,0 +1,26 @@
+package com.nomiceu.nomilabs.network;
+
+import net.minecraft.util.IThreadListener;
+import net.minecraftforge.fml.common.FMLCommonHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+public abstract class MainThreadMessageHandler
+ implements IMessageHandler {
+
+ protected abstract REPLY executeClient(REQ message, MessageContext ctx);
+
+ @Override
+ public REPLY onMessage(REQ message, MessageContext ctx) {
+ if (!ctx.side.isClient()) return null;
+
+ IThreadListener threadListener = FMLCommonHandler.instance().getWorldThread(ctx.getClientHandler());
+ if (threadListener.isCallingFromMinecraftThread()) {
+ return executeClient(message, ctx);
+ } else {
+ threadListener.addScheduledTask(() -> executeClient(message, ctx));
+ }
+ return null;
+ }
+}