mirror of
https://github.com/GeyserMC/Floodgate.git
synced 2025-12-28 02:59:16 +00:00
Update to Mojang mappings
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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<ChannelFuture> 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));
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
@@ -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<UserAudience> commandManager(CommandUtil commandUtil) {
|
||||
FabricCommandManager<UserAudience, ServerCommandSource> commandManager = new FabricServerCommandManager<>(
|
||||
FabricCommandManager<UserAudience, CommandSourceStack> commandManager = new FabricServerCommandManager<>(
|
||||
CommandExecutionCoordinator.simpleCoordinator(),
|
||||
commandUtil::getAudience,
|
||||
audience -> (ServerCommandSource) audience.source()
|
||||
audience -> (CommandSourceStack) audience.source()
|
||||
);
|
||||
commandManager.registerCommandPreProcessor(new FloodgateCommandPreprocessor<>(commandUtil));
|
||||
return commandManager;
|
||||
|
||||
@@ -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<EntityAttributeInstance> collection = bedrockPlayer.getAttributes().getAttributesToSend();
|
||||
Collection<AttributeInstance> 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<Pair<EquipmentSlot, ItemStack>> 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<GameProfile> profile = SERVER.getUserCache().findByName(username);
|
||||
Optional<GameProfile> 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<String> getOnlineUsernames(UserAudienceArgument.@NonNull PlayerType limitTo) {
|
||||
List<ServerPlayerEntity> players = SERVER.getPlayerManager().getPlayerList();
|
||||
List<ServerPlayer> players = SERVER.getPlayerList().getPlayers();
|
||||
|
||||
Collection<String> 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<Object> getOnlinePlayersWithPermission(String permission) {
|
||||
List<Object> 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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
accessWidener v1 named
|
||||
|
||||
# To change login state
|
||||
accessible class net/minecraft/server/network/ServerLoginNetworkHandler$State
|
||||
accessible class net/minecraft/server/network/ServerLoginPacketListenerImpl$State
|
||||
@@ -4,9 +4,9 @@
|
||||
"package": "org.geysermc.floodgate.mixin",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"mixins": [
|
||||
"ClientConnectionMixin",
|
||||
"ServerLoginNetworkHandlerMixin",
|
||||
"ServerNetworkIoMixin",
|
||||
"ConnectionMixin",
|
||||
"ServerLoginPacketListenerImplMixin",
|
||||
"ServerConnectionListenerMixin",
|
||||
"ClientIntentionPacketMixin"
|
||||
],
|
||||
"injectors": {
|
||||
|
||||
Reference in New Issue
Block a user