From 1bd859fad54e21bae3ba6782d16b0963047f3592 Mon Sep 17 00:00:00 2001 From: Jedediah Smith Date: Tue, 22 Dec 2015 21:55:00 -0600 Subject: [PATCH] Fix player leak from entity tracker and item frames https://github.com/OvercastNetwork/SportBukkit/commit/3005a20c5c31fa89e169bd1fae9c6f93f34e1945 --- ...sition-the-first-time-an-entity-is-s.patch | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/Spigot-Server-Patches/Send-absolute-position-the-first-time-an-entity-is-s.patch b/Spigot-Server-Patches/Send-absolute-position-the-first-time-an-entity-is-s.patch index 7759b9e79d..e9ba4e085a 100644 --- a/Spigot-Server-Patches/Send-absolute-position-the-first-time-an-entity-is-s.patch +++ b/Spigot-Server-Patches/Send-absolute-position-the-first-time-an-entity-is-s.patch @@ -9,10 +9,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -0,0 +0,0 @@ public class EntityTrackerEntry { + private boolean x; private boolean y; public boolean n; - public Set trackedPlayers = Sets.newHashSet(); -+ public Set freshViewers = Sets.newHashSet(); // PaperSpigot +- public Set trackedPlayers = Sets.newHashSet(); ++ // PaperSpigot start ++ // Replace trackedPlayers Set with a Map. The value is true until the player receives ++ // their first update (which is forced to have absolute coordinates), false afterward. ++ public java.util.Map trackedPlayerMap = new java.util.HashMap(); ++ public Set trackedPlayers = trackedPlayerMap.keySet(); ++ // PaperSpigot end public EntityTrackerEntry(Entity entity, int i, int j, boolean flag) { this.tracker = entity; @@ -26,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 - this.yLoc = j; - this.zLoc = k; - } -+ if (this.m > 0 || this.tracker instanceof EntityArrow) { // PaperSpigot - Move up ++ if (this.m > 0 || this.tracker instanceof EntityArrow) { // PaperSpigot - Moved up + // CraftBukkit start - Code moved from below + if (flag) { + this.xLoc = i; @@ -59,18 +65,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + if (object instanceof PacketPlayOutEntityTeleport) { + this.broadcast((Packet) object); + } else { -+ PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1, this.tracker.onGround); ++ PacketPlayOutEntityTeleport teleportPacket = null; + -+ for (EntityPlayer viewer : (Set) this.trackedPlayers) { -+ if (this.freshViewers.contains(viewer)) { -+ viewer.playerConnection.sendPacket(teleportPacket); ++ for (java.util.Map.Entry viewer : trackedPlayerMap.entrySet()) { ++ if (viewer.getValue()) { ++ viewer.setValue(false); ++ if (teleportPacket == null) { ++ teleportPacket = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1, this.tracker.onGround); ++ } ++ viewer.getKey().playerConnection.sendPacket(teleportPacket); + } else { -+ viewer.playerConnection.sendPacket((Packet) object); ++ viewer.getKey().playerConnection.sendPacket((Packet) object); + } + } + } -+ -+ this.freshViewers.clear(); + // PaperSpigot end } @@ -79,8 +87,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); // CraftBukkit end -+ this.freshViewers.add(entityplayer); // PaperSpigot - this.trackedPlayers.add(entityplayer); +- this.trackedPlayers.add(entityplayer); ++ this.trackedPlayerMap.put(entityplayer, true); // PaperBukkit Packet packet = this.c(); + entityplayer.playerConnection.sendPacket(packet); -- \ No newline at end of file