diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java index 28a4f3d6..98b3b353 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java @@ -25,10 +25,12 @@ */ package com.github.games647.fastlogin.bukkit; +import com.comphenix.protocol.ProtocolLibrary; import com.github.games647.fastlogin.bukkit.command.CrackedCommand; import com.github.games647.fastlogin.bukkit.command.PremiumCommand; import com.github.games647.fastlogin.bukkit.listener.ConnectionListener; import com.github.games647.fastlogin.bukkit.listener.PaperCacheListener; +import com.github.games647.fastlogin.bukkit.listener.protocollib.ManualNameChange; import com.github.games647.fastlogin.bukkit.listener.protocollib.ProtocolLibListener; import com.github.games647.fastlogin.bukkit.listener.protocollib.SkinApplyListener; import com.github.games647.fastlogin.bukkit.listener.protocolsupport.ProtocolSupportListener; @@ -116,6 +118,21 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.github.games647.fastlogin.bukkit.listener.protocollib; + +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.github.games647.fastlogin.bukkit.FastLoginBukkit; +import com.github.games647.fastlogin.core.hooks.bedrock.FloodgateService; + +import org.geysermc.floodgate.api.FloodgateApi; + +import static com.comphenix.protocol.PacketType.Login.Client.START; + +/** + * Manually inject Floodgate player name prefixes. + *
+ * This is used as a workaround, because Floodgate fails to inject + * the prefixes when it's used together with ProtocolLib and FastLogin. + *
+ * For more information visit: https://github.com/games647/FastLogin/issues/493 + */ +public class ManualNameChange extends PacketAdapter { + + private final FloodgateService floodgate; + + public ManualNameChange(FastLoginBukkit plugin, FloodgateService floodgate) { + super(params() + .plugin(plugin) + .types(START)); + + this.plugin = plugin; + this.floodgate = floodgate; + } + + @Override + public void onPacketReceiving(PacketEvent packetEvent) { + PacketContainer packet = packetEvent.getPacket(); + WrappedGameProfile originalProfile = packet.getGameProfiles().read(0); + + if (floodgate.getBedrockPlayer(originalProfile.getName()) == null) { + //not a Floodgate player, no need to add a prefix + return; + } + + packet.setMeta("original_name", originalProfile.getName()); + String prefixedName = FloodgateApi.getInstance().getPlayerPrefix() + originalProfile.getName(); + WrappedGameProfile updatedProfile = originalProfile.withName(prefixedName); + packet.getGameProfiles().write(0, updatedProfile); + } +} diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java index 11218623..1cb68105 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java @@ -124,6 +124,12 @@ public class ProtocolLibListener extends PacketAdapter { PacketContainer packet = packetEvent.getPacket(); String username = packet.getGameProfiles().read(0).getName(); + + if (packetEvent.getPacket().getMeta("original_name").isPresent()) { + //username has been injected by ManualNameChange.java + username = (String) packetEvent.getPacket().getMeta("original_name").get(); + } + plugin.getLog().trace("GameProfile {} with {} connecting", sessionKey, username); packetEvent.getAsyncMarker().incrementProcessingDelay(); diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index 8cdcb5d1..c28c0256 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -214,9 +214,8 @@ autoLoginFloodgate: false # # To prevent conflits from two different players having the same name, it is highly recommended to use a 'username-prefix' # in floodgate/config.yml -# Note: 'username-prefix' is currently broken when used with FastLogin and ProtocolLib. For more information visit: -# https://github.com/games647/FastLogin/issues/493 -# A solution to this is to replace ProtocolLib with ProtocolSupport +# Note: 'username-prefix' is currently broken when used with FastLogin and ProtocolLib. +# A solution to this is to enable 'floodgatePrefixWorkaround' below. # # Possible values: # false: Kick Bedrock players, if they are using an existing Premium Java account's name @@ -243,6 +242,14 @@ allowFloodgateNameConflict: false # Enabling this might lead to people gaining unauthorized access to other's accounts! autoRegisterFloodgate: false +# Make FastLogin inject the Floodgate name prefixes, instead of Floodgate. +# This can fix prefixes, if you are using Floodgate alongside ProtocolLib. +# If either of those plugins are not installed, this option will have no effect. +# For more information visit: https://github.com/games647/FastLogin/issues/493 +# !!!!!!!! WARNING: FLOODGATE SUPPORT IS AN EXPERIMENTAL FEATURE !!!!!!!! +# Enabling this might lead to people gaining unauthorized access to other's accounts! +floodgatePrefixWorkaround: false + # Database configuration # Recommended is the use of MariaDB (a better version of MySQL)