SceneBlock.java 1.86 KB
Newer Older
1
2
package emu.grasscutter.scripts.data;

Akka's avatar
Akka committed
3
4
5
6
7
8
9
10
11
12
import ch.ethz.globis.phtree.PhTree;
import ch.ethz.globis.phtree.v16.PhTree16;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.scripts.SceneIndexManager;
import emu.grasscutter.scripts.ScriptLoader;
import emu.grasscutter.utils.Position;

import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
13
14
import java.util.List;

Akka's avatar
Akka committed
15
import static emu.grasscutter.Configuration.SCRIPT;
16
17
18
19
20

public class SceneBlock {
	public int id;
	public Position max;
	public Position min;
Akka's avatar
Akka committed
21
22

	public int sceneId;
23
	public List<SceneGroup> groups;
Akka's avatar
Akka committed
24
25
26
27
28
29
30
31
32
33
34
35
	public PhTree<SceneGroup> sceneGroupIndex = new PhTree16<>(3);

	private transient boolean loaded; // Not an actual variable in the scripts either

	public boolean isLoaded() {
		return loaded;
	}

	public void setLoaded(boolean loaded) {
		this.loaded = loaded;
	}

36
37
38
39
	public boolean contains(Position pos) {
		return 	pos.getX() <= max.getX() && pos.getX() >= min.getX() &&
				pos.getZ() <= max.getZ() && pos.getZ() >= min.getZ();
	}
Akka's avatar
Akka committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

	public SceneBlock load(int sceneId, Bindings bindings){
		if(loaded){
			return this;
		}
		this.sceneId = sceneId;
		setLoaded(true);

		CompiledScript cs = ScriptLoader.getScriptByPath(
				SCRIPT("Scene/" + sceneId + "/scene" + sceneId + "_block" + id + "." + ScriptLoader.getScriptType()));

		if (cs == null) {
			return null;
		}

		// Eval script
		try {
			cs.eval(bindings);

			// Set groups
			groups = ScriptLoader.getSerializer().toList(SceneGroup.class, bindings.get("groups"));
			groups.forEach(g -> g.block_id = id);
			SceneIndexManager.buildIndex(this.sceneGroupIndex, groups, g -> g.pos.toLongArray());
		} catch (ScriptException e) {
			Grasscutter.getLogger().error("Error loading block " + id + " in scene " + sceneId, e);
		}
		Grasscutter.getLogger().info("scene {} block {} is loaded successfully.", sceneId, id);
		return this;
	}
}