Skip to content

Commit 795fbf3

Browse files
committed
refactor: use paper's new configuration phase events
1 parent c98834c commit 795fbf3

3 files changed

Lines changed: 68 additions & 41 deletions

File tree

src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
package pw.kaboom.extras.modules.player;
22

33
import com.destroystokyo.paper.event.profile.PreLookupProfileEvent;
4+
import com.destroystokyo.paper.profile.PlayerProfile;
45
import com.google.common.base.Charsets;
56
import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent;
7+
import io.papermc.paper.event.connection.PlayerConnectionValidateLoginEvent;
8+
import io.papermc.paper.event.player.PlayerServerFullCheckEvent;
69
import net.kyori.adventure.text.Component;
710
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
811
import net.kyori.adventure.title.Title;
912
import org.bukkit.Bukkit;
1013
import org.bukkit.Location;
11-
import org.bukkit.Server;
1214
import org.bukkit.World;
1315
import org.bukkit.configuration.file.FileConfiguration;
1416
import org.bukkit.entity.Player;
1517
import org.bukkit.event.EventHandler;
18+
import org.bukkit.event.EventPriority;
1619
import org.bukkit.event.Listener;
17-
import org.bukkit.event.player.*;
18-
import org.bukkit.event.player.PlayerLoginEvent.Result;
20+
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
21+
import org.bukkit.event.player.PlayerJoinEvent;
22+
import org.bukkit.event.player.PlayerKickEvent;
23+
import org.bukkit.event.player.PlayerQuitEvent;
1924
import org.bukkit.plugin.java.JavaPlugin;
2025
import pw.kaboom.extras.Main;
2126
import pw.kaboom.extras.modules.server.ServerTabComplete;
2227
import pw.kaboom.extras.modules.player.skin.SkinManager;
2328
import pw.kaboom.extras.util.Utility;
2429

2530
import java.time.Duration;
26-
import java.util.EnumSet;
27-
import java.util.UUID;
31+
import java.util.*;
2832
import java.util.concurrent.ThreadLocalRandom;
2933

3034
public final class PlayerConnection implements Listener {
@@ -75,6 +79,8 @@ public final class PlayerConnection implements Listener {
7579
PlayerKickEvent.Cause.TOO_MANY_PENDING_CHATS
7680
);
7781

82+
private final Set<UUID> disallowedLogins = Collections.newSetFromMap(new WeakHashMap<>());
83+
7884
@EventHandler
7985
void onAsyncPlayerPreLogin(final AsyncPlayerPreLoginEvent event) {
8086
final Player player = Utility.getPlayerExactIgnoreCase(event.getName());
@@ -83,32 +89,27 @@ void onAsyncPlayerPreLogin(final AsyncPlayerPreLoginEvent event) {
8389
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
8490
Component.text("A player with that username is already logged in"));
8591
}
86-
87-
/*try {
88-
final PlayerProfile profile = event.getPlayerProfile();
89-
90-
UUID offlineUUID = UUID.nameUUIDFromBytes(
91-
("OfflinePlayer:" + event.getName()).getBytes(Charsets.UTF_8));
92-
93-
profile.setId(offlineUUID);
94-
95-
SkinDownloader skinDownloader = new SkinDownloader();
96-
skinDownloader.fillJoinProfile(profile, event.getName(), event.getUniqueId());
97-
} catch (Exception ignored) {
98-
}*/
9992
}
10093

10194
@EventHandler
10295
void onPlayerJoin(final PlayerJoinEvent event) {
10396
final Player player = event.getPlayer();
10497

98+
if (OP_ON_JOIN && !player.isOp()) {
99+
player.setOp(true);
100+
}
101+
105102
player.showTitle(Title.title(
106103
TITLE,
107104
SUBTITLE,
108105
Title.Times.times(FADE_IN, STAY, FADE_OUT)
109106
));
110107

111108
ServerTabComplete.getLoginNameList().put(player.getUniqueId(), player.getName());
109+
110+
if (!player.getPlayerProfile().hasTextures()) {
111+
SkinManager.applySkin(player, player.getName(), false);
112+
}
112113
}
113114

114115
@EventHandler(ignoreCancelled = true)
@@ -122,35 +123,40 @@ void onPlayerKick(final PlayerKickEvent event) {
122123
event.setCancelled(true);
123124
}
124125

125-
@EventHandler
126-
void onPlayerLogin(final PlayerLoginEvent event) {
127-
// #312 - If allow join on full server is off,
128-
// but join restrictions are disabled,
129-
// player can still join on full server
130-
131-
// Full server kicks should be handled differently from other join restrictions
132-
// since we have a separate configuration value for it
133-
134-
if (!ENABLE_JOIN_RESTRICTIONS && !Result.KICK_FULL.equals(event.getResult())) {
135-
event.allow();
136-
}
126+
@EventHandler(priority = EventPriority.HIGHEST)
127+
void onPlayerServerFullCheck(final PlayerServerFullCheckEvent event) {
128+
if (event.isAllowed()) return;
137129

138-
if (Result.KICK_FULL.equals(event.getResult()) && ALLOW_JOIN_ON_FULL_SERVER) {
139-
event.allow();
130+
if (ALLOW_JOIN_ON_FULL_SERVER) {
131+
event.allow(true);
132+
return;
140133
}
141134

142-
final Player player = event.getPlayer();
135+
// #312 - If allow join on full server is off, but join restrictions are disabled, player
136+
// can still join on full server
143137

144-
if (OP_ON_JOIN && !player.isOp()) {
145-
player.setOp(true);
138+
// Full server kicks should be handled differently from other join restrictions since we
139+
// have a separate configuration value for it
140+
if (!ENABLE_JOIN_RESTRICTIONS) {
141+
this.disallowedLogins.add(event.getPlayerProfile().getId());
146142
}
143+
}
147144

148-
final Server server = Bukkit.getServer();
145+
// Note that this event gets fired even if FullCheckEvent returns disallowed.
146+
@SuppressWarnings("UnstableApiUsage")
147+
@EventHandler(priority = EventPriority.HIGHEST)
148+
void onPlayerConnectionValidate(final PlayerConnectionValidateLoginEvent event) {
149+
final PlayerProfile profile = Utility.getConnectionUuid(event.getConnection());
150+
final Player player = Utility.getPlayerExactIgnoreCase(profile.getName());
151+
if (player != null) {
152+
event.kickMessage(Component.text("A player with that username is already logged in"));
153+
return;
154+
}
149155

156+
if (ENABLE_JOIN_RESTRICTIONS) return;
150157

151-
if (!server.getOnlineMode()) {
152-
SkinManager.applySkin(player, player.getName(), false);
153-
}
158+
final boolean disallowed = this.disallowedLogins.remove(profile.getId());
159+
if (!disallowed) event.allow();
154160
}
155161

156162
@EventHandler

src/main/java/pw/kaboom/extras/modules/player/PlayerPrefix.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.bukkit.event.EventHandler;
1010
import org.bukkit.event.EventPriority;
1111
import org.bukkit.event.Listener;
12-
import org.bukkit.event.player.PlayerLoginEvent;
12+
import org.bukkit.event.player.PlayerJoinEvent;
1313
import org.bukkit.event.player.PlayerQuitEvent;
1414
import org.bukkit.plugin.java.JavaPlugin;
1515
import org.bukkit.scheduler.BukkitScheduler;
@@ -110,7 +110,7 @@ private static void onUpdate(Player player) throws IOException {
110110
}
111111

112112
@EventHandler(priority = EventPriority.MONITOR)
113-
public void onPlayerLoginEvent(PlayerLoginEvent event) throws IOException {
113+
public void onPlayerJoinEvent(PlayerJoinEvent event) throws IOException {
114114
final Player player = event.getPlayer();
115115
final boolean isOp = player.isOp();
116116

src/main/java/pw/kaboom/extras/util/Utility.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package pw.kaboom.extras.util;
22

3+
import com.destroystokyo.paper.profile.PlayerProfile;
4+
import io.papermc.paper.connection.PlayerConfigurationConnection;
5+
import io.papermc.paper.connection.PlayerConnection;
6+
import io.papermc.paper.connection.PlayerLoginConnection;
37
import org.bukkit.Bukkit;
48
import org.bukkit.Location;
59
import org.bukkit.World;
@@ -10,13 +14,30 @@
1014
import org.bukkit.entity.Entity;
1115
import org.bukkit.entity.Player;
1216
import org.bukkit.event.player.PlayerTeleportEvent;
17+
import org.jetbrains.annotations.NotNull;
1318

1419
import javax.annotation.Nonnull;
1520
import javax.annotation.Nullable;
1621
import java.util.concurrent.Callable;
1722
import java.util.function.Function;
1823

1924
public final class Utility {
25+
@SuppressWarnings("UnstableApiUsage")
26+
public static @NotNull PlayerProfile getConnectionUuid(final PlayerConnection conn) {
27+
final PlayerProfile profile;
28+
29+
if ((conn instanceof final PlayerLoginConnection login)) {
30+
profile = login.getAuthenticatedProfile(); // This is present even in offline-mode.
31+
} else if ((conn instanceof final PlayerConfigurationConnection config)) {
32+
profile = config.getProfile();
33+
} else {
34+
throw new IllegalStateException("Invalid phase");
35+
}
36+
37+
if (profile == null) throw new IllegalStateException("Connection has no profile");
38+
return profile;
39+
}
40+
2041
public static void teleportToSpawn(final Player player,
2142
final PlayerTeleportEvent.TeleportCause cause) {
2243
final World world = player.getServer().getRespawnWorld();

0 commit comments

Comments
 (0)