11package pw .kaboom .extras .modules .player ;
22
33import com .destroystokyo .paper .event .profile .PreLookupProfileEvent ;
4+ import com .destroystokyo .paper .profile .PlayerProfile ;
45import com .google .common .base .Charsets ;
56import io .papermc .paper .event .player .AsyncPlayerSpawnLocationEvent ;
7+ import io .papermc .paper .event .connection .PlayerConnectionValidateLoginEvent ;
8+ import io .papermc .paper .event .player .PlayerServerFullCheckEvent ;
69import net .kyori .adventure .text .Component ;
710import net .kyori .adventure .text .serializer .legacy .LegacyComponentSerializer ;
811import net .kyori .adventure .title .Title ;
912import org .bukkit .Bukkit ;
1013import org .bukkit .Location ;
11- import org .bukkit .Server ;
1214import org .bukkit .World ;
1315import org .bukkit .configuration .file .FileConfiguration ;
1416import org .bukkit .entity .Player ;
1517import org .bukkit .event .EventHandler ;
18+ import org .bukkit .event .EventPriority ;
1619import 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 ;
1924import org .bukkit .plugin .java .JavaPlugin ;
2025import pw .kaboom .extras .Main ;
2126import pw .kaboom .extras .modules .server .ServerTabComplete ;
2227import pw .kaboom .extras .modules .player .skin .SkinManager ;
2328import pw .kaboom .extras .util .Utility ;
2429
2530import java .time .Duration ;
26- import java .util .EnumSet ;
27- import java .util .UUID ;
31+ import java .util .*;
2832import java .util .concurrent .ThreadLocalRandom ;
2933
3034public 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
0 commit comments