Fix Lua require, Fix monster abilities & Fix ServerLuaCall

This commit is contained in:
KingRainbow44
2023-08-27 02:39:56 -04:00
parent 49c1daede4
commit 1844cb43f7
15 changed files with 303 additions and 165 deletions

View File

@@ -1,14 +1,15 @@
package emu.grasscutter.scripts;
import static emu.grasscutter.utils.FileUtils.getScriptPath;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.scripts.data.controller.EntityController;
import lombok.val;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.val;
import static emu.grasscutter.utils.FileUtils.getScriptPath;
public class EntityControllerScriptManager {
private static final Map<String, EntityController> gadgetController = new ConcurrentHashMap<>();
@@ -30,7 +31,7 @@ public class EntityControllerScriptManager {
if (cs == null) return;
try {
cs.eval(bindings);
ScriptLoader.eval(cs, bindings);
gadgetController.put(controllerName, new EntityController(cs, bindings));
} catch (Throwable e) {
Grasscutter.getLogger().error("Error while loading gadget controller: {}.", fileName);

View File

@@ -472,7 +472,7 @@ public class ScriptLib {
private void printLog(String source, String msg){
var currentGroup = this.currentGroup.getIfExists();
if(currentGroup != null) {
if (currentGroup != null) {
Grasscutter.getLogger().trace("[LUA] {} {} {}", source, currentGroup.id, msg);
} else {
Grasscutter.getLogger().trace("[LUA] {} {}", source, msg);
@@ -782,7 +782,7 @@ public class ScriptLib {
return 1;
}
public LuaTable GetSceneUidList(){
public LuaTable GetSceneUidList() {
logger.warn("[LUA] Call unchecked GetSceneUidList");
//TODO check
var scriptManager = sceneScriptManager.getIfExists();
@@ -966,10 +966,12 @@ public class ScriptLib {
var group = this.getCurrentGroup().get();
// Create a new time axis instance.
scriptManager.initTimeAxis(new SceneTimeAxis(
var timeAxis = new SceneTimeAxis(
scriptManager, group.id,
identifier, delays[0], shouldLoop
));
);
scriptManager.initTimeAxis(timeAxis);
timeAxis.start();
return 0;
}

View File

@@ -1,6 +1,6 @@
package emu.grasscutter.scripts;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.*;
import emu.grasscutter.game.dungeons.challenge.enums.*;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.quest.enums.QuestState;
@@ -8,17 +8,19 @@ import emu.grasscutter.scripts.constants.*;
import emu.grasscutter.scripts.data.SceneMeta;
import emu.grasscutter.scripts.serializer.*;
import emu.grasscutter.utils.FileUtils;
import java.lang.ref.SoftReference;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import javax.script.*;
import lombok.Getter;
import org.luaj.vm2.*;
import org.luaj.vm2.lib.OneArgFunction;
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
import org.luaj.vm2.script.LuajContext;
import javax.script.*;
import java.lang.ref.SoftReference;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
public class ScriptLoader {
private static ScriptEngineManager sm;
@Getter private static ScriptEngine engine;
@@ -32,6 +34,9 @@ public class ScriptLoader {
/** sceneId - SceneMeta */
private static Map<Integer, SoftReference<SceneMeta>> sceneMetaCache = new ConcurrentHashMap<>();
private static final AtomicReference<Bindings> currentBindings
= new AtomicReference<>(null);
public static synchronized void init() throws Exception {
if (sm != null) {
throw new Exception("Script loader already initialized");
@@ -104,25 +109,54 @@ public class ScriptLoader {
}
}
/**
* Performs a smart evaluation.
* This allows for 'require' to work.
*
* @param script The script to evaluate.
* @param bindings The bindings to use.
* @return The result of the evaluation.
*/
public static Object eval(
CompiledScript script,
Bindings bindings)
throws ScriptException {
// Set the current bindings.
currentBindings.set(bindings);
// Evaluate the script.
var result = script.eval(bindings);
// Clear the current bindings.
currentBindings.set(null);
return result;
}
static final class RequireFunction extends OneArgFunction {
@Override
public LuaValue call(LuaValue arg) {
// Resolve the script path.
var scriptName = arg.checkjstring();
var scriptPath = FileUtils.getScriptPath("Common/" + scriptName + ".lua");
var scriptPath = "Common/" + scriptName + ".lua";
// Load & compile the script.
var script = ScriptLoader.getScript(scriptPath.toString());
var script = ScriptLoader.getScript(scriptPath);
if (script == null) {
return LuaValue.NONE;
}
// Append the script to the context.
try {
script.eval();
var bindings = currentBindings.get();
if (bindings != null) {
ScriptLoader.eval(script, bindings);
} else {
script.eval();
}
} catch (Exception exception) {
Grasscutter.getLogger()
.error("Loading script {} failed! - {}", scriptPath, exception.getLocalizedMessage());
if (DebugConstants.LOG_MISSING_LUA_SCRIPTS) {
Grasscutter.getLogger()
.error("Loading script {} failed! - {}", scriptPath, exception.getLocalizedMessage());
}
}
// TODO: What is the proper return value?

View File

@@ -1,19 +1,15 @@
package emu.grasscutter.scripts.data;
import com.github.davidmoten.rtreemulti.RTree;
import com.github.davidmoten.rtreemulti.geometry.Geometry;
import com.github.davidmoten.rtreemulti.geometry.Rectangle;
import com.github.davidmoten.rtreemulti.geometry.*;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.scripts.SceneIndexManager;
import emu.grasscutter.scripts.ScriptLoader;
import emu.grasscutter.scripts.*;
import lombok.*;
import javax.script.*;
import java.util.Map;
import java.util.stream.Collectors;
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@@ -61,7 +57,7 @@ public class SceneBlock {
// Eval script
try {
cs.eval(bindings);
ScriptLoader.eval(cs, bindings);
// Set groups
this.groups =

View File

@@ -3,20 +3,12 @@ package emu.grasscutter.scripts.data;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.scripts.ScriptLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import lombok.*;
import org.luaj.vm2.*;
import javax.script.*;
import java.util.*;
import java.util.stream.Collectors;
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.luaj.vm2.LuaError;
import org.luaj.vm2.LuaValue;
@ToString
@Setter
@@ -105,7 +97,7 @@ public final class SceneGroup {
// Eval script
try {
cs.eval(this.bindings);
ScriptLoader.eval(cs, this.bindings);
// Set
this.monsters =

View File

@@ -3,16 +3,12 @@ package emu.grasscutter.scripts.data;
import com.github.davidmoten.rtreemulti.RTree;
import com.github.davidmoten.rtreemulti.geometry.Geometry;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.scripts.SceneIndexManager;
import emu.grasscutter.scripts.ScriptLoader;
import java.util.List;
import java.util.Map;
import emu.grasscutter.scripts.*;
import lombok.*;
import javax.script.*;
import java.util.*;
import java.util.stream.Collectors;
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@@ -43,7 +39,7 @@ public class SceneMeta {
// Eval script
try {
cs.eval(this.context);
ScriptLoader.eval(cs, this.context);
this.config =
ScriptLoader.getSerializer()