Skip to content

Commit

Permalink
Transistion to JS for partial scripting. Untested. 'Should' work.
Browse files Browse the repository at this point in the history
  • Loading branch information
winsock committed Mar 24, 2015
1 parent 129ee3f commit b3c93d6
Show file tree
Hide file tree
Showing 13 changed files with 321 additions and 60 deletions.
1 change: 1 addition & 0 deletions build.gradle
Expand Up @@ -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")) {
Expand Down
4 changes: 2 additions & 2 deletions 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
13 changes: 13 additions & 0 deletions 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;
}
57 changes: 57 additions & 0 deletions 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");
}
}
}
@@ -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) {
}
}
}
53 changes: 53 additions & 0 deletions 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.");
}
}
}
42 changes: 12 additions & 30 deletions src/main/java/mods/quiddity/redux/ReduxCommandBlockTileEntity.java
Expand Up @@ -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.
Expand All @@ -45,22 +27,22 @@ public class ReduxCommandBlockTileEntity extends TileEntity {
protected CommandResultStats.Type lastResultType = CommandResultStats.Type.SUCCESS_COUNT;
protected int lastResultAmount = 0;

protected final Set<ReduxBlockEventReceiver> eventReceivers = new HashSet<ReduxBlockEventReceiver>();
/* protected final Set<ReduxBlockEventReceiver> eventReceivers = new HashSet<ReduxBlockEventReceiver>();
protected final Map<Trigger.TriggerEvent, Set<ReduxBlockEventReceiver>> specialReceivers = new HashMap<Trigger.TriggerEvent, Set<ReduxBlockEventReceiver>>();
protected final Map<String, String> reduxVariables = new HashMap<String, String>();
protected final Stack<Integer> commandResultStack = new Stack<Integer>();
protected final Stack<Integer> commandResultStack = new Stack<Integer>();*/

public ReduxCommandBlockTileEntity() {}

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<ReduxBlockEventReceiver>());
specialReceivers.get(event).add(receiver);
}
}*/

public void init(String packId, Block reduxBlock) {
this.packId = packId;
Expand All @@ -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) {
Expand All @@ -89,7 +71,7 @@ private void setupTriggers() {
} else {
addSpecialEventReceiver(trigger.getTriggerEvent(), receiver);
}
}
}*/
}

/**
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -386,7 +368,7 @@ public void receiveEvent(Event event) {
icommandmanager.executeCommand(this, parsedCommand);
}
}
}
}*/

protected static boolean isNumeric(String str) {
NumberFormat formatter = NumberFormat.getInstance();
Expand Down

0 comments on commit b3c93d6

Please sign in to comment.