Updated Gradle to 8.3 and made Geyser work with latest Floodgate

This commit is contained in:
Tim203 2023-09-30 19:41:35 +02:00
parent a4ee73d1ef
commit a894ce9824
No known key found for this signature in database
52 changed files with 206 additions and 1656 deletions

View file

@ -8,6 +8,7 @@ plugins {
dependencies {
api(libs.floodgate.core)
api(libs.floodgate.isolation)
annotationProcessor(libs.floodgate.core)
api(projects.api)

View file

@ -29,8 +29,6 @@ import org.geysermc.floodgate.core.skin.SkinApplier;
import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.hybrid.FloodgateHybridProvider;
import org.geysermc.geyser.hybrid.HybridProvider;
import org.geysermc.geyser.level.GeyserWorldManager;
import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.ping.IGeyserPingPassthrough;
@ -137,13 +135,6 @@ public interface GeyserBootstrap {
return Paths.get("logs/latest.log");
}
/**
* Creates the hybrid provider for this platform. The provider will differ based on server access.
*/
default HybridProvider createHybridProvider(GeyserImpl geyser) {
return new FloodgateHybridProvider(geyser);
}
/**
* Returns the skin applier for this platform, if the hybrid provider is integrated with the system.
*/

View file

@ -64,12 +64,13 @@ import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.erosion.UnixSocketClientListener;
import org.geysermc.geyser.event.GeyserEventBus;
import org.geysermc.geyser.extension.GeyserExtensionManager;
import org.geysermc.geyser.hybrid.HybridProvider;
import org.geysermc.geyser.floodgate.FloodgateProvider;
import org.geysermc.geyser.floodgate.NoFloodgateProvider;
import org.geysermc.geyser.floodgate.ProxyFloodgateProvider;
import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.network.netty.GeyserServer;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.loader.RegistryLoaders;
import org.geysermc.geyser.scoreboard.ScoreboardUpdater;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
@ -131,7 +132,7 @@ public class GeyserImpl implements GeyserApi {
@Setter
private static boolean shouldStartListener = true;
private HybridProvider hybridProvider;
private final FloodgateProvider floodgateProvider;
private BedrockSkinUploader skinUploader;
private NewsHandler newsHandler;
@ -156,16 +157,18 @@ public class GeyserImpl implements GeyserApi {
private static GeyserImpl instance;
private final FloodgatePlatform floodgatePlatform;
private GeyserImpl(PlatformType platformType, GeyserBootstrap bootstrap, FloodgatePlatform floodgatePlatform) {
instance = this;
this.floodgatePlatform = floodgatePlatform;
if (floodgatePlatform != null) {
floodgatePlatform.load();
floodgatePlatform.enable();
// this.floodgatePlatform = floodgatePlatform.isProxy() ? new ProxyFloodgateProvider(floodgatePlatform) : new IntegratedFloodgateProvider(floodgatePlatform);
// this.floodgateProvider = new IntegratedFloodgateProvider(floodgatePlatform);
this.floodgateProvider = new ProxyFloodgateProvider(floodgatePlatform);
} else {
this.floodgateProvider = new NoFloodgateProvider();
Geyser.set(this);
}
@ -314,7 +317,7 @@ public class GeyserImpl implements GeyserApi {
}
}
boolean floodgatePresent = bootstrap.testFloodgatePluginPresent();
boolean floodgatePresent = bootstrap.testFloodgatePluginPresent() || floodgateProvider != null; //todo
if (config.getRemote().authType() == AuthType.FLOODGATE && !floodgatePresent) {
logger.severe(GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.not_installed") + " "
+ GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.disabling"));
@ -383,7 +386,6 @@ public class GeyserImpl implements GeyserApi {
}
if (config.getRemote().authType() == AuthType.FLOODGATE) {
hybridProvider = bootstrap.createHybridProvider(this);
try {
// Note: this is positioned after the bind so the skin uploader doesn't try to run if Geyser fails
// to load successfully. Spigot complains about class loader if the plugin is disabled.

View file

@ -33,7 +33,6 @@ import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.LoopbackUtil;
import org.geysermc.geyser.util.PlatformType;
import org.geysermc.geyser.util.WebUtils;
import org.jetbrains.annotations.Nullable;

View file

@ -252,6 +252,6 @@ public class SessionPlayerEntity extends PlayerEntity {
@Override
public UUID getTabListUuid() {
return session.getAuthData().uuid();
return session.identity();
}
}

View file

@ -34,7 +34,6 @@ import org.geysermc.event.subscribe.Subscribe;
import org.geysermc.geyser.api.event.EventBus;
import org.geysermc.geyser.api.event.EventRegistrar;
import org.geysermc.geyser.api.event.EventSubscriber;
import org.geysermc.geyser.api.extension.Extension;
import java.util.Set;
import java.util.function.BiConsumer;
@ -67,6 +66,6 @@ public final class GeyserEventBus extends OwnedEventBusImpl<EventRegistrar, Even
@Override
@NonNull
public <T extends Event> Set<? extends EventSubscriber<EventRegistrar, T>> subscribers(@NonNull Class<T> eventClass) {
return castGenericSet(super.subscribers(eventClass));
return castGenericNullableSet(super.subscribers(eventClass));
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
* Copyright (c) 2019-2023 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,21 +23,18 @@
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.hybrid;
package org.geysermc.geyser.floodgate;
import org.geysermc.floodgate.core.crypto.FloodgateCipher;
import org.geysermc.geyser.GeyserImpl;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.session.GeyserSession;
public final class ProxyHybridProvider extends IntegratedHybridProvider {
private final FloodgateCipher cipher;
public interface FloodgateProvider {
void onSkinUpload(GeyserSession session, String value, String signature);
public ProxyHybridProvider(GeyserImpl geyser) {
super(geyser);
this.cipher = geyser.getFloodgatePlatform().getBean(FloodgateCipher.class);
}
@Override
public FloodgateCipher getCipher() {
return cipher;
}
/**
* Called before Geyser sends the ClientIntention to the Java server.
*
* @return data to add to the hostname
*/
@Nullable String onClientIntention(GeyserSession session) throws Exception;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2021 GeyserMC. http://geysermc.org
* Copyright (c) 2019-2023 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,23 +23,25 @@
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.hybrid;
package org.geysermc.geyser.floodgate;
import io.netty.util.AttributeKey;
import org.geysermc.floodgate.core.crypto.FloodgateCipher;
import org.geysermc.floodgate.core.FloodgatePlatform;
import org.geysermc.floodgate.core.connection.ConnectionManager;
import org.geysermc.floodgate.core.skin.SkinApplier;
import org.geysermc.floodgate.core.skin.SkinDataImpl;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession;
public class IntegratedHybridProvider implements HybridProvider {
public class IntegratedFloodgateProvider implements FloodgateProvider {
// TODO This will probably end up as its own class.
public static final AttributeKey<GeyserSession> SESSION_KEY = AttributeKey.valueOf("geyser-session");
private final SkinApplier skinApplier;
private final ConnectionManager connectionManager;
public IntegratedHybridProvider(GeyserImpl geyser) {
skinApplier = geyser.getBootstrap().createSkinApplier();
public IntegratedFloodgateProvider(FloodgatePlatform platform) {
skinApplier = platform.getBean(SkinApplier.class);
connectionManager = platform.getBean(ConnectionManager.class);
}
@Override
@ -48,7 +50,8 @@ public class IntegratedHybridProvider implements HybridProvider {
}
@Override
public FloodgateCipher getCipher() {
throw new UnsupportedOperationException();
public String onClientIntention(GeyserSession session) {
connectionManager.addConnection(session);
return null;
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
* Copyright (c) 2019-2023 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,13 +23,18 @@
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.hybrid;
package org.geysermc.geyser.floodgate;
import org.geysermc.floodgate.core.crypto.FloodgateCipher;
import org.geysermc.geyser.session.GeyserSession;
public interface HybridProvider {
void onSkinUpload(GeyserSession session, String value, String signature);
public final class NoFloodgateProvider implements FloodgateProvider {
@Override
public void onSkinUpload(GeyserSession session, String value, String signature) {
FloodgateCipher getCipher();
}
@Override
public String onClientIntention(GeyserSession session) {
return null;
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
* Copyright (c) 2019-2023 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,19 +23,19 @@
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.hybrid;
import org.geysermc.floodgate.core.crypto.FloodgateCipher;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession;
package org.geysermc.geyser.floodgate;
import java.nio.charset.StandardCharsets;
import org.geysermc.floodgate.core.FloodgatePlatform;
import org.geysermc.floodgate.core.crypto.FloodgateDataCodec;
import org.geysermc.geyser.session.GeyserSession;
public final class FloodgateHybridProvider implements HybridProvider {
private final FloodgateCipher cipher;
//todo Floodgate should be responsible for forwarding its messages
public final class ProxyFloodgateProvider implements FloodgateProvider {
private final FloodgateDataCodec dataCodec;
public FloodgateHybridProvider(GeyserImpl geyser) {
cipher = geyser.getFloodgatePlatform().getBean(FloodgateCipher.class);
public ProxyFloodgateProvider(FloodgatePlatform platform) {
dataCodec = platform.getBean(FloodgateDataCodec.class);
}
@Override
@ -47,7 +47,7 @@ public final class FloodgateHybridProvider implements HybridProvider {
}
@Override
public FloodgateCipher getCipher() {
return cipher;
public String onClientIntention(GeyserSession session) throws Exception {
return dataCodec.encodeToString(session);
}
}

View file

@ -29,7 +29,7 @@ import io.netty.channel.local.LocalChannel;
import io.netty.channel.local.LocalServerChannel;
import io.netty.util.Attribute;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.hybrid.IntegratedHybridProvider;
import org.geysermc.geyser.floodgate.IntegratedFloodgateProvider;
import org.geysermc.geyser.session.GeyserSession;
/**
@ -44,12 +44,12 @@ public class LocalServerChannelWrapper extends LocalServerChannel {
LocalChannelWrapper channel = new LocalChannelWrapper(this, peer);
channel.wrapper().remoteAddress(((LocalChannelWithRemoteAddress) peer).spoofedRemoteAddress());
if (GeyserImpl.getInstance().getHybridProvider() instanceof IntegratedHybridProvider) {
Attribute<GeyserSession> attribute = peer.attr(IntegratedHybridProvider.SESSION_KEY);
if (GeyserImpl.getInstance().getFloodgateProvider() instanceof IntegratedFloodgateProvider) {
Attribute<GeyserSession> attribute = peer.attr(IntegratedFloodgateProvider.SESSION_KEY);
GeyserSession session = attribute.get();
// Garbage collect since it's no longer relevant for the PacketLib side.
attribute.set(null);
channel.attr(IntegratedHybridProvider.SESSION_KEY).set(session);
channel.attr(IntegratedFloodgateProvider.SESSION_KEY).set(session);
}
return channel;
}

View file

@ -39,7 +39,7 @@ import io.netty.channel.unix.PreferredDirectByteBufAllocator;
import io.netty.handler.codec.haproxy.*;
import io.netty.util.Attribute;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.hybrid.IntegratedHybridProvider;
import org.geysermc.geyser.floodgate.IntegratedFloodgateProvider;
import org.geysermc.geyser.session.GeyserSession;
import javax.annotation.Nullable;
@ -98,8 +98,8 @@ public final class LocalSession extends TcpSession {
addHAProxySupport(pipeline);
if (GeyserImpl.getInstance().getHybridProvider() instanceof IntegratedHybridProvider) {
Attribute<GeyserSession> attribute = channel.attr(IntegratedHybridProvider.SESSION_KEY);
if (GeyserImpl.getInstance().getFloodgateProvider() instanceof IntegratedFloodgateProvider) {
Attribute<GeyserSession> attribute = channel.attr(IntegratedFloodgateProvider.SESSION_KEY);
attribute.set(session);
}
}

View file

@ -35,7 +35,6 @@ import org.geysermc.geyser.registry.loader.RegistryLoaders;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.util.PlatformType;
import java.util.Collections;
import java.util.IdentityHashMap;

View file

@ -74,6 +74,25 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import java.net.ConnectException;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@ -83,16 +102,55 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.common.value.qual.IntRange;
import org.cloudburstmc.math.vector.*;
import org.cloudburstmc.math.vector.Vector2f;
import org.cloudburstmc.math.vector.Vector2i;
import org.cloudburstmc.math.vector.Vector3d;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.math.vector.Vector3i;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons;
import org.cloudburstmc.protocol.bedrock.BedrockServerSession;
import org.cloudburstmc.protocol.bedrock.data.*;
import org.cloudburstmc.protocol.bedrock.data.Ability;
import org.cloudburstmc.protocol.bedrock.data.AbilityLayer;
import org.cloudburstmc.protocol.bedrock.data.AttributeData;
import org.cloudburstmc.protocol.bedrock.data.AuthoritativeMovementMode;
import org.cloudburstmc.protocol.bedrock.data.CameraShakeAction;
import org.cloudburstmc.protocol.bedrock.data.CameraShakeType;
import org.cloudburstmc.protocol.bedrock.data.ChatRestrictionLevel;
import org.cloudburstmc.protocol.bedrock.data.ExperimentData;
import org.cloudburstmc.protocol.bedrock.data.GamePublishSetting;
import org.cloudburstmc.protocol.bedrock.data.GameRuleData;
import org.cloudburstmc.protocol.bedrock.data.GameType;
import org.cloudburstmc.protocol.bedrock.data.PlayerPermission;
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
import org.cloudburstmc.protocol.bedrock.data.SpawnBiomeType;
import org.cloudburstmc.protocol.bedrock.data.command.CommandEnumData;
import org.cloudburstmc.protocol.bedrock.data.command.CommandPermission;
import org.cloudburstmc.protocol.bedrock.data.command.SoftEnumUpdateType;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.cloudburstmc.protocol.bedrock.packet.*;
import org.cloudburstmc.protocol.bedrock.packet.AvailableEntityIdentifiersPacket;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
import org.cloudburstmc.protocol.bedrock.packet.BiomeDefinitionListPacket;
import org.cloudburstmc.protocol.bedrock.packet.CameraShakePacket;
import org.cloudburstmc.protocol.bedrock.packet.ChunkRadiusUpdatedPacket;
import org.cloudburstmc.protocol.bedrock.packet.ClientboundMapItemDataPacket;
import org.cloudburstmc.protocol.bedrock.packet.CraftingDataPacket;
import org.cloudburstmc.protocol.bedrock.packet.CreativeContentPacket;
import org.cloudburstmc.protocol.bedrock.packet.EmoteListPacket;
import org.cloudburstmc.protocol.bedrock.packet.EmotePacket;
import org.cloudburstmc.protocol.bedrock.packet.GameRulesChangedPacket;
import org.cloudburstmc.protocol.bedrock.packet.ItemComponentPacket;
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEvent2Packet;
import org.cloudburstmc.protocol.bedrock.packet.PlayStatusPacket;
import org.cloudburstmc.protocol.bedrock.packet.PlayerFogPacket;
import org.cloudburstmc.protocol.bedrock.packet.SetTimePacket;
import org.cloudburstmc.protocol.bedrock.packet.StartGamePacket;
import org.cloudburstmc.protocol.bedrock.packet.TextPacket;
import org.cloudburstmc.protocol.bedrock.packet.TransferPacket;
import org.cloudburstmc.protocol.bedrock.packet.UpdateAbilitiesPacket;
import org.cloudburstmc.protocol.bedrock.packet.UpdateAdventureSettingsPacket;
import org.cloudburstmc.protocol.bedrock.packet.UpdateAttributesPacket;
import org.cloudburstmc.protocol.bedrock.packet.UpdateSoftEnumPacket;
import org.cloudburstmc.protocol.common.DefinitionRegistry;
import org.cloudburstmc.protocol.common.util.OptionalBoolean;
import org.geysermc.api.util.BedrockPlatform;
@ -100,8 +158,8 @@ import org.geysermc.api.util.InputMode;
import org.geysermc.api.util.UiProfile;
import org.geysermc.cumulus.form.Form;
import org.geysermc.cumulus.form.util.FormBuilder;
import org.geysermc.floodgate.core.crypto.FloodgateCipher;
import org.geysermc.floodgate.util.BedrockData;
import org.geysermc.floodgate.core.connection.FloodgateConnection;
import org.geysermc.floodgate.util.LinkedPlayer;
import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.bedrock.camera.CameraShake;
@ -123,8 +181,7 @@ import org.geysermc.geyser.entity.type.Tickable;
import org.geysermc.geyser.entity.type.player.SessionPlayerEntity;
import org.geysermc.geyser.erosion.AbstractGeyserboundPacketHandler;
import org.geysermc.geyser.erosion.GeyserboundHandshakePacketHandler;
import org.geysermc.geyser.hybrid.FloodgateHybridProvider;
import org.geysermc.geyser.hybrid.HybridProvider;
import org.geysermc.geyser.floodgate.FloodgateProvider;
import org.geysermc.geyser.inventory.Inventory;
import org.geysermc.geyser.inventory.PlayerInventory;
import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
@ -139,8 +196,20 @@ import org.geysermc.geyser.registry.type.BlockMappings;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.auth.AuthData;
import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.session.cache.*;
import org.geysermc.geyser.skin.BedrockSkinUploader;
import org.geysermc.geyser.session.cache.AdvancementsCache;
import org.geysermc.geyser.session.cache.BookEditCache;
import org.geysermc.geyser.session.cache.ChunkCache;
import org.geysermc.geyser.session.cache.EntityCache;
import org.geysermc.geyser.session.cache.EntityEffectCache;
import org.geysermc.geyser.session.cache.FormCache;
import org.geysermc.geyser.session.cache.LodestoneCache;
import org.geysermc.geyser.session.cache.PistonCache;
import org.geysermc.geyser.session.cache.PreferencesCache;
import org.geysermc.geyser.session.cache.SkullCache;
import org.geysermc.geyser.session.cache.TagCache;
import org.geysermc.geyser.session.cache.TeleportCache;
import org.geysermc.geyser.session.cache.WorldBorder;
import org.geysermc.geyser.session.cache.WorldCache;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.text.MinecraftLocale;
import org.geysermc.geyser.text.TextDecoration;
@ -152,19 +221,8 @@ import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.LoginEncryptionUtils;
import org.jetbrains.annotations.NotNull;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@Getter
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
public class GeyserSession extends FloodgateConnection implements GeyserConnection, GeyserCommandSource {
private final GeyserImpl geyser;
private final UpstreamSession upstream;
@ -343,7 +401,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
/**
* Tracks the original speed attribute.
*
* <p>
* We need to do this in order to emulate speeds when sneaking under 1.5-blocks-tall areas if the player isn't sneaking,
* and when crawling.
*/
@ -961,43 +1019,21 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
public void packetSending(PacketSendingEvent event) {
//todo move this somewhere else
if (event.getPacket() instanceof ClientIntentionPacket) {
String addressSuffix;
HybridProvider provider;
if (floodgate && (provider = geyser.getHybridProvider()) instanceof FloodgateHybridProvider) {
byte[] encryptedData;
String addedData;
try {
BedrockSkinUploader skinUploader = geyser.getSkinUploader();
FloodgateCipher cipher = provider.getCipher();
FloodgateProvider provider = geyser.getFloodgateProvider();
try {
addedData = provider.onClientIntention(GeyserSession.this);
} catch (Exception exception) {
geyser.getLogger().error(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.encrypt_fail"), exception);
disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.floodgate.encryption_fail", getClientData().getLanguageCode()));
return;
}
String bedrockAddress = upstream.getAddress().getAddress().getHostAddress();
// both BungeeCord and Velocity remove the IPv6 scope (if there is one) for Spigot
int ipv6ScopeIndex = bedrockAddress.indexOf('%');
if (ipv6ScopeIndex != -1) {
bedrockAddress = bedrockAddress.substring(0, ipv6ScopeIndex);
}
encryptedData = cipher.encryptFromString(BedrockData.of(
clientData.getGameVersion(),
authData.name(),
authData.xuid(),
clientData.getDeviceOs().ordinal(),
clientData.getLanguageCode(),
clientData.getUiProfile().ordinal(),
clientData.getCurrentInputMode().ordinal(),
bedrockAddress,
skinUploader.getId(),
skinUploader.getVerifyCode()
).toString());
} catch (Exception e) {
geyser.getLogger().error(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.encrypt_fail"), e);
disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.floodgate.encryption_fail", getClientData().getLanguageCode()));
return;
}
addressSuffix = '\0' + new String(encryptedData, StandardCharsets.UTF_8);
if (addedData != null) {
addedData = '\0' + addedData;
} else {
addressSuffix = "";
addedData = "";
}
ClientIntentionPacket intentionPacket = event.getPacket();
@ -1009,7 +1045,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
address = intentionPacket.getHostname();
}
event.setPacket(intentionPacket.withHostname(address + addressSuffix));
event.setPacket(intentionPacket.withHostname(address + addedData));
}
}
@ -1480,11 +1516,6 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
upstream.sendPacket(chunkRadiusUpdatedPacket);
}
@Override
public InetSocketAddress socketAddress() {
return this.upstream.getAddress();
}
@Override
public boolean sendForm(@NonNull Form form) {
formCache.showForm(form);
@ -1497,22 +1528,6 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
return true;
}
/**
* @deprecated since Cumulus version 1.1, and will be removed when Cumulus 2.0 releases. Please use the new forms instead.
*/
@Deprecated
public void sendForm(org.geysermc.cumulus.Form<?> form) {
sendForm(form.newForm());
}
/**
* @deprecated since Cumulus version 1.1, and will be removed when Cumulus 2.0 releases. Please use the new forms instead.
*/
@Deprecated
public void sendForm(org.geysermc.cumulus.util.FormBuilder<?, ?> formBuilder) {
sendForm(formBuilder.build());
}
private void startGame() {
this.upstream.getCodecHelper().setItemDefinitions(this.itemMappings);
this.upstream.getCodecHelper().setBlockDefinitions((DefinitionRegistry) this.blockMappings); //FIXME
@ -1947,8 +1962,18 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
}
@Override
public boolean isLinked() {
return false; //todo
public @NonNull UUID identity() {
return authData.uuid();
}
@Override
public @NonNull InetAddress ip() {
return upstream.getAddress().getAddress();
}
@Override
public @MonotonicNonNull LinkedPlayer linkedPlayer() {
return null; //todo
}
@SuppressWarnings("ConstantConditions") // Need to enforce the parameter annotations

View file

@ -140,7 +140,7 @@ public class AdvancementsCache {
session.sendDownstreamPacket(new ServerboundSeenAdvancementsPacket());
}).validResultHandler((response) -> {
if (response.getClickedButtonId() < visibleAdvancements.size()) {
if (response.clickedButtonId() < visibleAdvancements.size()) {
GeyserAdvancement advancement = visibleAdvancements.get(response.clickedButtonId());
buildAndShowInfoForm(advancement);
} else {

View file

@ -118,7 +118,7 @@ public final class BedrockSkinUploader {
String value = data.get("value").asText();
String signature = data.get("signature").asText();
geyser.getHybridProvider().onSkinUpload(session, value, signature);
geyser.getFloodgateProvider().onSkinUpload(session, value, signature);
}
break;
case LOG_MESSAGE: