--- a/net/minecraft/stats/ServerStatsCounter.java
+++ b/net/minecraft/stats/ServerStatsCounter.java
@@ -70,9 +_,21 @@
                 LOGGER.error("Couldn't parse statistics file {}", file, var5);
             }
         }
+        // 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<net.minecraft.resources.ResourceLocation, Integer> entry : org.spigotmc.SpigotConfig.forcedStats.entrySet()) {
+            Stat<net.minecraft.resources.ResourceLocation> 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 var2) {
@@ -82,6 +_,8 @@
 
     @Override
     public void setValue(Player player, Stat<?> stat, int i) {
+        if (org.spigotmc.SpigotConfig.disableStatSaving) return; // Spigot
+        if (stat.getType() == Stats.CUSTOM && stat.getValue() instanceof final net.minecraft.resources.ResourceLocation resourceLocation && org.spigotmc.SpigotConfig.forcedStats.get(resourceLocation) != null) return; // Paper - disable saving forced stats
         super.setValue(player, stat, i);
         this.dirty.add(stat);
     }
