ServerStatsCounter.java

net.minecraft.stats.ServerStatsCounter

信息

  • 全限定名:net.minecraft.stats.ServerStatsCounter
  • 类型:public class
  • 包:net.minecraft.stats
  • 源码路径:src/main/java/net/minecraft/stats/ServerStatsCounter.java
  • 起始行号:L41
  • 继承:StatsCounter
  • 职责:

    TODO

字段/常量

  • GSON

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

      TODO

  • LOGGER

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

      TODO

  • STATS_CODEC

    • 类型: Codec<Map<Stat<?>,Integer>>
    • 修饰符: private static final
    • 源码定位: L44
    • 说明:

      TODO

  • file

    • 类型: Path
    • 修饰符: private final
    • 源码定位: L52
    • 说明:

      TODO

  • dirty

    • 类型: Set<Stat<?>>
    • 修饰符: private final
    • 源码定位: L53
    • 说明:

      TODO

内部类/嵌套类型

构造器

public ServerStatsCounter(MinecraftServer server, Path file) @ L66

  • 构造器名:ServerStatsCounter
  • 源码定位:L66
  • 修饰符:public

参数:

  • server: MinecraftServer
  • file: Path

说明:

TODO

方法

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

private static <T> Codec<Map<Stat<?>,Integer>> createTypedStatsCodec(StatType<T> type) @ L55

  • 方法名:createTypedStatsCodec
  • 源码定位:L55
  • 返回类型: Codec<Map<Stat<?>,Integer>>
  • 修饰符:private static

参数:

  • type: StatType

说明:

TODO

public void save() @ L80

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

参数:

说明:

TODO

public void setValue(Player player, Stat<?> stat, int count) @ L92

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

参数:

  • player: Player
  • stat: Stat<?>
  • count: int

说明:

TODO

private Set<Stat<?>> getDirty() @ L98

  • 方法名:getDirty
  • 源码定位:L98
  • 返回类型:Set<Stat<?>>
  • 修饰符:private

参数:

说明:

TODO

public void parse(DataFixer fixerUpper, JsonElement element) @ L104

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

参数:

  • fixerUpper: DataFixer
  • element: JsonElement

说明:

TODO

protected JsonElement toJson() @ L115

  • 方法名:toJson
  • 源码定位:L115
  • 返回类型:JsonElement
  • 修饰符:protected

参数:

说明:

TODO

public void markAllDirty() @ L122

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

参数:

说明:

TODO

public void sendStats(ServerPlayer player) @ L126

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

参数:

  • player: ServerPlayer

说明:

TODO

代码

public class ServerStatsCounter extends StatsCounter {
    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final Codec<Map<Stat<?>, Integer>> STATS_CODEC = Codec.dispatchedMap(
            BuiltInRegistries.STAT_TYPE.byNameCodec(), Util.memoize(ServerStatsCounter::createTypedStatsCodec)
        )
        .xmap(groupedStats -> {
            Map<Stat<?>, Integer> stats = new HashMap<>();
            groupedStats.forEach((type, values) -> stats.putAll((Map<? extends Stat<?>, ? extends Integer>)values));
            return stats;
        }, map -> map.entrySet().stream().collect(Collectors.groupingBy(entry -> entry.getKey().getType(), Util.toMap())));
    private final Path file;
    private final Set<Stat<?>> dirty = Sets.newHashSet();
 
    private static <T> Codec<Map<Stat<?>, Integer>> createTypedStatsCodec(StatType<T> type) {
        Codec<T> valueCodec = type.getRegistry().byNameCodec();
        Codec<Stat<?>> statCodec = valueCodec.flatComapMap(
            type::get,
            stat -> stat.getType() == type
                ? DataResult.success((T)stat.getValue())
                : DataResult.error(() -> "Expected type " + type + ", but got " + stat.getType())
        );
        return Codec.unboundedMap(statCodec, Codec.INT);
    }
 
    public ServerStatsCounter(MinecraftServer server, Path file) {
        this.file = file;
        if (Files.isRegularFile(file)) {
            try (Reader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) {
                JsonElement element = StrictJsonParser.parse(reader);
                this.parse(server.getFixerUpper(), element);
            } catch (IOException var8) {
                LOGGER.error("Couldn't read statistics file {}", file, var8);
            } catch (JsonParseException var9) {
                LOGGER.error("Couldn't parse statistics file {}", file, var9);
            }
        }
    }
 
    public void save() {
        try {
            FileUtil.createDirectoriesSafe(this.file.getParent());
 
            try (Writer writer = Files.newBufferedWriter(this.file, StandardCharsets.UTF_8)) {
                GSON.toJson(this.toJson(), GSON.newJsonWriter(writer));
            }
        } catch (JsonIOException | IOException var6) {
            LOGGER.error("Couldn't save stats to {}", this.file, var6);
        }
    }
 
    @Override
    public void setValue(Player player, Stat<?> stat, int count) {
        super.setValue(player, stat, count);
        this.dirty.add(stat);
    }
 
    private Set<Stat<?>> getDirty() {
        Set<Stat<?>> result = Sets.newHashSet(this.dirty);
        this.dirty.clear();
        return result;
    }
 
    public void parse(DataFixer fixerUpper, JsonElement element) {
        Dynamic<JsonElement> data = new Dynamic<>(JsonOps.INSTANCE, element);
        data = DataFixTypes.STATS.updateToCurrentVersion(fixerUpper, data, NbtUtils.getDataVersion(data, 1343));
        this.stats
            .putAll(
                STATS_CODEC.parse(data.get("stats").orElseEmptyMap())
                    .resultOrPartial(error -> LOGGER.error("Failed to parse statistics for {}: {}", this.file, error))
                    .orElse(Map.of())
            );
    }
 
    protected JsonElement toJson() {
        JsonObject result = new JsonObject();
        result.add("stats", STATS_CODEC.encodeStart(JsonOps.INSTANCE, this.stats).getOrThrow());
        result.addProperty("DataVersion", SharedConstants.getCurrentVersion().dataVersion().version());
        return result;
    }
 
    public void markAllDirty() {
        this.dirty.addAll(this.stats.keySet());
    }
 
    public void sendStats(ServerPlayer player) {
        Object2IntMap<Stat<?>> statsToSend = new Object2IntOpenHashMap<>();
 
        for (Stat<?> stat : this.getDirty()) {
            statsToSend.put(stat, this.getValue(stat));
        }
 
        player.connection.send(new ClientboundAwardStatsPacket(statsToSend));
    }
}

引用的其他类

  • SharedConstants

    • 引用位置: 方法调用
    • 关联成员: SharedConstants.getCurrentVersion()
  • NbtUtils

    • 引用位置: 方法调用
    • 关联成员: NbtUtils.getDataVersion()
  • ClientboundAwardStatsPacket

    • 引用位置: 构造调用
    • 关联成员: ClientboundAwardStatsPacket()
  • MinecraftServer

    • 引用位置: 参数
  • ServerPlayer

    • 引用位置: 参数
  • Stat

    • 引用位置: 参数/字段/返回值
  • StatType

    • 引用位置: 参数
  • StatsCounter

    • 引用位置: 继承
  • FileUtil

    • 引用位置: 方法调用
    • 关联成员: FileUtil.createDirectoriesSafe()
  • StrictJsonParser

    • 引用位置: 方法调用
    • 关联成员: StrictJsonParser.parse()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.memoize(), Util.toMap()
  • Player

    • 引用位置: 参数