/
BiomeEnterExitScriptEvent.java
130 lines (118 loc) · 4.32 KB
/
BiomeEnterExitScriptEvent.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.denizenscript.denizen.events.player;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.objects.BiomeTag;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import org.bukkit.block.Biome;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
public class BiomeEnterExitScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player enters|exits biome
//
// @Group Player
//
// @Switch biome:<name> to only process the event when a specific biome is being entered.
//
// @Location true
//
// @Warning Cancelling this event will fire a similar event immediately after.
//
// @Cancellable true
//
// @Triggers when a player enters or exits a biome.
//
// @Context
// <context.from> returns the block location moved from.
// <context.to> returns the block location moved to.
// <context.old_biome> returns the biome being left.
// <context.new_biome> returns the biome being entered.
//
// @Player Always.
//
// -->
public BiomeEnterExitScriptEvent() {
instance = this;
registerCouldMatcher("player enters|exits <biome>");
registerSwitches("biome");
}
public static BiomeEnterExitScriptEvent instance;
public LocationTag from;
public LocationTag to;
public BiomeTag old_biome;
public BiomeTag new_biome;
public PlayerMoveEvent event;
@Override
public boolean couldMatch(ScriptPath path) {
if (!super.couldMatch(path)) {
return false;
}
if (!path.eventArgLowerAt(2).equals("biome") && !couldMatchEnum(path.eventArgLowerAt(2), Biome.values())) {
return false;
}
return true;
}
@Override
public boolean matches(ScriptPath path) {
String biome_test = path.eventArgAt(2);
String direction = path.eventArgAt(1);
if (!runInCheck(path, from) && !runInCheck(path, to)) {
return false;
}
BiomeTag biome = direction.equals("enters") ? new_biome : (direction.equals("exits") ? old_biome : null);
if (biome == null) {
return false;
}
if (!biome_test.equals("biome") && !biome_test.equals(CoreUtilities.toLowerCase(biome.getBiome().getName()))) {
return false;
}
if (!runGenericSwitchCheck(path, "biome", biome.getBiome().getName())) {
return false;
}
return super.matches(path);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(EntityTag.getPlayerFrom(event.getPlayer()), null);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "to":
return to;
case "from":
return from;
case "old_biome":
return old_biome;
case "new_biome":
return new_biome;
}
return super.getContext(name);
}
@EventHandler
public void onPlayerEntersExitsBiome(PlayerMoveEvent event) {
if (LocationTag.isSameBlock(event.getFrom(), event.getTo())) {
return;
}
if (!Utilities.isLocationYSafe(event.getFrom()) || !Utilities.isLocationYSafe(event.getTo())) {
return;
}
from = new LocationTag(event.getFrom());
to = new LocationTag(event.getTo());
old_biome = new BiomeTag(NMSHandler.instance.getBiomeAt(from.getBlock()));
new_biome = new BiomeTag(NMSHandler.instance.getBiomeAt(to.getBlock()));
if (old_biome.identify().equals(new_biome.identify())) {
return;
}
this.event = event;
fire(event);
}
}