diff --git a/build.gradle b/build.gradle index 0572032..ef7f8ec 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,7 @@ buildscript { } apply plugin: 'forge' +apply plugin: 'idea' version = "dev-" + System.getenv('BUILD_NUMBER') if (System.getenv('RELEASE') != null && System.getenv('RELEASE').equalsIgnoreCase("true")) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 678d9d8..2083ba8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 02 15:54:47 CDT 2014 +#Mon Mar 23 19:11:26 CDT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-all.zip diff --git a/src/main/java/mods/quiddity/redux/JavaScript/JavascriptEngine.java b/src/main/java/mods/quiddity/redux/JavaScript/JavascriptEngine.java new file mode 100644 index 0000000..4b92e26 --- /dev/null +++ b/src/main/java/mods/quiddity/redux/JavaScript/JavascriptEngine.java @@ -0,0 +1,13 @@ +package mods.quiddity.redux.JavaScript; + +import javax.script.ScriptException; + +public interface JavascriptEngine { + public void init(); + public void loadScript(String script) throws ScriptException; + public void killEngine(); + public void restartEngine(); + public void addJavaObject(String name, Object object); + public boolean hasMethod(String name); + public void callMethod(String name, Object... args) throws ScriptException, NoSuchMethodException; +} diff --git a/src/main/java/mods/quiddity/redux/JavaScript/NashornEngine.java b/src/main/java/mods/quiddity/redux/JavaScript/NashornEngine.java new file mode 100644 index 0000000..3fd8090 --- /dev/null +++ b/src/main/java/mods/quiddity/redux/JavaScript/NashornEngine.java @@ -0,0 +1,57 @@ +package mods.quiddity.redux.JavaScript; + +import jdk.nashorn.api.scripting.ClassFilter; +import jdk.nashorn.api.scripting.NashornScriptEngine; +import jdk.nashorn.api.scripting.NashornScriptEngineFactory; + +import javax.script.ScriptException; + +public class NashornEngine implements JavascriptEngine { + private NashornScriptEngine nashornScriptEngine; + + @Override + public void init() { + if (nashornScriptEngine != null) + killEngine(); + ClassLoader ccl = Thread.currentThread().getContextClassLoader(); + ccl = (ccl == null ? NashornScriptEngineFactory.class.getClassLoader() : ccl); + nashornScriptEngine = (NashornScriptEngine) new NashornScriptEngineFactory().getScriptEngine(new String[]{"--no-java"}, ccl, new ReduxClassFilter()); + } + + @Override + public void loadScript(String script) throws ScriptException { + nashornScriptEngine.eval(script); + } + + @Override + public void killEngine() { + nashornScriptEngine = null; + } + + @Override + public void restartEngine() { + init(); + } + + @Override + public void addJavaObject(String name, Object object) { + nashornScriptEngine.put(name, object); + } + + @Override + public boolean hasMethod(String name) { + return nashornScriptEngine.get(name) != null; + } + + @Override + public void callMethod(String name, Object... args) throws ScriptException, NoSuchMethodException { + nashornScriptEngine.invokeFunction(name, args); + } + + class ReduxClassFilter implements ClassFilter { + @Override + public boolean exposeToScripts(String s) { + return s.contentEquals("mods.quiddity.redux.Javascript.ReduxJavascriptEngine.ReduxAPI"); + } + } +} diff --git a/src/main/java/mods/quiddity/redux/JavaScript/ReduxJavascriptEngine.java b/src/main/java/mods/quiddity/redux/JavaScript/ReduxJavascriptEngine.java new file mode 100644 index 0000000..5fef560 --- /dev/null +++ b/src/main/java/mods/quiddity/redux/JavaScript/ReduxJavascriptEngine.java @@ -0,0 +1,100 @@ +package mods.quiddity.redux.JavaScript; + +import mods.quiddity.redux.json.model.Pack; +import net.minecraft.command.CommandResultStats; +import net.minecraft.entity.Entity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import org.apache.commons.lang3.StringUtils; + +import net.minecraft.command.ICommandManager; +import net.minecraft.command.ICommandSender; +import net.minecraftforge.fml.common.FMLCommonHandler; + +import javax.script.ScriptEngineManager; + +public class ReduxJavascriptEngine { + public static final ScriptEngineManager engineManager = new ScriptEngineManager(); + private JavascriptEngine engine; + private final Pack packRefrence; + + public ReduxJavascriptEngine(Pack pack) { + if (engineManager.getEngineByName("nashorn") != null) { + engine = new NashornEngine(); + } else if (engineManager.getEngineByName("rhino") != null) { + engine = new RhinoEngine(); + } else { + throw new AssertionError("Your Java Runtime Environment does not support JSR-223"); + } + + engine.addJavaObject("ReduxAPI", new ReduxAPI()); + + this.packRefrence = pack; + } + + public JavascriptEngine getEngine() { + return engine; + } + + public class ReduxAPI implements ICommandSender { + @SuppressWarnings("unused") + public int runCommand(String... args) { + if (FMLCommonHandler.instance().getSide().isServer()) { + ICommandManager manager = FMLCommonHandler.instance().getMinecraftServerInstance().getCommandManager(); + manager.executeCommand(this, StringUtils.join(args)); + } + return 0; + } + + @Override + public String getName() { + return packRefrence.getName(); + } + + @Override + public IChatComponent getDisplayName() { + return new ChatComponentText(packRefrence.getName()); + } + + @Override + public void addChatMessage(IChatComponent message) { + } + + @Override + public boolean canUseCommand(int permLevel, String commandName) { + return permLevel <= 2; + } + + @Override + public BlockPos getPosition() { + return null; + } + + @Override + public Vec3 getPositionVector() { + return new Vec3(0, 0, 0); + } + + @Override + public World getEntityWorld() { + return null; + } + + @Override + public Entity getCommandSenderEntity() { + return null; + } + + @Override + public boolean sendCommandFeedback() { + return false; + } + + @Override + public void setCommandStat(CommandResultStats.Type type, int amount) { + } + } +} diff --git a/src/main/java/mods/quiddity/redux/JavaScript/RhinoEngine.java b/src/main/java/mods/quiddity/redux/JavaScript/RhinoEngine.java new file mode 100644 index 0000000..91ab1a5 --- /dev/null +++ b/src/main/java/mods/quiddity/redux/JavaScript/RhinoEngine.java @@ -0,0 +1,53 @@ +package mods.quiddity.redux.JavaScript; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +public class RhinoEngine implements JavascriptEngine { + private ScriptEngine rhinoEngine; + + @Override + public void init() { + if (rhinoEngine != null) + killEngine(); + rhinoEngine = ReduxJavascriptEngine.engineManager.getEngineByName("rhino"); + if (rhinoEngine == null) + throw new AssertionError("Error making the Rhino Engine!"); + } + + @Override + public void loadScript(final String script) throws ScriptException { + rhinoEngine.eval(script); + } + + @Override + public void killEngine() { + rhinoEngine = null; + } + + @Override + public void restartEngine() { + init(); + } + + @Override + public void addJavaObject(String name, Object object) { + rhinoEngine.put(name, object); + } + + @Override + public boolean hasMethod(String name) { + return rhinoEngine.get(name) != null; + } + + @Override + public void callMethod(String name, Object... args) throws ScriptException, NoSuchMethodException { + if (rhinoEngine instanceof Invocable) { + Invocable invokableEngine = (Invocable) rhinoEngine; + invokableEngine.invokeFunction(name, args); + } else { + throw new AssertionError("Your Rhino engine cannot invoke javascript functions! Redux will not function."); + } + } +} diff --git a/src/main/java/mods/quiddity/redux/ReduxCommandBlockTileEntity.java b/src/main/java/mods/quiddity/redux/ReduxCommandBlockTileEntity.java index ce3fceb..c7d085c 100644 --- a/src/main/java/mods/quiddity/redux/ReduxCommandBlockTileEntity.java +++ b/src/main/java/mods/quiddity/redux/ReduxCommandBlockTileEntity.java @@ -3,32 +3,14 @@ import mods.quiddity.redux.json.model.Block; import mods.quiddity.redux.json.model.Pack; import mods.quiddity.redux.json.model.Trigger; -import net.minecraft.block.state.IBlockState; import net.minecraft.command.CommandResultStats; -import net.minecraft.command.ICommandManager; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.world.World; -import net.minecraftforge.event.ServerChatEvent; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.event.world.ChunkWatchEvent; -import net.minecraftforge.event.world.ExplosionEvent; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.eventhandler.Event; import java.text.NumberFormat; import java.text.ParsePosition; -import java.util.*; -import java.util.regex.MatchResult; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * The tile entity for Redux Pack blocks that have custom command scripts. @@ -45,10 +27,10 @@ public class ReduxCommandBlockTileEntity extends TileEntity { protected CommandResultStats.Type lastResultType = CommandResultStats.Type.SUCCESS_COUNT; protected int lastResultAmount = 0; - protected final Set eventReceivers = new HashSet(); +/* protected final Set eventReceivers = new HashSet(); protected final Map> specialReceivers = new HashMap>(); protected final Map reduxVariables = new HashMap(); - protected final Stack commandResultStack = new Stack(); + protected final Stack commandResultStack = new Stack();*/ public ReduxCommandBlockTileEntity() {} @@ -56,11 +38,11 @@ public int getLastSuccessCount() { return lastSuccessCount; } - public void addSpecialEventReceiver(Trigger.TriggerEvent event, ReduxBlockEventReceiver receiver) { +/* public void addSpecialEventReceiver(Trigger.TriggerEvent event, ReduxBlockEventReceiver receiver) { if (!specialReceivers.containsKey(event)) specialReceivers.put(event, new HashSet()); specialReceivers.get(event).add(receiver); - } + }*/ public void init(String packId, Block reduxBlock) { this.packId = packId; @@ -74,13 +56,13 @@ public void setupTileEntity(String blockId) { reduxBlock = p.getBlockFromId(blockId); if (reduxBlock == null) throw new AssertionError(); - specialReceivers.clear(); - eventReceivers.clear(); +/* specialReceivers.clear(); + eventReceivers.clear();*/ setupTriggers(); } private void setupTriggers() { - for (Trigger trigger : reduxBlock.getScript()) { + /*for (Trigger trigger : reduxBlock.getScript()) { // We have to keep a local strong reference. Otherwise GC would remove our event receiver right away. ReduxBlockEventReceiver receiver = new ReduxBlockEventReceiver(trigger); if (trigger.getTriggerEvent().getForgeEventClass() != Event.class) { @@ -89,7 +71,7 @@ private void setupTriggers() { } else { addSpecialEventReceiver(trigger.getTriggerEvent(), receiver); } - } + }*/ } /** @@ -99,13 +81,13 @@ private void setupTriggers() { * @return Were any receiversCalled */ public boolean triggerSpecialEvent(Trigger.TriggerEvent event, Object... args) { - if (specialReceivers.containsKey(event)) { + /*if (specialReceivers.containsKey(event)) { lastEventArgs = args; for (ReduxBlockEventReceiver eventReceiver : specialReceivers.get(event)) { eventReceiver.receiveEvent(null); } return true; - } + }*/ return false; } @@ -133,7 +115,7 @@ public Packet getDescriptionPacket() { return new S35PacketUpdateTileEntity(this.pos, 0, nbttagcompound); } - protected class ReduxBlockEventReceiver implements ICommandSender { + /*protected class ReduxBlockEventReceiver implements ICommandSender { private final Trigger triggerScript; protected Event lastEvent = null; @@ -386,7 +368,7 @@ public void receiveEvent(Event event) { icommandmanager.executeCommand(this, parsedCommand); } } - } + }*/ protected static boolean isNumeric(String str) { NumberFormat formatter = NumberFormat.getInstance(); diff --git a/src/main/java/mods/quiddity/redux/ReduxCommands.java b/src/main/java/mods/quiddity/redux/ReduxCommands.java index 0624a7f..fb336fa 100644 --- a/src/main/java/mods/quiddity/redux/ReduxCommands.java +++ b/src/main/java/mods/quiddity/redux/ReduxCommands.java @@ -2,8 +2,6 @@ import com.google.common.collect.ImmutableList; import mods.quiddity.redux.json.model.Trigger; -import net.minecraft.block.properties.PropertyInteger; -import net.minecraft.block.state.IBlockState; import net.minecraft.command.*; import net.minecraft.util.ChatComponentText; @@ -27,7 +25,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { try { Trigger.TriggerEvent event = Trigger.TriggerEvent.valueOf(trigger); if (event != null) { - if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { + /*if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { ReduxCommandBlockTileEntity.ReduxBlockEventReceiver reduxBlockEventReceiver = (ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) sender; if (Trigger.TriggerEvent.getTriggerEventFromForgeEvent(reduxBlockEventReceiver.getLastEvent().getClass()) == event) { @@ -35,7 +33,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { } } else { throw new CommandException("This command is only useful in Redux Pack Blocks"); - } + }*/ } } catch (IllegalArgumentException ignored) { throw new CommandException("Trigger type %s does not exist!", trigger); @@ -56,7 +54,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { throw new CommandException("Second parameter must be an integer!"); } - if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { + /*if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { ReduxCommandBlockTileEntity.ReduxBlockEventReceiver reduxBlockEventReceiver = (ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) sender; IBlockState blockState = sender.getEntityWorld().getBlockState(reduxBlockEventReceiver.getPosition()); if (blockState.getBlock() instanceof ReduxBlock) { @@ -69,7 +67,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { } } else { throw new CommandException("This command is only useful in Redux Pack Blocks"); - } + }*/ throw new CommandException("failure"); // I HATE YOU MOJANG!!!! DON'T USE EXCEPTIONS AS LOGIC!!! } }); @@ -86,7 +84,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { throw new CommandException("Second parameter must be an integer!"); } - if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { + /*if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { ReduxCommandBlockTileEntity.ReduxBlockEventReceiver reduxBlockEventReceiver = (ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) sender; IBlockState blockState = sender.getEntityWorld().getBlockState(reduxBlockEventReceiver.getPosition()); if (blockState.getBlock() instanceof ReduxBlock) { @@ -100,7 +98,7 @@ public void run(ICommandSender sender, String... args) throws CommandException { } } else { throw new CommandException("This command is only useful in Redux Pack Blocks"); - } + }*/ throw new CommandException("failure"); // I HATE YOU MOJANG!!!! DON'T USE EXCEPTIONS AS LOGIC!!! } }); @@ -143,10 +141,10 @@ public void run(ICommandSender sender, String... args) throws CommandException { } } sender.addChatMessage(new ChatComponentText(String.valueOf(result))); - if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { +/* if (sender instanceof ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) { ReduxCommandBlockTileEntity.ReduxBlockEventReceiver eventReceiver = (ReduxCommandBlockTileEntity.ReduxBlockEventReceiver) sender; eventReceiver.setLastTest(result); - } + }*/ if (result == 0) throw new CommandException("failure"); // I HATE YOU MOJANG!!!! DON'T USE EXCEPTIONS AS LOGIC!!! } diff --git a/src/main/java/mods/quiddity/redux/ReduxEventDispatcher.java b/src/main/java/mods/quiddity/redux/ReduxEventDispatcher.java index 458a0a2..5e1b8b3 100644 --- a/src/main/java/mods/quiddity/redux/ReduxEventDispatcher.java +++ b/src/main/java/mods/quiddity/redux/ReduxEventDispatcher.java @@ -1,16 +1,12 @@ package mods.quiddity.redux; -import com.google.common.collect.ImmutableList; -import mods.quiddity.redux.json.model.Trigger; +import mods.quiddity.redux.json.model.Pack; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; +import javax.script.ScriptException; /** * WeakReference event dispatcher. This handles firing all of the events for Redux blocks. @@ -21,8 +17,8 @@ public class ReduxEventDispatcher { private static ReduxEventDispatcher ourInstance = null; - private final Map>> eventListMap - = new WeakHashMap>>(); +/* private final Map>> eventListMap + = new WeakHashMap>>();*/ public static ReduxEventDispatcher getInstance() { if (ourInstance == null) @@ -34,15 +30,17 @@ private ReduxEventDispatcher() { MinecraftForge.EVENT_BUS.register(this); } +/* public void registerEventReceiver(ReduxCommandBlockTileEntity.ReduxBlockEventReceiver receiver) { if (eventListMap.get(receiver.getTriggerScript().getTriggerEvent()) == null) eventListMap.put(receiver.getTriggerScript().getTriggerEvent(), new ArrayList>()); eventListMap.get(receiver.getTriggerScript().getTriggerEvent()).add(new WeakReference(receiver)); } +*/ @SubscribeEvent public void onEvent(Event event) { - if (eventListMap.get(Trigger.TriggerEvent.getTriggerEventFromForgeEvent(event.getClass())) != null) { +/* if (eventListMap.get(Trigger.TriggerEvent.getTriggerEventFromForgeEvent(event.getClass())) != null) { List> weakReferences = ImmutableList.copyOf(eventListMap.get(Trigger.TriggerEvent.getTriggerEventFromForgeEvent(event.getClass()))); for (WeakReference eventReceiverWeakReference : weakReferences) { @@ -53,6 +51,19 @@ public void onEvent(Event event) { } eventReceiver.receiveEvent(event); } + }*/ + if (FMLCommonHandler.instance().getSide().isServer()) { + for (Pack p : Redux.instance.getReduxConfiguration().getPacks()) { + if (p.getJsEngine().getEngine().hasMethod(event.getClass().getName())) { + try { + p.getJsEngine().getEngine().callMethod(event.getClass().getName(), event); + } catch (ScriptException e) { + Redux.instance.getLogger().warn("Redux pack inconsistency. A script file in pack: %s has errors.", p.getName()); + } catch (NoSuchMethodException e) { + Redux.instance.getLogger().warn("Redux pack inconsistency. A script file in pack: %s has errors.", p.getName()); + } + } + } } } } diff --git a/src/main/java/mods/quiddity/redux/json/model/Config.java b/src/main/java/mods/quiddity/redux/json/model/Config.java index cd1d60c..c0941ac 100644 --- a/src/main/java/mods/quiddity/redux/json/model/Config.java +++ b/src/main/java/mods/quiddity/redux/json/model/Config.java @@ -3,11 +3,11 @@ import com.google.common.collect.ImmutableList; import mods.quiddity.redux.Redux; import mods.quiddity.redux.json.JSONSingleton; +import net.minecraftforge.fml.common.FMLCommonHandler; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.logging.log4j.message.FormattedMessage; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; import java.io.InputStreamReader; @@ -79,6 +79,10 @@ public List getPacks() { // File cannot be null if p isn't null packSourceFileMap.put(p, file); idToPack.put(p.getId(), p); + if (FMLCommonHandler.instance().getSide().isServer()) { + // Init JS Engine + p.getJsEngine().getEngine().init(); + } } } return ImmutableList.copyOf(parsedPacks); diff --git a/src/main/java/mods/quiddity/redux/json/model/Pack.java b/src/main/java/mods/quiddity/redux/json/model/Pack.java index 0b8f795..98be9ec 100644 --- a/src/main/java/mods/quiddity/redux/json/model/Pack.java +++ b/src/main/java/mods/quiddity/redux/json/model/Pack.java @@ -1,6 +1,8 @@ package mods.quiddity.redux.json.model; import com.google.common.collect.ImmutableList; +import mods.quiddity.redux.JavaScript.ReduxJavascriptEngine; +import net.minecraftforge.fml.common.FMLCommonHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -66,6 +68,11 @@ public class Pack { private transient Map idMap = null; private transient boolean hasAddedBlocks = false; + private transient final ReduxJavascriptEngine jsEngine; + + public Pack() { + jsEngine = new ReduxJavascriptEngine(this); + } public String getName() { return name; @@ -110,6 +117,12 @@ public String getDescription() { return description; } + public ReduxJavascriptEngine getJsEngine() { + if (FMLCommonHandler.instance().getSide().isClient()) + return null; + return jsEngine; + } + @Override public String toString() { return getName(); diff --git a/src/main/java/mods/quiddity/redux/loader/ReduxPackLoader.java b/src/main/java/mods/quiddity/redux/loader/ReduxPackLoader.java index b79b461..d1a8230 100644 --- a/src/main/java/mods/quiddity/redux/loader/ReduxPackLoader.java +++ b/src/main/java/mods/quiddity/redux/loader/ReduxPackLoader.java @@ -1,12 +1,7 @@ package mods.quiddity.redux.loader; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; import mods.quiddity.redux.Redux; import mods.quiddity.redux.ReduxBlock; -import mods.quiddity.redux.json.JSONSingleton; import mods.quiddity.redux.json.model.Block; import mods.quiddity.redux.json.model.Config; import mods.quiddity.redux.json.model.Pack; @@ -21,7 +16,6 @@ import net.minecraftforge.fml.relauncher.Side; import java.lang.reflect.Method; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; @@ -53,7 +47,7 @@ public void loadPacks() { continue; } - ModContainer packContainer = new ReduxPackModContainer(p, Redux.instance); + ReduxPackModContainer packContainer = new ReduxPackModContainer(p, Redux.instance); FMLCommonHandler.instance().addModToResourcePack(packContainer); children.add(packContainer); if (p.getBlocks() == null) diff --git a/src/main/java/mods/quiddity/redux/loader/ReduxPackModContainer.java b/src/main/java/mods/quiddity/redux/loader/ReduxPackModContainer.java index 4293258..d180e84 100644 --- a/src/main/java/mods/quiddity/redux/loader/ReduxPackModContainer.java +++ b/src/main/java/mods/quiddity/redux/loader/ReduxPackModContainer.java @@ -8,8 +8,16 @@ import net.minecraftforge.fml.common.*; import net.minecraftforge.fml.common.versioning.ArtifactVersion; import net.minecraftforge.fml.common.versioning.VersionRange; +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +import org.apache.commons.compress.archivers.zip.ZipFile; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import javax.script.ScriptException; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; import java.security.cert.Certificate; import java.util.*; @@ -26,6 +34,33 @@ public class ReduxPackModContainer implements ModContainer { public ReduxPackModContainer(Pack reduxPack, Redux redux) { this.packFile = Redux.instance.getReduxConfiguration().getSourceForPack(reduxPack); + if (packFile.isDirectory()) { + File scripts = new File(packFile, "scripts"); + for (File script : FileUtils.listFiles(scripts, new String[]{ ".js" }, true)) { + try { + reduxPack.getJsEngine().getEngine().loadScript(FileUtils.readFileToString(script)); + } catch (Exception e) { + Redux.instance.getLogger().warn("Redux pack inconsistency. The script file: %s has errors.", scripts.getName()); + } + } + } else { + try { + ZipFile packZip = new ZipFile(packFile); + Enumeration entries = packZip.getEntries(); + while (entries.hasMoreElements()) { + ZipArchiveEntry entry = entries.nextElement(); + if (entry.getName().endsWith(".js")) { + InputStream scriptInputStream = packZip.getInputStream(entry); + reduxPack.getJsEngine().getEngine().loadScript(IOUtils.toString(scriptInputStream, Charset.defaultCharset())); + } + } + } catch (IOException e) { + Redux.instance.getLogger().warn("Redux pack inconsistency. The pack file %s has vanished!.", packFile.getName()); + } catch (ScriptException e) { + Redux.instance.getLogger().warn("Redux pack inconsistency. A script file int pack: %s has errors.", packFile.getName()); + } + } + packMetadata = new ModMetadata(); packMetadata.authorList = Lists.newArrayList(reduxPack.getAuthor()); packMetadata.autogenerated = true;