Add events to support scene group substitution (#2413)

* Add events to support scene group substitution

* make event members private with getter/setter

* delete stray unused var
This commit is contained in:
longfruit
2023-10-31 18:52:01 -07:00
committed by GitHub
Unverified
parent 269f7b4fbf
commit cf6fb275be
9 changed files with 130 additions and 29 deletions
@@ -5,6 +5,7 @@ import com.github.davidmoten.rtreemulti.geometry.*;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.scripts.*;
import emu.grasscutter.server.event.game.SceneBlockLoadedEvent;
import java.util.Map;
import java.util.stream.Collectors;
import javax.script.*;
@@ -64,6 +65,10 @@ public class SceneBlock {
.collect(Collectors.toMap(x -> x.id, y -> y, (a, b) -> a));
this.groups.values().forEach(g -> g.block_id = this.id);
var event = new SceneBlockLoadedEvent(this);
event.call();
this.sceneGroupIndex =
SceneIndexManager.buildIndex(3, this.groups.values(), g -> g.pos.toPoint());
} catch (ScriptException exception) {
@@ -3,6 +3,7 @@ package emu.grasscutter.scripts.data;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.scripts.ScriptLoader;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import javax.script.*;
@@ -39,6 +40,7 @@ public final class SceneGroup {
private transient boolean loaded;
private transient CompiledScript script;
private transient Bindings bindings;
public String overrideScriptPath;
public static SceneGroup of(int groupId) {
var group = new SceneGroup();
@@ -86,8 +88,12 @@ public final class SceneGroup {
// Create the bindings.
this.bindings = ScriptLoader.getEngine().createBindings();
var cs =
ScriptLoader.getScript("Scene/%s/scene%s_group%s.lua".formatted(sceneId, sceneId, this.id));
CompiledScript cs;
if (overrideScriptPath != null && !overrideScriptPath.equals("")) {
cs = ScriptLoader.getScript(overrideScriptPath, true);
} else {
cs = ScriptLoader.getScript("Scene/%s/scene%s_group%s.lua".formatted(sceneId, sceneId, this.id));
}
if (cs == null) {
return this;