--- a/net/minecraft/stats/ServerStatsCounter.java +++ b/net/minecraft/stats/ServerStatsCounter.java @@ -1,3 +1,4 @@ +// mc-dev import package net.minecraft.stats; import com.google.common.collect.Maps; @@ -57,9 +58,22 @@ } } + // Paper start - Moved after stat fetching for player state file + // Moves the loading after vanilla loading, so it overrides the values. + // Disables saving any forced stats, so it stays at the same value (without enabling disableStatSaving) + // Fixes stat initialization to not cause a NullPointerException + // Spigot start + for ( Map.Entry entry : org.spigotmc.SpigotConfig.forcedStats.entrySet() ) + { + Stat wrapper = Stats.CUSTOM.get(java.util.Objects.requireNonNull(BuiltInRegistries.CUSTOM_STAT.getValue(entry.getKey()))); // Paper - ensured by SpigotConfig#stats + this.stats.put( wrapper, entry.getValue().intValue() ); + } + // Spigot end + // Paper end - Moved after stat fetching for player state file } public void save() { + if ( org.spigotmc.SpigotConfig.disableStatSaving ) return; // Spigot try { FileUtils.writeStringToFile(this.file, this.toJson()); } catch (IOException ioexception) { @@ -70,6 +84,8 @@ @Override public void setValue(Player player, Stat stat, int value) { + if ( org.spigotmc.SpigotConfig.disableStatSaving ) return; // Spigot + if (stat.getType() == Stats.CUSTOM && stat.getValue() instanceof final ResourceLocation resourceLocation && org.spigotmc.SpigotConfig.forcedStats.get(resourceLocation) != null) return; // Paper - disable saving forced stats super.setValue(player, stat, value); this.dirty.add(stat); } @@ -158,13 +174,12 @@ } private Optional> getStat(StatType type, String id) { - Optional optional = Optional.ofNullable(ResourceLocation.tryParse(id)); - Registry iregistry = type.getRegistry(); + // CraftBukkit - decompile error start + Optional optional = Optional.ofNullable(ResourceLocation.tryParse(id)); + Registry iregistry = type.getRegistry(); - Objects.requireNonNull(iregistry); - optional = optional.flatMap(iregistry::getOptional); - Objects.requireNonNull(type); - return optional.map(type::get); + return optional.flatMap(iregistry::getOptional).map(type::get); + // CraftBukkit - decompile error end } private static CompoundTag fromJson(JsonObject json) {