mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-17 17:34:39 +01:00
Fix Lua require, Fix monster abilities & Fix ServerLuaCall
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user