1
0
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:
Camotoy
2021-12-01 21:54:26 -05:00
parent 39a519b484
commit 72be662bca
16 changed files with 141 additions and 143 deletions

View File

@@ -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.

View File

@@ -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;

View File

@@ -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;

View File

@@ -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(

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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));
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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()));
}
}
}

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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

View File

@@ -4,9 +4,9 @@
"package": "org.geysermc.floodgate.mixin",
"compatibilityLevel": "JAVA_16",
"mixins": [
"ClientConnectionMixin",
"ServerLoginNetworkHandlerMixin",
"ServerNetworkIoMixin",
"ConnectionMixin",
"ServerLoginPacketListenerImplMixin",
"ServerConnectionListenerMixin",
"ClientIntentionPacketMixin"
],
"injectors": {