ServerList.java

net.minecraft.client.multiplayer.ServerList

信息

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

    TODO

字段/常量

  • LOGGER

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

      TODO

  • IO_EXECUTOR

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

      TODO

  • MAX_HIDDEN_SERVERS

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

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L25
    • 说明:

      TODO

  • serverList

    • 类型: List<ServerData>
    • 修饰符: private final
    • 源码定位: L26
    • 说明:

      TODO

  • hiddenServerList

    • 类型: List<ServerData>
    • 修饰符: private final
    • 源码定位: L27
    • 说明:

      TODO

内部类/嵌套类型

构造器

public ServerList(Minecraft minecraft) @ L29

  • 构造器名:ServerList
  • 源码定位:L29
  • 修饰符:public

参数:

  • minecraft: Minecraft

说明:

TODO

方法

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

public void load() @ L33

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

参数:

说明:

TODO

public void save() @ L55

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

参数:

说明:

TODO

public ServerData get(int index) @ L84

  • 方法名:get
  • 源码定位:L84
  • 返回类型:ServerData
  • 修饰符:public

参数:

  • index: int

说明:

TODO

public ServerData get(String ip) @ L88

  • 方法名:get
  • 源码定位:L88
  • 返回类型:ServerData
  • 修饰符:public

参数:

  • ip: String

说明:

TODO

public ServerData unhide(String ip) @ L104

  • 方法名:unhide
  • 源码定位:L104
  • 返回类型:ServerData
  • 修饰符:public

参数:

  • ip: String

说明:

TODO

public void remove(ServerData thing) @ L117

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

参数:

  • thing: ServerData

说明:

TODO

public void add(ServerData server, boolean hidden) @ L123

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

参数:

  • server: ServerData
  • hidden: boolean

说明:

TODO

public int size() @ L135

  • 方法名:size
  • 源码定位:L135
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public void swap(int a, int b) @ L139

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

参数:

  • a: int
  • b: int

说明:

TODO

public void replace(int id, ServerData data) @ L146

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

参数:

  • id: int
  • data: ServerData

说明:

TODO

private static boolean set(ServerData data, List<ServerData> list) @ L150

  • 方法名:set
  • 源码定位:L150
  • 返回类型:boolean
  • 修饰符:private static

参数:

  • data: ServerData
  • list: List

说明:

TODO

public static void saveSingleServer(ServerData data) @ L162

  • 方法名:saveSingleServer
  • 源码定位:L162
  • 返回类型:void
  • 修饰符:public static

参数:

  • data: ServerData

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ServerList {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final ConsecutiveExecutor IO_EXECUTOR = new ConsecutiveExecutor(Util.backgroundExecutor(), "server-list-io");
    private static final int MAX_HIDDEN_SERVERS = 16;
    private final Minecraft minecraft;
    private final List<ServerData> serverList = Lists.newArrayList();
    private final List<ServerData> hiddenServerList = Lists.newArrayList();
 
    public ServerList(Minecraft minecraft) {
        this.minecraft = minecraft;
    }
 
    public void load() {
        try {
            this.serverList.clear();
            this.hiddenServerList.clear();
            CompoundTag tag = NbtIo.read(this.minecraft.gameDirectory.toPath().resolve("servers.dat"));
            if (tag == null) {
                return;
            }
 
            tag.getListOrEmpty("servers").compoundStream().forEach(serverTag -> {
                ServerData serverData = ServerData.read(serverTag);
                if (serverTag.getBooleanOr("hidden", false)) {
                    this.hiddenServerList.add(serverData);
                } else {
                    this.serverList.add(serverData);
                }
            });
        } catch (Exception var2) {
            LOGGER.error("Couldn't load server list", (Throwable)var2);
        }
    }
 
    public void save() {
        try {
            ListTag serverTags = new ListTag();
 
            for (ServerData server : this.serverList) {
                CompoundTag serverTag = server.write();
                serverTag.putBoolean("hidden", false);
                serverTags.add(serverTag);
            }
 
            for (ServerData server : this.hiddenServerList) {
                CompoundTag serverTag = server.write();
                serverTag.putBoolean("hidden", true);
                serverTags.add(serverTag);
            }
 
            CompoundTag tag = new CompoundTag();
            tag.put("servers", serverTags);
            Path gameDirectoryPath = this.minecraft.gameDirectory.toPath();
            Path newFile = Files.createTempFile(gameDirectoryPath, "servers", ".dat");
            NbtIo.write(tag, newFile);
            Path oldFile = gameDirectoryPath.resolve("servers.dat_old");
            Path currentFile = gameDirectoryPath.resolve("servers.dat");
            Util.safeReplaceFile(currentFile, newFile, oldFile);
        } catch (Exception var7) {
            LOGGER.error("Couldn't save server list", (Throwable)var7);
        }
    }
 
    public ServerData get(int index) {
        return this.serverList.get(index);
    }
 
    public @Nullable ServerData get(String ip) {
        for (ServerData serverData : this.serverList) {
            if (serverData.ip.equals(ip)) {
                return serverData;
            }
        }
 
        for (ServerData serverDatax : this.hiddenServerList) {
            if (serverDatax.ip.equals(ip)) {
                return serverDatax;
            }
        }
 
        return null;
    }
 
    public @Nullable ServerData unhide(String ip) {
        for (int i = 0; i < this.hiddenServerList.size(); i++) {
            ServerData serverData = this.hiddenServerList.get(i);
            if (serverData.ip.equals(ip)) {
                this.hiddenServerList.remove(i);
                this.serverList.add(serverData);
                return serverData;
            }
        }
 
        return null;
    }
 
    public void remove(ServerData thing) {
        if (!this.serverList.remove(thing)) {
            this.hiddenServerList.remove(thing);
        }
    }
 
    public void add(ServerData server, boolean hidden) {
        if (hidden) {
            this.hiddenServerList.add(0, server);
 
            while (this.hiddenServerList.size() > 16) {
                this.hiddenServerList.remove(this.hiddenServerList.size() - 1);
            }
        } else {
            this.serverList.add(server);
        }
    }
 
    public int size() {
        return this.serverList.size();
    }
 
    public void swap(int a, int b) {
        ServerData swap = this.get(a);
        this.serverList.set(a, this.get(b));
        this.serverList.set(b, swap);
        this.save();
    }
 
    public void replace(int id, ServerData data) {
        this.serverList.set(id, data);
    }
 
    private static boolean set(ServerData data, List<ServerData> list) {
        for (int i = 0; i < list.size(); i++) {
            ServerData target = list.get(i);
            if (Objects.equals(target.name, data.name) && target.ip.equals(data.ip)) {
                list.set(i, data);
                return true;
            }
        }
 
        return false;
    }
 
    public static void saveSingleServer(ServerData data) {
        IO_EXECUTOR.schedule(() -> {
            ServerList list = new ServerList(Minecraft.getInstance());
            list.load();
            if (!set(data, list.serverList)) {
                set(data, list.hiddenServerList);
            }
 
            list.save();
        });
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 参数/字段/方法调用
    • 关联成员: Minecraft.getInstance()
  • ServerData

    • 引用位置: 参数/字段/方法调用/返回值
    • 关联成员: ServerData.read()
  • CompoundTag

    • 引用位置: 构造调用
    • 关联成员: CompoundTag()
  • ListTag

    • 引用位置: 构造调用
    • 关联成员: ListTag()
  • NbtIo

    • 引用位置: 方法调用
    • 关联成员: NbtIo.read(), NbtIo.write()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.backgroundExecutor(), Util.safeReplaceFile()
  • ConsecutiveExecutor

    • 引用位置: 字段/构造调用
    • 关联成员: ConsecutiveExecutor()