diff --git a/build.gradle b/build.gradle index 2945e98c..794aea68 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ minecraft { dependencies { //to change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API. This is technically optional, but you probably want it anyway. diff --git a/src/main/java/org/geysermc/floodgate/FabricPlatform.java b/src/main/java/org/geysermc/floodgate/FabricPlatform.java index 3d29c2b0..af1a0a20 100644 --- a/src/main/java/org/geysermc/floodgate/FabricPlatform.java +++ b/src/main/java/org/geysermc/floodgate/FabricPlatform.java @@ -2,7 +2,6 @@ package org.geysermc.floodgate; import com.google.inject.Inject; import com.google.inject.Injector; -import org.geysermc.floodgate.FloodgatePlatform; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.inject.PlatformInjector; import org.geysermc.floodgate.api.logger.FloodgateLogger; diff --git a/src/main/java/org/geysermc/floodgate/addon/data/FabricDataHandler.java b/src/main/java/org/geysermc/floodgate/addon/data/FabricDataHandler.java index b0b769d9..71a5aa2e 100644 --- a/src/main/java/org/geysermc/floodgate/addon/data/FabricDataHandler.java +++ b/src/main/java/org/geysermc/floodgate/addon/data/FabricDataHandler.java @@ -2,17 +2,17 @@ package org.geysermc.floodgate.addon.data; import io.netty.channel.Channel; import io.netty.util.AttributeKey; -import net.minecraft.text.Text; +import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.handshake.ClientIntentionPacket; +import net.minecraft.network.protocol.login.ServerboundHelloPacket; +import net.minecraft.server.network.ServerLoginPacketListenerImpl; import org.geysermc.floodgate.api.logger.FloodgateLogger; -import org.geysermc.floodgate.mixin.ClientConnectionMixin; +import org.geysermc.floodgate.mixin.ConnectionMixin; import org.geysermc.floodgate.mixin.ClientIntentionPacketMixin; -import org.geysermc.floodgate.mixin_interface.ServerLoginNetworkHandlerSetter; +import org.geysermc.floodgate.mixin_interface.ServerLoginPacketListenerSetter; import com.mojang.authlib.GameProfile; import io.netty.channel.ChannelHandlerContext; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; -import net.minecraft.network.packet.c2s.login.LoginHelloC2SPacket; -import net.minecraft.server.network.ServerLoginNetworkHandler; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.config.FloodgateConfig; import org.geysermc.floodgate.player.FloodgateHandshakeHandler; @@ -22,7 +22,7 @@ import java.net.InetSocketAddress; public final class FabricDataHandler extends CommonDataHandler { private final FloodgateLogger logger; - private ClientConnection networkManager; + private Connection networkManager; private FloodgatePlayer player; public FabricDataHandler( @@ -35,7 +35,7 @@ public final class FabricDataHandler extends CommonDataHandler { @Override protected void setNewIp(Channel channel, InetSocketAddress newIp) { - ((ClientConnectionMixin) this.networkManager).setAddress(newIp); + ((ConnectionMixin) this.networkManager).setAddress(newIp); } @Override @@ -69,25 +69,25 @@ public final class FabricDataHandler extends CommonDataHandler { @Override protected boolean channelRead(Object packet) { - if (packet instanceof HandshakeC2SPacket handshakePacket) { + if (packet instanceof ClientIntentionPacket intentionPacket) { ctx.pipeline().addAfter("splitter", "floodgate_packet_blocker", blocker); - networkManager = (ClientConnection) ctx.channel().pipeline().get("packet_handler"); - handle(packet, handshakePacket.getAddress()); + networkManager = (Connection) ctx.channel().pipeline().get("packet_handler"); + handle(packet, intentionPacket.getHostName()); return false; } return !checkAndHandleLogin(packet); } private boolean checkAndHandleLogin(Object packet) { - if (packet instanceof LoginHelloC2SPacket) { + if (packet instanceof ServerboundHelloPacket) { String kickMessage = getKickMessage(); if (kickMessage != null) { - networkManager.disconnect(Text.of(kickMessage)); + networkManager.disconnect(Component.nullToEmpty(kickMessage)); return true; } // we have to fake the offline player (login) cycle - if (!(networkManager.getPacketListener() instanceof ServerLoginNetworkHandler)) { + if (!(networkManager.getPacketListener() instanceof ServerLoginPacketListenerImpl)) { // player is not in the login state, abort ctx.pipeline().remove(this); return true; @@ -95,8 +95,8 @@ public final class FabricDataHandler extends CommonDataHandler { GameProfile gameProfile = new GameProfile(player.getCorrectUniqueId(), player.getCorrectUsername()); - ((ServerLoginNetworkHandlerSetter) networkManager.getPacketListener()).setGameProfile(gameProfile); - ((ServerLoginNetworkHandlerSetter) networkManager.getPacketListener()).setLoginState(); + ((ServerLoginPacketListenerSetter) networkManager.getPacketListener()).setGameProfile(gameProfile); + ((ServerLoginPacketListenerSetter) networkManager.getPacketListener()).setLoginState(); ctx.pipeline().remove(this); return true; diff --git a/src/main/java/org/geysermc/floodgate/listener/FabricEventListener.java b/src/main/java/org/geysermc/floodgate/listener/FabricEventListener.java index d0e1c832..bb5cbe12 100644 --- a/src/main/java/org/geysermc/floodgate/listener/FabricEventListener.java +++ b/src/main/java/org/geysermc/floodgate/listener/FabricEventListener.java @@ -3,7 +3,7 @@ package org.geysermc.floodgate.listener; import com.google.inject.Inject; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; @@ -15,8 +15,8 @@ public final class FabricEventListener { @Inject private FloodgateLogger logger; @Inject private LanguageManager languageManager; - public void onPlayerJoin(ServerPlayNetworkHandler networkHandler, PacketSender packetSender, MinecraftServer server) { - FloodgatePlayer player = api.getPlayer(networkHandler.player.getUuid()); + public void onPlayerJoin(ServerGamePacketListenerImpl networkHandler, PacketSender packetSender, MinecraftServer server) { + FloodgatePlayer player = api.getPlayer(networkHandler.player.getUUID()); if (player != null) { player.as(FloodgatePlayerImpl.class).setLogin(false); logger.translatedInfo( diff --git a/src/main/java/org/geysermc/floodgate/mixin/ClientIntentionPacketMixin.java b/src/main/java/org/geysermc/floodgate/mixin/ClientIntentionPacketMixin.java index 227729ce..8cef9aca 100644 --- a/src/main/java/org/geysermc/floodgate/mixin/ClientIntentionPacketMixin.java +++ b/src/main/java/org/geysermc/floodgate/mixin/ClientIntentionPacketMixin.java @@ -1,14 +1,14 @@ package org.geysermc.floodgate.mixin; -import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import net.minecraft.network.protocol.handshake.ClientIntentionPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(HandshakeC2SPacket.class) +@Mixin(ClientIntentionPacket.class) public interface ClientIntentionPacketMixin { - @Accessor("address") + @Accessor("hostName") @Mutable void setAddress(String address); } diff --git a/src/main/java/org/geysermc/floodgate/mixin/ClientConnectionMixin.java b/src/main/java/org/geysermc/floodgate/mixin/ConnectionMixin.java similarity index 66% rename from src/main/java/org/geysermc/floodgate/mixin/ClientConnectionMixin.java rename to src/main/java/org/geysermc/floodgate/mixin/ConnectionMixin.java index 7392653f..64948225 100644 --- a/src/main/java/org/geysermc/floodgate/mixin/ClientConnectionMixin.java +++ b/src/main/java/org/geysermc/floodgate/mixin/ConnectionMixin.java @@ -1,13 +1,13 @@ package org.geysermc.floodgate.mixin; -import net.minecraft.network.ClientConnection; +import net.minecraft.network.Connection; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.net.SocketAddress; -@Mixin(ClientConnection.class) -public interface ClientConnectionMixin { +@Mixin(Connection.class) +public interface ConnectionMixin { @Accessor("address") void setAddress(SocketAddress address); } diff --git a/src/main/java/org/geysermc/floodgate/mixin/ServerNetworkIoMixin.java b/src/main/java/org/geysermc/floodgate/mixin/ServerConnectionListenerMixin.java similarity index 71% rename from src/main/java/org/geysermc/floodgate/mixin/ServerNetworkIoMixin.java rename to src/main/java/org/geysermc/floodgate/mixin/ServerConnectionListenerMixin.java index 8e966d54..dd04e51d 100644 --- a/src/main/java/org/geysermc/floodgate/mixin/ServerNetworkIoMixin.java +++ b/src/main/java/org/geysermc/floodgate/mixin/ServerConnectionListenerMixin.java @@ -1,8 +1,8 @@ package org.geysermc.floodgate.mixin; +import net.minecraft.server.network.ServerConnectionListener; import org.geysermc.floodgate.inject.fabric.FabricInjector; import io.netty.channel.ChannelFuture; -import net.minecraft.server.ServerNetworkIo; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,12 +13,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.net.InetAddress; import java.util.List; -@Mixin(ServerNetworkIo.class) -public abstract class ServerNetworkIoMixin { +@Mixin(ServerConnectionListener.class) +public abstract class ServerConnectionListenerMixin { @Shadow @Final private List channels; - @Inject(method = "bind", at = @At(value = "INVOKE_ASSIGN", target = "Ljava/util/List;add(Ljava/lang/Object;)Z")) + @Inject(method = "startTcpServerListener", at = @At(value = "INVOKE_ASSIGN", target = "Ljava/util/List;add(Ljava/lang/Object;)Z")) public void onChannelAdd(InetAddress address, int port, CallbackInfo ci) { FabricInjector.getInstance().injectClient(this.channels.get(this.channels.size() - 1)); } diff --git a/src/main/java/org/geysermc/floodgate/mixin/ServerLoginNetworkHandlerMixin.java b/src/main/java/org/geysermc/floodgate/mixin/ServerLoginNetworkHandlerMixin.java deleted file mode 100644 index b99d0e2a..00000000 --- a/src/main/java/org/geysermc/floodgate/mixin/ServerLoginNetworkHandlerMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.geysermc.floodgate.mixin; - -import org.geysermc.floodgate.mixin_interface.ServerLoginNetworkHandlerSetter; -import com.mojang.authlib.GameProfile; -import net.minecraft.server.network.ServerLoginNetworkHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ServerLoginNetworkHandler.class) -public abstract class ServerLoginNetworkHandlerMixin implements ServerLoginNetworkHandlerSetter { - @Shadow - ServerLoginNetworkHandler.State state; - - @Accessor("profile") - public abstract void setGameProfile(GameProfile profile); - - @Override - public void setLoginState() { - this.state = ServerLoginNetworkHandler.State.READY_TO_ACCEPT; - } -} diff --git a/src/main/java/org/geysermc/floodgate/mixin/ServerLoginPacketListenerImplMixin.java b/src/main/java/org/geysermc/floodgate/mixin/ServerLoginPacketListenerImplMixin.java new file mode 100644 index 00000000..afebed5b --- /dev/null +++ b/src/main/java/org/geysermc/floodgate/mixin/ServerLoginPacketListenerImplMixin.java @@ -0,0 +1,22 @@ +package org.geysermc.floodgate.mixin; + +import net.minecraft.server.network.ServerLoginPacketListenerImpl; +import org.geysermc.floodgate.mixin_interface.ServerLoginPacketListenerSetter; +import com.mojang.authlib.GameProfile; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerLoginPacketListenerImpl.class) +public abstract class ServerLoginPacketListenerImplMixin implements ServerLoginPacketListenerSetter { + @Shadow + ServerLoginPacketListenerImpl.State state; + + @Accessor("gameProfile") + public abstract void setGameProfile(GameProfile profile); + + @Override + public void setLoginState() { + this.state = ServerLoginPacketListenerImpl.State.READY_TO_ACCEPT; + } +} diff --git a/src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginNetworkHandlerSetter.java b/src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginPacketListenerSetter.java similarity index 76% rename from src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginNetworkHandlerSetter.java rename to src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginPacketListenerSetter.java index fb94a607..4861cc76 100644 --- a/src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginNetworkHandlerSetter.java +++ b/src/main/java/org/geysermc/floodgate/mixin_interface/ServerLoginPacketListenerSetter.java @@ -2,7 +2,7 @@ package org.geysermc.floodgate.mixin_interface; import com.mojang.authlib.GameProfile; -public interface ServerLoginNetworkHandlerSetter { +public interface ServerLoginPacketListenerSetter { void setGameProfile(GameProfile profile); void setLoginState(); diff --git a/src/main/java/org/geysermc/floodgate/module/FabricCommandModule.java b/src/main/java/org/geysermc/floodgate/module/FabricCommandModule.java index f30a3b30..3d824010 100644 --- a/src/main/java/org/geysermc/floodgate/module/FabricCommandModule.java +++ b/src/main/java/org/geysermc/floodgate/module/FabricCommandModule.java @@ -7,7 +7,7 @@ import cloud.commandframework.fabric.FabricServerCommandManager; import com.google.inject.Provides; import com.google.inject.Singleton; import lombok.SneakyThrows; -import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.commands.CommandSourceStack; import org.geysermc.floodgate.platform.command.CommandUtil; import org.geysermc.floodgate.player.FloodgateCommandPreprocessor; import org.geysermc.floodgate.player.UserAudience; @@ -17,10 +17,10 @@ public final class FabricCommandModule extends CommandModule { @Singleton @SneakyThrows public CommandManager commandManager(CommandUtil commandUtil) { - FabricCommandManager commandManager = new FabricServerCommandManager<>( + FabricCommandManager commandManager = new FabricServerCommandManager<>( CommandExecutionCoordinator.simpleCoordinator(), commandUtil::getAudience, - audience -> (ServerCommandSource) audience.source() + audience -> (CommandSourceStack) audience.source() ); commandManager.registerCommandPreProcessor(new FloodgateCommandPreprocessor<>(commandUtil)); return commandManager; diff --git a/src/main/java/org/geysermc/floodgate/pluginmessage/FabricSkinApplier.java b/src/main/java/org/geysermc/floodgate/pluginmessage/FabricSkinApplier.java index c5c07eb8..b38be056 100644 --- a/src/main/java/org/geysermc/floodgate/pluginmessage/FabricSkinApplier.java +++ b/src/main/java/org/geysermc/floodgate/pluginmessage/FabricSkinApplier.java @@ -5,14 +5,14 @@ import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; import com.mojang.datafixers.util.Pair; import lombok.RequiredArgsConstructor; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.attribute.EntityAttributeInstance; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.item.ItemStack; -import net.minecraft.network.Packet; -import net.minecraft.network.packet.s2c.play.*; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.item.ItemStack; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.skin.SkinApplier; import org.geysermc.floodgate.skin.SkinData; @@ -28,7 +28,7 @@ public final class FabricSkinApplier implements SkinApplier { @Override public void applySkin(FloodgatePlayer floodgatePlayer, SkinData skinData) { SERVER.execute(() -> { - ServerPlayerEntity bedrockPlayer = SERVER.getPlayerManager().getPlayer(floodgatePlayer.getCorrectUniqueId()); + ServerPlayer bedrockPlayer = SERVER.getPlayerList().getPlayer(floodgatePlayer.getCorrectUniqueId()); if (bedrockPlayer == null) { // Disconnected probably? return; @@ -41,58 +41,58 @@ public final class FabricSkinApplier implements SkinApplier { properties.put("textures", new Property("textures", skinData.getValue(), skinData.getSignature())); // Skin is applied - now it's time to refresh the player for everyone. Oof. - for (ServerPlayerEntity otherPlayer : SERVER.getPlayerManager().getPlayerList()) { + for (ServerPlayer otherPlayer : SERVER.getPlayerList().getPlayers()) { if (otherPlayer == bedrockPlayer) { continue; } - boolean loadedInWorld = otherPlayer.getEntityWorld().getEntityById(bedrockPlayer.getId()) != null; + boolean loadedInWorld = otherPlayer.getCommandSenderWorld().getEntity(bedrockPlayer.getId()) != null; if (loadedInWorld) { // Player is loaded in this world - otherPlayer.networkHandler.sendPacket(new EntitiesDestroyS2CPacket(bedrockPlayer.getId())); + otherPlayer.connection.send(new ClientboundRemoveEntitiesPacket(bedrockPlayer.getId())); } - otherPlayer.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.REMOVE_PLAYER, bedrockPlayer)); + otherPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.REMOVE_PLAYER, bedrockPlayer)); - otherPlayer.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, bedrockPlayer)); + otherPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, bedrockPlayer)); if (loadedInWorld) { // Copied from EntityTrackerEntry - Packet spawnPacket = bedrockPlayer.createSpawnPacket(); - otherPlayer.networkHandler.sendPacket(spawnPacket); - if (!bedrockPlayer.getDataTracker().isEmpty()) { - otherPlayer.networkHandler.sendPacket(new EntityTrackerUpdateS2CPacket(bedrockPlayer.getId(), bedrockPlayer.getDataTracker(), true)); + Packet spawnPacket = bedrockPlayer.getAddEntityPacket(); + otherPlayer.connection.send(spawnPacket); + if (!bedrockPlayer.getEntityData().isEmpty()) { + otherPlayer.connection.send(new ClientboundSetEntityDataPacket(bedrockPlayer.getId(), bedrockPlayer.getEntityData(), true)); } - Collection collection = bedrockPlayer.getAttributes().getAttributesToSend(); + Collection collection = bedrockPlayer.getAttributes().getDirtyAttributes(); if (!collection.isEmpty()) { - otherPlayer.networkHandler.sendPacket(new EntityAttributesS2CPacket(bedrockPlayer.getId(), collection)); + otherPlayer.connection.send(new ClientboundUpdateAttributesPacket(bedrockPlayer.getId(), collection)); } - otherPlayer.networkHandler.sendPacket(new EntityVelocityUpdateS2CPacket(bedrockPlayer.getId(), bedrockPlayer.getVelocity())); + otherPlayer.connection.send(new ClientboundSetEntityMotionPacket(bedrockPlayer.getId(), bedrockPlayer.getDeltaMovement())); List> equipmentList = Lists.newArrayList(); EquipmentSlot[] slots = EquipmentSlot.values(); for (EquipmentSlot equipmentSlot : slots) { - ItemStack itemStack = bedrockPlayer.getEquippedStack(equipmentSlot); + ItemStack itemStack = bedrockPlayer.getItemBySlot(equipmentSlot); if (!itemStack.isEmpty()) { equipmentList.add(Pair.of(equipmentSlot, itemStack.copy())); } } if (!equipmentList.isEmpty()) { - otherPlayer.networkHandler.sendPacket(new EntityEquipmentUpdateS2CPacket(bedrockPlayer.getId(), equipmentList)); + otherPlayer.connection.send(new ClientboundSetEquipmentPacket(bedrockPlayer.getId(), equipmentList)); } - for (StatusEffectInstance statusEffectInstance : bedrockPlayer.getStatusEffects()) { - otherPlayer.networkHandler.sendPacket(new EntityStatusEffectS2CPacket(bedrockPlayer.getId(), statusEffectInstance)); + for (MobEffectInstance mobEffectInstance : bedrockPlayer.getActiveEffects()) { + otherPlayer.connection.send(new ClientboundUpdateMobEffectPacket(bedrockPlayer.getId(), mobEffectInstance)); } - if (!bedrockPlayer.getPassengerList().isEmpty()) { - otherPlayer.networkHandler.sendPacket(new EntityPassengersSetS2CPacket(bedrockPlayer)); + if (!bedrockPlayer.getPassengers().isEmpty()) { + otherPlayer.connection.send(new ClientboundSetPassengersPacket(bedrockPlayer)); } - if (bedrockPlayer.hasVehicle()) { - otherPlayer.networkHandler.sendPacket(new EntityPassengersSetS2CPacket(bedrockPlayer.getVehicle())); + if (bedrockPlayer.getVehicle() != null) { + otherPlayer.connection.send(new ClientboundSetPassengersPacket(bedrockPlayer.getVehicle())); } } } diff --git a/src/main/java/org/geysermc/floodgate/util/FabricCommandUtil.java b/src/main/java/org/geysermc/floodgate/util/FabricCommandUtil.java index a6c0e509..29758e42 100644 --- a/src/main/java/org/geysermc/floodgate/util/FabricCommandUtil.java +++ b/src/main/java/org/geysermc/floodgate/util/FabricCommandUtil.java @@ -7,13 +7,13 @@ import lombok.RequiredArgsConstructor; import me.lucko.fabric.api.permissions.v0.Permissions; import net.kyori.adventure.platform.fabric.FabricServerAudiences; import net.kyori.adventure.platform.fabric.PlayerLocales; -import net.minecraft.entity.Entity; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WhitelistEntry; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.UserWhiteListEntry; +import net.minecraft.world.entity.Entity; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; @@ -38,13 +38,12 @@ public final class FabricCommandUtil implements CommandUtil { @Override public @NonNull UserAudience getAudience(@NonNull Object source) { - if (!(source instanceof ServerCommandSource)) { + if (!(source instanceof CommandSourceStack commandSource)) { throw new RuntimeException(); } - ServerCommandSource commandSource = (ServerCommandSource) source; - if (commandSource.getEntity() instanceof ServerPlayerEntity) { - return getAudience0((ServerPlayerEntity) commandSource.getEntity()); + if (commandSource.getEntity() instanceof ServerPlayer) { + return getAudience0((ServerPlayer) commandSource.getEntity()); } return new FabricUserAudience(null, manager.getDefaultLocale(), commandSource, this); @@ -52,7 +51,7 @@ public final class FabricCommandUtil implements CommandUtil { @Override public UserAudience getAudienceByUuid(@NonNull UUID uuid) { - ServerPlayerEntity player = SERVER.getPlayerManager().getPlayer(uuid); + ServerPlayer player = SERVER.getPlayerList().getPlayer(uuid); if (player != null) { return getAudience0(player); } @@ -61,21 +60,21 @@ public final class FabricCommandUtil implements CommandUtil { @Override public UserAudience getAudienceByUsername(@NonNull String username) { - ServerPlayerEntity player = SERVER.getPlayerManager().getPlayer(username); + ServerPlayer player = SERVER.getPlayerList().getPlayerByName(username); if (player != null) { return getAudience0(player); } return getOfflineAudienceByUsername(username); } - private FabricUserAudience getAudience0(ServerPlayerEntity player) { + private FabricUserAudience getAudience0(ServerPlayer player) { // Apparently can be null even if Javadocs say otherwise Locale locale = PlayerLocales.locale(player); return new FabricUserAudience.NamedFabricUserAudience( - player.getName().asString(), - player.getUuid(), locale != null ? + player.getName().getString(), + player.getUUID(), locale != null ? locale.getLanguage().toLowerCase(Locale.ROOT) + "_" + locale.getCountry().toUpperCase(Locale.ROOT) : - manager.getDefaultLocale(), player.getCommandSource(), this, true); + manager.getDefaultLocale(), player.createCommandSourceStack(), this, true); } @Override @@ -86,7 +85,7 @@ public final class FabricCommandUtil implements CommandUtil { @Override public @NonNull UserAudience getOfflineAudienceByUsername(@NonNull String username) { UUID uuid = null; - Optional profile = SERVER.getUserCache().findByName(username); + Optional profile = SERVER.getProfileCache().get(username); if (profile.isPresent()) { uuid = profile.get().getId(); } @@ -95,26 +94,26 @@ public final class FabricCommandUtil implements CommandUtil { @Override public @NonNull Collection getOnlineUsernames(UserAudienceArgument.@NonNull PlayerType limitTo) { - List players = SERVER.getPlayerManager().getPlayerList(); + List players = SERVER.getPlayerList().getPlayers(); Collection usernames = new ArrayList<>(); switch (limitTo) { case ALL_PLAYERS: - for (ServerPlayerEntity player : players) { - usernames.add(player.getName().asString()); + for (ServerPlayer player : players) { + usernames.add(player.getName().getString()); } break; case ONLY_JAVA: - for (ServerPlayerEntity player : players) { - if (!api.isFloodgatePlayer(player.getUuid())) { - usernames.add(player.getName().asString()); + for (ServerPlayer player : players) { + if (!api.isFloodgatePlayer(player.getUUID())) { + usernames.add(player.getName().getString()); } } break; case ONLY_BEDROCK: - for (ServerPlayerEntity player : players) { - if (api.isFloodgatePlayer(player.getUuid())) { - usernames.add(player.getName().asString()); + for (ServerPlayer player : players) { + if (api.isFloodgatePlayer(player.getUUID())) { + usernames.add(player.getName().getString()); } } break; @@ -132,7 +131,7 @@ public final class FabricCommandUtil implements CommandUtil { @Override public Collection getOnlinePlayersWithPermission(String permission) { List players = new ArrayList<>(); - for (ServerPlayerEntity player : SERVER.getPlayerManager().getPlayerList()) { + for (ServerPlayer player : SERVER.getPlayerList().getPlayers()) { if (hasPermission(player, permission)) { players.add(player); } @@ -142,10 +141,10 @@ public final class FabricCommandUtil implements CommandUtil { @Override public void sendMessage(Object player, String locale, TranslatableMessage message, Object... args) { - ServerCommandSource commandSource = (ServerCommandSource) player; - if (commandSource.getEntity() instanceof ServerPlayerEntity) { - SERVER.execute(() -> ((ServerPlayerEntity) commandSource.getEntity()) - .sendMessage(translateAndTransform(locale, message, args), false)); + CommandSourceStack commandSource = (CommandSourceStack) player; + if (commandSource.getEntity() instanceof ServerPlayer) { + SERVER.execute(() -> ((ServerPlayer) commandSource.getEntity()) + .displayClientMessage(translateAndTransform(locale, message, args), false)); } else { // Console? logger.info(message.translateMessage(manager, locale, args)); @@ -154,10 +153,10 @@ public final class FabricCommandUtil implements CommandUtil { @Override public void sendMessage(Object target, String message) { - ServerCommandSource commandSource = (ServerCommandSource) target; - if (commandSource.getEntity() instanceof ServerPlayerEntity) { - SERVER.execute(() -> ((ServerPlayerEntity) commandSource.getEntity()) - .sendMessage(new LiteralText(message), false)); + CommandSourceStack commandSource = (CommandSourceStack) target; + if (commandSource.getEntity() instanceof ServerPlayer) { + SERVER.execute(() -> ((ServerPlayer) commandSource.getEntity()) + .displayClientMessage(new TextComponent(message), false)); } else { // Console? logger.info(message); @@ -166,35 +165,35 @@ public final class FabricCommandUtil implements CommandUtil { @Override public void kickPlayer(Object player, String locale, TranslatableMessage message, Object... args) { - getPlayer(player).networkHandler.disconnect(translateAndTransform(locale, message, args)); + getPlayer(player).connection.disconnect(translateAndTransform(locale, message, args)); } @Override public boolean whitelistPlayer(UUID uuid, String username) { GameProfile profile = new GameProfile(uuid, username); - SERVER.getPlayerManager().getWhitelist().add(new WhitelistEntry(profile)); + SERVER.getPlayerList().getWhiteList().add(new UserWhiteListEntry(profile)); return true; } @Override public boolean removePlayerFromWhitelist(UUID uuid, String username) { GameProfile profile = new GameProfile(uuid, username); - SERVER.getPlayerManager().getWhitelist().remove(profile); + SERVER.getPlayerList().getWhiteList().remove(profile); return true; } - private ServerPlayerEntity getPlayer(Object instance) { + private ServerPlayer getPlayer(Object instance) { try { - ServerCommandSource source = (ServerCommandSource) instance; - return source.getPlayer(); + CommandSourceStack source = (CommandSourceStack) instance; + return source.getPlayerOrException(); } catch (ClassCastException | CommandSyntaxException exception) { logger.error("Failed to cast {} as a player", instance.getClass().getName()); throw new RuntimeException(); } } - public Text translateAndTransform(String locale, TranslatableMessage message, Object... args) { - return new LiteralText(message.translateMessage(manager, locale, args)); + public Component translateAndTransform(String locale, TranslatableMessage message, Object... args) { + return new TextComponent(message.translateMessage(manager, locale, args)); } public FabricServerAudiences getAdventure() { diff --git a/src/main/java/org/geysermc/floodgate/util/FabricUserAudience.java b/src/main/java/org/geysermc/floodgate/util/FabricUserAudience.java index 69298f4d..ba780c13 100644 --- a/src/main/java/org/geysermc/floodgate/util/FabricUserAudience.java +++ b/src/main/java/org/geysermc/floodgate/util/FabricUserAudience.java @@ -7,8 +7,8 @@ import net.kyori.adventure.audience.ForwardingAudience; import net.kyori.adventure.audience.MessageType; import net.kyori.adventure.identity.Identity; import net.kyori.adventure.text.Component; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerPlayer; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.floodgate.platform.command.TranslatableMessage; import org.geysermc.floodgate.player.UserAudience; @@ -19,7 +19,7 @@ import java.util.UUID; public class FabricUserAudience implements UserAudience, ForwardingAudience.Single { private final UUID uuid; private final String locale; - private final ServerCommandSource source; + private final CommandSourceStack source; private final FabricCommandUtil commandUtil; @Override @@ -38,7 +38,7 @@ public class FabricUserAudience implements UserAudience, ForwardingAudience.Sing return ""; } - return source.getName(); + return source.getTextName(); } @Override @@ -47,7 +47,7 @@ public class FabricUserAudience implements UserAudience, ForwardingAudience.Sing } @Override - public @NonNull ServerCommandSource source() { + public @NonNull CommandSourceStack source() { return source; } @@ -68,8 +68,8 @@ public class FabricUserAudience implements UserAudience, ForwardingAudience.Sing @Override public void disconnect(@NonNull Component reason) { - if (source.getEntity() instanceof ServerPlayerEntity) { - ((ServerPlayerEntity) source.getEntity()).networkHandler.disconnect( + if (source.getEntity() instanceof ServerPlayer) { + ((ServerPlayer) source.getEntity()).connection.disconnect( commandUtil.getAdventure().toNative(reason) ); } @@ -77,8 +77,8 @@ public class FabricUserAudience implements UserAudience, ForwardingAudience.Sing @Override public void disconnect(TranslatableMessage message, Object... args) { - if (source.getEntity() instanceof ServerPlayerEntity) { - ((ServerPlayerEntity) source.getEntity()).networkHandler.disconnect( + if (source.getEntity() instanceof ServerPlayer) { + ((ServerPlayer) source.getEntity()).connection.disconnect( commandUtil.translateAndTransform(this.locale, message, args) ); } @@ -95,7 +95,7 @@ public class FabricUserAudience implements UserAudience, ForwardingAudience.Sing String name, UUID uuid, String locale, - ServerCommandSource source, + CommandSourceStack source, FabricCommandUtil commandUtil, boolean online) { super(uuid, locale, source, commandUtil); diff --git a/src/main/resources/floodgate.accesswidener b/src/main/resources/floodgate.accesswidener index 932b0de1..4e7dcb8e 100644 --- a/src/main/resources/floodgate.accesswidener +++ b/src/main/resources/floodgate.accesswidener @@ -1,4 +1,4 @@ accessWidener v1 named # To change login state -accessible class net/minecraft/server/network/ServerLoginNetworkHandler$State \ No newline at end of file +accessible class net/minecraft/server/network/ServerLoginPacketListenerImpl$State \ No newline at end of file diff --git a/src/main/resources/floodgate.mixins.json b/src/main/resources/floodgate.mixins.json index a19fd613..2b61e57f 100644 --- a/src/main/resources/floodgate.mixins.json +++ b/src/main/resources/floodgate.mixins.json @@ -4,9 +4,9 @@ "package": "org.geysermc.floodgate.mixin", "compatibilityLevel": "JAVA_16", "mixins": [ - "ClientConnectionMixin", - "ServerLoginNetworkHandlerMixin", - "ServerNetworkIoMixin", + "ConnectionMixin", + "ServerLoginPacketListenerImplMixin", + "ServerConnectionListenerMixin", "ClientIntentionPacketMixin" ], "injectors": {