Paper/Spigot-Server-Patches/0401-Optimize-World-Time-Updates.patch
Zach Brown 8ed2992da9
Make scan-for-legacy-ender-dragon config work again
Portion of diff was dropped in the mappings update commit.

Also remove the option to remove invalid statistics. The server will
automatically do this now as of... 1.13?, our option wasn't even doing anything.
2018-12-14 20:17:27 -05:00

46 lines
2.6 KiB
Diff

From ce53ef45117823d14fb68349adbf192cb6b62b94 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Fri, 2 Nov 2018 23:11:51 -0400
Subject: [PATCH] Optimize World Time Updates
Splits time updates into incremental updates as well as does
the updates per world, so that we can re-use the same packet
object for every player unless they have per-player time enabled.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 17ae26cb8..2023ee118 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1038,12 +1038,24 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati
MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot
// Send time updates to everyone, it will get the right time from the world the player is in.
- if (this.ticks % 20 == 0) {
- for (int i = 0; i < this.getPlayerList().players.size(); ++i) {
- EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i);
- entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time
+ // Paper start - optimize time updates
+ for (final WorldServer world : this.getWorlds()) {
+ final boolean doDaylight = world.getGameRules().getBoolean("doDaylightCycle");
+ final long dayTime = world.getDayTime();
+ long worldTime = world.getTime();
+ final PacketPlayOutUpdateTime worldPacket = new PacketPlayOutUpdateTime(worldTime, dayTime, doDaylight);
+ for (EntityHuman entityhuman : world.players) {
+ if (!(entityhuman instanceof EntityPlayer) || (ticks + entityhuman.getId()) % 20 != 0) {
+ continue;
+ }
+ EntityPlayer entityplayer = (EntityPlayer) entityhuman;
+ long playerTime = entityplayer.getPlayerTime();
+ PacketPlayOutUpdateTime packet = (playerTime == dayTime) ? worldPacket :
+ new PacketPlayOutUpdateTime(worldTime, playerTime, doDaylight);
+ entityplayer.playerConnection.sendPacket(packet); // Add support for per player time
}
}
+ // Paper end
MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot
// WorldServer worldserver; // CraftBukkit - dropped down
--
2.20.0