mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Updated Gradle to 8.3 and made Geyser work with latest Floodgate
This commit is contained in:
parent
a4ee73d1ef
commit
a894ce9824
52 changed files with 206 additions and 1656 deletions
|
@ -8,6 +8,7 @@ plugins {
|
|||
|
||||
dependencies {
|
||||
api(libs.floodgate.core)
|
||||
api(libs.floodgate.isolation)
|
||||
annotationProcessor(libs.floodgate.core)
|
||||
api(projects.api)
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -252,6 +252,6 @@ public class SessionPlayerEntity extends PlayerEntity {
|
|||
|
||||
@Override
|
||||
public UUID getTabListUuid() {
|
||||
return session.getAuthData().uuid();
|
||||
return session.identity();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue