/
BiomeEnterExitScriptEvent.java
134 lines (119 loc) · 4.21 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
131
132
133
134
package com.denizenscript.denizen.events.player;
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 <biome>
// player exits <biome>
// player enters biome
// player exits biome
//
// @Group Player
//
// @Regex ^on player (enters|exits) [^\s]+$
//
// @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;
}
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 (!path.eventLower.startsWith("player enters") && !path.eventLower.startsWith("player exits")) {
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;
}
return super.matches(path);
}
@Override
public String getName() {
return "BiomeEnterExit";
}
@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(from.getBlock().getBiome());
new_biome = new BiomeTag(to.getBlock().getBiome());
if (old_biome.identify().equals(new_biome.identify())) {
return;
}
this.event = event;
fire(event);
}
}