/
PlayerKickedScriptEvent.java
128 lines (115 loc) · 4.43 KB
/
PlayerKickedScriptEvent.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
package com.denizenscript.denizen.events.player;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.BukkitScriptEntryData;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.denizenscript.denizencore.scripts.containers.ScriptContainer;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerKickEvent;
public class PlayerKickedScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player kicked (for flying)
//
// @Regex ^on player kicked( for flying)?$
//
// @Cancellable true
//
// @Triggers when a player is kicked from the server.
//
// @Context
// <context.message> returns an ElementTag of the kick message sent to all players.
// <context.reason> returns an ElementTag of the kick reason.
// <context.flying> returns whether the player is being automatically kicked for flying.
//
// @Determine
// "MESSAGE:" + ElementTag to change the kick message.
// "REASON:" + ElementTag to change the kick reason.
// "FLY_COOLDOWN:" + DurationTag to cancel the automatic fly kick and set its next cooldown.
//
// -->
public PlayerKickedScriptEvent() {
instance = this;
}
public static PlayerKickedScriptEvent instance;
public PlayerTag player;
public ElementTag message;
public ElementTag reason;
public PlayerKickEvent event;
public boolean isFlying() {
return NMSHandler.getInstance().getPlayerHelper().getFlyKickCooldown(player.getPlayerEntity()) == 0;
}
@Override
public boolean couldMatch(ScriptContainer scriptContainer, String s) {
return CoreUtilities.toLowerCase(s).startsWith("player kicked");
}
@Override
public boolean matches(ScriptPath path) {
if (path.eventArgLowerAt(3).equals("flying")) {
return isFlying();
}
return true;
}
@Override
public String getName() {
return "PlayerKicked";
}
@Override
public boolean applyDetermination(ScriptContainer container, String determination) {
String lower = CoreUtilities.toLowerCase(determination);
if (lower.startsWith("message:")) {
message = new ElementTag(lower.substring("message:".length()));
return true;
}
else if (lower.startsWith("reason:")) {
reason = new ElementTag(lower.substring("reason:".length()));
return true;
}
else if (lower.startsWith("fly_cooldown:")) {
DurationTag duration = DurationTag.valueOf(lower.substring("fly_cooldown:".length()));
if (duration != null) {
NMSHandler.getInstance().getPlayerHelper().setFlyKickCooldown(player.getPlayerEntity(), (int) duration.getTicks());
cancelled = true;
return true;
}
}
return super.applyDetermination(container, determination);
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@Override
public ObjectTag getContext(String name) {
if (name.equals("message")) {
return message;
}
else if (name.equals("reason")) {
return reason;
}
else if (name.equals("flying")) {
return new ElementTag(isFlying());
}
return super.getContext(name);
}
@EventHandler
public void onPlayerKicked(PlayerKickEvent event) {
if (EntityTag.isNPC(event.getPlayer())) {
return;
}
player = PlayerTag.mirrorBukkitPlayer(event.getPlayer());
message = new ElementTag(event.getLeaveMessage());
reason = new ElementTag(event.getReason());
this.event = event;
fire(event);
event.setLeaveMessage(message.asString());
event.setReason(reason.asString());
}
}