From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mykyta Komarnytskyy <nkomarn@hotmail.com>
Date: Sat, 24 Oct 2020 21:03:53 -0500
Subject: [PATCH] Smarter statistics ticking

In vanilla, statistics that count time spent for an action (i.e. time played or sneak time) are incremented every tick. This is retarded. With this patch and a configured interval of 20, the statistics are only ticked every 20th tick and are incremented by 20 ticks at a time. This means a lot less ticking with the same accurate counting.

With an interval of 20, this patch saves roughly 3ms per tick on a server w/ 80 players online.

diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index 15a2065abf7c187a9b92bd743240085e2a61a906..1730108aa67802ed15407c45542b6223ca86634f 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -175,18 +175,23 @@ public abstract class EntityHuman extends EntityLiving {
         this.p();
         if (!this.world.isClientSide) {
             this.foodData.a(this);
-            this.a(StatisticList.PLAY_ONE_MINUTE);
+            // Yatopia start
+            int interval = org.yatopiamc.yatopia.server.YatopiaConfig.playerTimeStatisticsInterval;
+            if (ticksLived % interval == 0) {
+            this.a(StatisticList.PLAY_ONE_MINUTE, interval);
+            // Yatopia end
             if (this.isAlive()) {
-                this.a(StatisticList.TIME_SINCE_DEATH);
+                this.a(StatisticList.TIME_SINCE_DEATH, interval); // Yatopia
             }
 
             if (this.bx()) {
-                this.a(StatisticList.SNEAK_TIME);
+                this.a(StatisticList.SNEAK_TIME, interval); // Yatopia
             }
 
             if (!this.isSleeping()) {
-                this.a(StatisticList.TIME_SINCE_REST);
+                this.a(StatisticList.TIME_SINCE_REST, interval); // Yatopia
             }
+            } // Yatopia
         }
 
         int i = 29999999;
diff --git a/src/main/java/org/yatopiamc/yatopia/server/YatopiaConfig.java b/src/main/java/org/yatopiamc/yatopia/server/YatopiaConfig.java
index 81ab5afa7bd397266d2afe77426d2e629529aa1a..045ace1444b4db8fa5fab09f970de7a696c56ab8 100644
--- a/src/main/java/org/yatopiamc/yatopia/server/YatopiaConfig.java
+++ b/src/main/java/org/yatopiamc/yatopia/server/YatopiaConfig.java
@@ -230,4 +230,9 @@ public class YatopiaConfig {
         checkFlying = getBoolean("settings.checks.flight", checkFlying);
         checkVehicleFlying = getBoolean("settings.checks.vehicle-flight", checkVehicleFlying);
     }
+
+    public static int playerTimeStatisticsInterval = 1;
+    private static void intervals() {
+        playerTimeStatisticsInterval = Math.max(1, getInt("settings.intervals.player-time-statistics", 1));
+    }
 }
