/
ChunkLoadEntitiesScriptEvent.java
89 lines (80 loc) · 2.81 KB
/
ChunkLoadEntitiesScriptEvent.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.denizenscript.denizen.events.world;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ChunkTag;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.EntitiesLoadEvent;
public class ChunkLoadEntitiesScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// chunk loads entities
//
// @Group World
//
// @Location true
//
// @Warning This event will fire very rapidly.
//
// @Switch entity_type:<type-matcher> to only fire in the chunk contains an entity that matches the given entity matcher.
// @Switch include_empty:<true/false> defaults to false, set to 'true' to include chunks loading an empty set of entities.
//
// @Triggers when a chunk loads in its entities.
//
// @Context
// <context.chunk> returns the loading chunk.
// <context.entities> returns a ListTag of all entities to be loaded.
//
// -->
public ChunkLoadEntitiesScriptEvent() {
registerCouldMatcher("chunk loads entities");
registerSwitches("entity_type", "include_empty");
}
public ChunkTag chunk;
public EntitiesLoadEvent event;
@Override
public boolean matches(ScriptPath path) {
if (path.checkSwitch("include_empty", "false") && event.getEntities().isEmpty()) {
return false;
}
if (!runInCheck(path, chunk.getCenter())) {
return false;
}
String typeMatch = path.switches.get("entity_type");
if (typeMatch != null) {
boolean any = false;
for (Entity e : event.getEntities()) {
any = new EntityTag(e).tryAdvancedMatcher(typeMatch);
if (any) {
break;
}
}
if (!any) {
return false;
}
}
return super.matches(path);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "chunk": return chunk;
case "entities":
ListTag entList = new ListTag();
for (Entity e : event.getEntities()) {
entList.addObject(new EntityTag(e));
}
return entList;
}
return super.getContext(name);
}
@EventHandler
public void onChunkLoad(EntitiesLoadEvent event) {
chunk = new ChunkTag(event.getChunk());
this.event = event;
fire(event);
}
}