RealmsConnect.java

net.minecraft.realms.RealmsConnect

信息

  • 全限定名:net.minecraft.realms.RealmsConnect
  • 类型:public class
  • 包:net.minecraft.realms
  • 源码路径:src/main/java/net/minecraft/realms/RealmsConnect.java
  • 起始行号:L27
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L28
    • 说明:

      TODO

  • onlineScreen

    • 类型: Screen
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

  • aborted

    • 类型: boolean
    • 修饰符: private volatile
    • 源码定位: L30
    • 说明:

      TODO

  • connection

    • 类型: Connection
    • 修饰符: private
    • 源码定位: L31
    • 说明:

      TODO

内部类/嵌套类型

构造器

public RealmsConnect(Screen onlineScreen) @ L33

  • 构造器名:RealmsConnect
  • 源码定位:L33
  • 修饰符:public

参数:

  • onlineScreen: Screen

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void connect(RealmsServer server, ServerAddress hostAndPort) @ L37

  • 方法名:connect
  • 源码定位:L37
  • 返回类型:void
  • 修饰符:public

参数:

  • server: RealmsServer
  • hostAndPort: ServerAddress

说明:

TODO

public void abort() @ L121

  • 方法名:abort
  • 源码定位:L121
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void tick() @ L129

  • 方法名:tick
  • 源码定位:L129
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class RealmsConnect {
    private static final Logger LOGGER = LogUtils.getLogger();
    private final Screen onlineScreen;
    private volatile boolean aborted;
    private @Nullable Connection connection;
 
    public RealmsConnect(Screen onlineScreen) {
        this.onlineScreen = onlineScreen;
    }
 
    public void connect(RealmsServer server, ServerAddress hostAndPort) {
        final Minecraft minecraft = Minecraft.getInstance();
        minecraft.prepareForMultiplayer();
        minecraft.getNarrator().saySystemNow(Component.translatable("mco.connect.success"));
        final String hostname = hostAndPort.getHost();
        final int port = hostAndPort.getPort();
        (new Thread("Realms-connect-task") {
                {
                    Objects.requireNonNull(RealmsConnect.this);
                }
 
                @Override
                public void run() {
                    InetSocketAddress address = null;
 
                    try {
                        address = new InetSocketAddress(hostname, port);
                        if (RealmsConnect.this.aborted) {
                            return;
                        }
 
                        RealmsConnect.this.connection = Connection.connectToServer(
                            address, EventLoopGroupHolder.remote(minecraft.options.useNativeTransport()), minecraft.getDebugOverlay().getBandwidthLogger()
                        );
                        if (RealmsConnect.this.aborted) {
                            return;
                        }
 
                        ClientHandshakePacketListenerImpl clientHandshakePacketListener = new ClientHandshakePacketListenerImpl(
                            RealmsConnect.this.connection,
                            minecraft,
                            server.toServerData(hostname),
                            RealmsConnect.this.onlineScreen,
                            false,
                            null,
                            status -> {},
                            new LevelLoadTracker(),
                            null
                        );
                        if (server.isMinigameActive()) {
                            clientHandshakePacketListener.setMinigameName(server.minigameName);
                        }
 
                        if (RealmsConnect.this.aborted) {
                            return;
                        }
 
                        RealmsConnect.this.connection.initiateServerboundPlayConnection(hostname, port, clientHandshakePacketListener);
                        if (RealmsConnect.this.aborted) {
                            return;
                        }
 
                        RealmsConnect.this.connection.send(new ServerboundHelloPacket(minecraft.getUser().getName(), minecraft.getUser().getProfileId()));
                        minecraft.updateReportEnvironment(ReportEnvironment.realm(server));
                        minecraft.quickPlayLog()
                            .setWorldData(QuickPlayLog.Type.REALMS, String.valueOf(server.id), Objects.requireNonNullElse(server.name, "unknown"));
                        minecraft.getDownloadedPackSource()
                            .configureForServerControl(RealmsConnect.this.connection, ServerPackManager.PackPromptStatus.ALLOWED);
                    } catch (Exception var5) {
                        minecraft.getDownloadedPackSource().cleanupAfterDisconnect();
                        if (RealmsConnect.this.aborted) {
                            return;
                        }
 
                        RealmsConnect.LOGGER.error("Couldn't connect to world", (Throwable)var5);
                        String message = var5.toString();
                        if (address != null) {
                            String filter = address + ":" + port;
                            message = message.replaceAll(filter, "");
                        }
 
                        DisconnectedScreen screen = new DisconnectedScreen(
                            RealmsConnect.this.onlineScreen,
                            Component.translatable("mco.connect.failed"),
                            Component.translatable("disconnect.genericReason", message),
                            CommonComponents.GUI_BACK
                        );
                        minecraft.execute(() -> minecraft.setScreen(screen));
                    }
                }
            })
            .start();
    }
 
    public void abort() {
        this.aborted = true;
        if (this.connection != null && this.connection.isConnected()) {
            this.connection.disconnect(Component.translatable("disconnect.genericReason"));
            this.connection.handleDisconnection();
        }
    }
 
    public void tick() {
        if (this.connection != null) {
            if (this.connection.isConnected()) {
                this.connection.tick();
            } else {
                this.connection.handleDisconnection();
            }
        }
    }
}

引用的其他类