From 10d2d285d92556254d2374e2f9923c37ad4b670c Mon Sep 17 00:00:00 2001 From: Sotr Date: Sun, 19 Aug 2018 20:31:26 +0800 Subject: [PATCH] Upstream Paper --- .../server/mixin/bootstrap/Watchcat.java | 31 ++++++++++++------- .../java/net/minecraft/server/Entity.java | 1 + .../java/net/minecraft/server/PlayerList.java | 23 ++++++++++++-- .../net/minecraft/server/WorldServer.java | 6 ++-- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/sources/src/main/java/io/akarin/server/mixin/bootstrap/Watchcat.java b/sources/src/main/java/io/akarin/server/mixin/bootstrap/Watchcat.java index 2bf9a0e27..8cb8eba3c 100644 --- a/sources/src/main/java/io/akarin/server/mixin/bootstrap/Watchcat.java +++ b/sources/src/main/java/io/akarin/server/mixin/bootstrap/Watchcat.java @@ -22,8 +22,10 @@ import net.minecraft.server.MinecraftServer; public abstract class Watchcat extends Thread { @Shadow private static WatchdogThread instance; @Shadow private @Final long timeoutTime; - @Shadow private @Final long shortTimeout; // Paper - Timeout time for just printing a dump but not restarting - @Shadow private long lastShortDump; // Paper - Keep track of short dump times to avoid spamming console with short dumps + @Shadow private @Final long earlyWarningEvery; // Paper - Timeout time for just printing a dump but not restarting + @Shadow private @Final long earlyWarningDelay; // Paper + @Shadow public static volatile boolean hasStarted; // Paper + @Shadow private long lastEarlyWarning; // Paper - Keep track of short dump times to avoid spamming console with short dumps @Shadow private @Final boolean restart; @Shadow private volatile long lastTick; @Shadow private volatile boolean stopping; @@ -39,24 +41,23 @@ public abstract class Watchcat extends Thread { @Overwrite public void run() { while (!stopping) { - // - long currentTime = System.currentTimeMillis(); // Paper - do we REALLY need to call this method multiple times? - if (lastTick != 0 && currentTime > lastTick + shortTimeout && !Boolean.getBoolean("disable.watchdog")) // Paper - Add property to disable and short timeout + // Paper start + long currentTime = System.currentTimeMillis(); + if ( lastTick != 0 && currentTime > lastTick + earlyWarningEvery && !Boolean.getBoolean("disable.watchdog") ) { - // Paper start boolean isLongTimeout = currentTime > lastTick + timeoutTime; - // Don't spam short dumps - if (!isLongTimeout && currentTime < lastShortDump + shortTimeout) + // Don't spam early warning dumps + if (!isLongTimeout && (earlyWarningEvery <= 0 || !hasStarted || currentTime < lastEarlyWarning + earlyWarningEvery || currentTime < lastTick + earlyWarningDelay)) continue; - lastShortDump = currentTime; + lastEarlyWarning = currentTime; // Paper end Logger log = Bukkit.getServer().getLogger(); // Paper start - Different message when it's a short timeout if (isLongTimeout) { log.log(Level.SEVERE, "The server has stopped responding!"); - log.log(Level.SEVERE, "Please report this to https://github.com/Akarin-project/Akarin/issues"); + log.log(Level.SEVERE, "Please report this to https://github.com/Akarin-project/Akarin/issues"); // Akarin log.log(Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports"); - log.log(Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion()); + log.log(Level.SEVERE, "Akarin version: " + Bukkit.getServer().getVersion()); // Akarin // if (net.minecraft.server.World.haveWeSilencedAPhysicsCrash) { log.log(Level.SEVERE, "------------------------------"); @@ -75,7 +76,8 @@ public abstract class Watchcat extends Thread { } // Paper end } else { - log.log(Level.SEVERE, "The server has not responded for " + shortTimeout / 1000 + " seconds! Creating thread dump"); + // log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---"); // Akarin + log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump"); } // Paper end - Different message for short timeout log.log(Level.SEVERE, "------------------------------"); @@ -90,8 +92,13 @@ public abstract class Watchcat extends Thread { for (ThreadInfo thread : threads) { dumpThread(thread, log); } + } else { + // log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---"); // Akarin + } log.log(Level.SEVERE, "------------------------------"); + if ( isLongTimeout ) + { if (restart) { RestartCommand.restart(); } diff --git a/sources/src/main/java/net/minecraft/server/Entity.java b/sources/src/main/java/net/minecraft/server/Entity.java index 110d44ed3..843031901 100644 --- a/sources/src/main/java/net/minecraft/server/Entity.java +++ b/sources/src/main/java/net/minecraft/server/Entity.java @@ -1315,6 +1315,7 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper this.lastYaw -= 360.0F; } + world.getChunkAt((int) Math.floor(this.locX) >> 4, (int) Math.floor(this.locZ) >> 4); // Paper - ensure chunk is always loaded this.setPosition(this.locX, this.locY, this.locZ); this.setYawPitch(f, f1); } diff --git a/sources/src/main/java/net/minecraft/server/PlayerList.java b/sources/src/main/java/net/minecraft/server/PlayerList.java index 0ec255217..8aded3584 100644 --- a/sources/src/main/java/net/minecraft/server/PlayerList.java +++ b/sources/src/main/java/net/minecraft/server/PlayerList.java @@ -1252,8 +1252,25 @@ public abstract class PlayerList { } public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = this.players.get(j); + // Paper start - Use world list instead of server list where preferable + sendPacketNearby(entityhuman, d0, d1, d2, d3, i, null, packet); // Retained for compatibility + } + + public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, WorldServer world, Packet packet) { + sendPacketNearby(entityhuman, d0, d1, d2, d3, world.dimension, world, packet); + } + + public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, @Nullable WorldServer world, Packet packet) { + if (world == null && entityhuman != null && entityhuman.world instanceof WorldServer) { + world = (WorldServer) entityhuman.world; + } + + List players1 = world == null ? players : world.players; + for (int j = 0; j < players1.size(); ++j) { + EntityHuman entity = players1.get(j); + if (!(entity instanceof EntityPlayer)) continue; + EntityPlayer entityplayer = (EntityPlayer) players1.get(j); + // Paper end // CraftBukkit start - Test if player receiving packet can see the source of the packet if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { @@ -1261,7 +1278,7 @@ public abstract class PlayerList { } // CraftBukkit end - if (entityplayer != entityhuman && entityplayer.dimension == i) { + if (entityplayer != entityhuman && (world != null || entityplayer.dimension == i)) { // Paper double d4 = d0 - entityplayer.locX; double d5 = d1 - entityplayer.locY; double d6 = d2 - entityplayer.locZ; diff --git a/sources/src/main/java/net/minecraft/server/WorldServer.java b/sources/src/main/java/net/minecraft/server/WorldServer.java index c471b2672..11f6e7b9d 100644 --- a/sources/src/main/java/net/minecraft/server/WorldServer.java +++ b/sources/src/main/java/net/minecraft/server/WorldServer.java @@ -1291,7 +1291,7 @@ public class WorldServer extends World implements IAsyncTaskHandler { } // CraftBukkit end if (super.strikeLightning(entity)) { - this.server.getPlayerList().sendPacketNearby((EntityHuman) null, entity.locX, entity.locY, entity.locZ, 512.0D, dimension, new PacketPlayOutSpawnEntityWeather(entity)); // CraftBukkit - Use dimension + this.server.getPlayerList().sendPacketNearby((EntityHuman) null, entity.locX, entity.locY, entity.locZ, 512.0D, this, new PacketPlayOutSpawnEntityWeather(entity)); // CraftBukkit - Use dimension, // Paper - use world instead of dimension return true; } else { return false; @@ -1369,8 +1369,8 @@ public class WorldServer extends World implements IAsyncTaskHandler { BlockActionData blockactiondata = (BlockActionData) iterator.next(); if (this.a(blockactiondata)) { - // CraftBukkit - this.worldProvider.dimension -> this.dimension - this.server.getPlayerList().sendPacketNearby((EntityHuman) null, blockactiondata.a().getX(), blockactiondata.a().getY(), blockactiondata.a().getZ(), 64.0D, dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); + // CraftBukkit - this.worldProvider.dimension -> this.dimension, // Paper - dimension -> world + this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); } }