/
VehicleCollisionSmartEvent.java
153 lines (122 loc) · 5.3 KB
/
VehicleCollisionSmartEvent.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package net.aufdemrand.denizen.events.core;
import net.aufdemrand.denizen.scripts.containers.core.BukkitWorldScriptHelper;
import net.aufdemrand.denizencore.events.OldSmartEvent;
import net.aufdemrand.denizen.objects.*;
import net.aufdemrand.denizencore.objects.*;
import net.aufdemrand.denizen.utilities.DenizenAPI;
import net.aufdemrand.denizen.utilities.debugging.dB;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
import org.bukkit.event.vehicle.VehicleEntityCollisionEvent;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VehicleCollisionSmartEvent implements OldSmartEvent, Listener {
///////////////////
// SMARTEVENT METHODS
///////////////
@Override
public boolean shouldInitialize(Set<String> events) {
// Loop through event names from loaded world script events
for (String event : events) {
// TODO: More precise regex
Matcher m = Pattern.compile("on (.+) collides with (.+)", Pattern.CASE_INSENSITIVE)
.matcher(event);
if (m.matches()) {
// TODO: Check input data
return true;
}
}
// No matches at all, so return false.
return false;
}
@Override
public void _initialize() {
// Yay! Your event is in use! Register it here.
DenizenAPI.getCurrentInstance().getServer().getPluginManager()
.registerEvents(this, DenizenAPI.getCurrentInstance());
// Record that you loaded in the debug.
dB.log("Loaded Vehicle Collision SmartEvent.");
}
@Override
public void breakDown() {
// Unregister events or any other temporary links your event created in _intialize()
VehicleBlockCollisionEvent.getHandlerList().unregister(this);
VehicleEntityCollisionEvent.getHandlerList().unregister(this);
}
//////////////
// MECHANICS
///////////
// <--[event]
// @Events
// vehicle collides with block
// vehicle collides with <material>
// <vehicle> collides with block
// <vehicle> collides with <material>
//
// @Triggers when a vehicle collides with a block.
// @Context
// <context.vehicle> returns the dEntity of the vehicle.
// <context.location> returns the dLocation of the block.
//
// -->
@EventHandler
public void vehicleBlockCollision(VehicleBlockCollisionEvent event) {
// Bukkit seems to be triggering collision on air.. let's filter that out.
if (event.getBlock().getType() == Material.AIR) return;
dPlayer player = null;
dNPC npc = null; // TODO: These are always null!
dEntity vehicle = new dEntity(event.getVehicle());
dMaterial material = dMaterial.getMaterialFrom(event.getBlock().getType(), event.getBlock().getData());
Map<String, dObject> context = new HashMap<String, dObject>();
context.put("vehicle", vehicle);
context.put("location", new dLocation(event.getBlock().getLocation()));
List<String> events = new ArrayList<String>();
events.add("vehicle collides with block");
events.add("vehicle collides with " + material.identifySimple());
events.add(vehicle.identifyType() + " collides with block");
events.add(vehicle.identifyType() + " collides with " + material.identifySimple());
BukkitWorldScriptHelper.doEvents(events, npc, player, context, true);
}
// <--[event]
// @Events
// vehicle collides with entity
// vehicle collides with <entity>
// <vehicle> collides with entity
// <vehicle> collides with <entity>
//
// @Triggers when a vehicle collides with an entity.
// @Context
// <context.vehicle> returns the dEntity of the vehicle.
// <context.entity> returns the dEntity of the entity the vehicle has collided with.
//
// @Determine
// "CANCELLED" to stop the collision from happening.
// "NOPICKUP" to stop the vehicle from picking up the entity.
//
// -->
@EventHandler
public void vehicleEntityCollision(VehicleEntityCollisionEvent event) {
dPlayer player = null;
dNPC npc = null;
dEntity vehicle = new dEntity(event.getVehicle());
dEntity entity = new dEntity(event.getEntity());
Map<String, dObject> context = new HashMap<String, dObject>();
context.put("vehicle", vehicle);
context.put("entity", entity.getDenizenObject());
if (entity.isCitizensNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getDenizenPlayer();
List<String> events = new ArrayList<String>();
events.add("vehicle collides with entity");
events.add("vehicle collides with " + entity.identifyType());
events.add(vehicle.identifyType() + " collides with entity");
events.add(vehicle.identifyType() + " collides with " + entity.identifyType());
String determination = BukkitWorldScriptHelper.doEvents(events, npc, player, context, true);
if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);
if (determination.toUpperCase().startsWith("NOPICKUP"))
event.setPickupCancelled(true);
}
}