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.getCurrentVersion()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
NbtUtils.getDataVersion()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ClientboundAwardStatsPacket()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FileUtil.createDirectoriesSafe()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StrictJsonParser.parse()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.memoize(), Util.toMap()
- 引用位置:
-
- 引用位置:
参数
- 引用位置: