Move Data, Plugin, Script, Packet access from Strings to Paths (#1839)

* Move Data, Plugin, Script, Packet access from Strings to Paths
- No longer dump default Data files to folder on launch
- Allow Scripts to be loaded from Resources zip
- Lay groundwork for Plugins to be loaded from zip
This commit is contained in:
Luke H-W
2022-10-07 23:01:08 +10:30
committed by GitHub
parent f6ce7e349d
commit dd6e1bb8a3
21 changed files with 242 additions and 244 deletions

View File

@@ -9,6 +9,9 @@ import emu.grasscutter.scripts.constants.ScriptRegionShape;
import emu.grasscutter.scripts.data.SceneMeta;
import emu.grasscutter.scripts.serializer.LuaSerializer;
import emu.grasscutter.scripts.serializer.Serializer;
import emu.grasscutter.utils.FileUtils;
import lombok.Getter;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.OneArgFunction;
@@ -19,6 +22,8 @@ import javax.script.*;
import java.io.File;
import java.io.FileReader;
import java.lang.ref.SoftReference;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
@@ -26,12 +31,11 @@ import java.util.concurrent.ConcurrentHashMap;
public class ScriptLoader {
private static ScriptEngineManager sm;
private static ScriptEngine engine;
@Getter private static ScriptEngine engine;
private static ScriptEngineFactory factory;
private static String fileType;
private static Serializer serializer;
private static ScriptLib scriptLib;
private static LuaValue scriptLibLua;
@Getter private static Serializer serializer;
@Getter private static ScriptLib scriptLib;
@Getter private static LuaValue scriptLibLua;
/**
* suggest GC to remove it if the memory is less
*/
@@ -52,7 +56,6 @@ public class ScriptLoader {
factory = getEngine().getFactory();
// Lua stuff
fileType = "lua";
serializer = new LuaSerializer();
// Set engine to replace require as a temporary fix to missing scripts
@@ -81,26 +84,6 @@ public class ScriptLoader {
ctx.globals.set("ScriptLib", scriptLibLua);
}
public static ScriptEngine getEngine() {
return engine;
}
public static String getScriptType() {
return fileType;
}
public static Serializer getSerializer() {
return serializer;
}
public static ScriptLib getScriptLib() {
return scriptLib;
}
public static LuaValue getScriptLibLua() {
return scriptLibLua;
}
public static <T> Optional<T> tryGet(SoftReference<T> softReference){
try{
return Optional.ofNullable(softReference.get());
@@ -108,6 +91,8 @@ public class ScriptLoader {
return Optional.empty();
}
}
@Deprecated(forRemoval = true)
public static CompiledScript getScriptByPath(String path) {
var sc = tryGet(scriptsCache.get(path));
if (sc.isPresent()) {
@@ -131,6 +116,26 @@ public class ScriptLoader {
}
public static CompiledScript getScript(String path) {
var sc = tryGet(scriptsCache.get(path));
if (sc.isPresent()) {
return sc.get();
}
Grasscutter.getLogger().debug("Loading script " + path);
final Path scriptPath = FileUtils.getScriptPath(path);
if (!Files.exists(scriptPath)) return null;
try {
var script = ((Compilable) getEngine()).compile(Files.newBufferedReader(scriptPath));
scriptsCache.put(path, new SoftReference<>(script));
return script;
} catch (Exception e) {
Grasscutter.getLogger().error("Loading script {} failed!", path, e);
return null;
}
}
public static SceneMeta getSceneMeta(int sceneId) {
return tryGet(sceneMetaCache.get(sceneId)).orElseGet(() -> {
var instance = SceneMeta.of(sceneId);

View File

@@ -14,8 +14,6 @@ import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import static emu.grasscutter.config.Configuration.SCRIPT;
import java.util.Map;
import java.util.stream.Collectors;
@@ -52,8 +50,7 @@ public class SceneBlock {
this.sceneId = sceneId;
this.setLoaded(true);
CompiledScript cs = ScriptLoader.getScriptByPath(
SCRIPT("Scene/" + sceneId + "/scene" + sceneId + "_block" + this.id + "." + ScriptLoader.getScriptType()));
CompiledScript cs = ScriptLoader.getScript("Scene/" + sceneId + "/scene" + sceneId + "_block" + this.id + ".lua");
if (cs == null) {
return null;

View File

@@ -11,8 +11,6 @@ import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import static emu.grasscutter.config.Configuration.SCRIPT;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -84,8 +82,7 @@ public class SceneGroup {
this.bindings = ScriptLoader.getEngine().createBindings();
CompiledScript cs = ScriptLoader.getScriptByPath(
SCRIPT("Scene/" + sceneId + "/scene" + sceneId + "_group" + this.id + "." + ScriptLoader.getScriptType()));
CompiledScript cs = ScriptLoader.getScript("Scene/" + sceneId + "/scene" + sceneId + "_group" + this.id + ".lua");
if (cs == null) {
return this;

View File

@@ -12,8 +12,6 @@ import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import static emu.grasscutter.config.Configuration.SCRIPT;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -35,8 +33,7 @@ public class SceneMeta {
public SceneMeta load(int sceneId) {
// Get compiled script if cached
CompiledScript cs = ScriptLoader.getScriptByPath(
SCRIPT("Scene/" + sceneId + "/scene" + sceneId + "." + ScriptLoader.getScriptType()));
CompiledScript cs = ScriptLoader.getScript("Scene/" + sceneId + "/scene" + sceneId + ".lua");
if (cs == null) {
Grasscutter.getLogger().warn("No script found for scene " + sceneId);