diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/net/minecraft/server/NetworkManager.java | 28 | ||||
-rw-r--r-- | src/main/java/net/minecraft/server/PlayerManager.java | 26 |
2 files changed, 29 insertions, 25 deletions
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index 230f7a15..b8b5f4b4 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -93,38 +93,32 @@ public class NetworkManager { try { Object object; - Packet packet; + Packet packet = null; // CraftBukkit int i; int[] aint; - if (!this.n.isEmpty() && (this.f == 0 || System.currentTimeMillis() - ((Packet) this.n.get(0)).timestamp >= (long) this.f)) { - object = this.g; - synchronized (this.g) { + // CraftBukkit start - thread safety and prioitizing packets in this.n (high prioirty queue) over those in this.o (low priority queue). + object = this.g; + synchronized (this.g) { + long time = System.currentTimeMillis(); + if (!this.n.isEmpty() && (this.f == 0 || time - ((Packet) this.n.get(0)).timestamp >= (long) this.f)) { packet = (Packet) this.n.remove(0); this.x -= packet.a() + 1; - } - - Packet.a(packet, this.output); - aint = e; - i = packet.b(); - aint[i] += packet.a() + 1; - flag = true; - } - - if (this.y-- <= 0 && !this.o.isEmpty() && (this.f == 0 || System.currentTimeMillis() - ((Packet) this.o.get(0)).timestamp >= (long) this.f)) { - object = this.g; - synchronized (this.g) { + } else if (this.y-- <= 0 && !this.o.isEmpty() && (this.f == 0 || time - ((Packet) this.o.get(0)).timestamp >= (long) this.f)) { packet = (Packet) this.o.remove(0); this.x -= packet.a() + 1; + this.y = 0; } + } + if (packet != null) { Packet.a(packet, this.output); aint = e; i = packet.b(); aint[i] += packet.a() + 1; - this.y = 0; flag = true; } + // CraftBukkit end return flag; } catch (Exception exception) { diff --git a/src/main/java/net/minecraft/server/PlayerManager.java b/src/main/java/net/minecraft/server/PlayerManager.java index fe171222..ff0aac45 100644 --- a/src/main/java/net/minecraft/server/PlayerManager.java +++ b/src/main/java/net/minecraft/server/PlayerManager.java @@ -3,6 +3,11 @@ package net.minecraft.server; import java.util.ArrayList; import java.util.List; +// CraftBukkit start +import java.util.Collections; +import java.util.Comparator; +// CraftBukkit end + public class PlayerManager { public List a = new ArrayList(); @@ -134,14 +139,6 @@ public class PlayerManager { int i1 = i - k; int j1 = j - l; - // CraftBukkit start - if (i1 > this.f || i1 < -this.f || j1 > this.f || j1 < -this.f) { - this.removePlayer(entityplayer); - this.addPlayer(entityplayer); - return; - } - // CraftBukkit end - if (i1 != 0 || j1 != 0) { for (int k1 = i - this.f; k1 <= i + this.f; ++k1) { for (int l1 = j - this.f; l1 <= j + this.f; ++l1) { @@ -161,6 +158,19 @@ public class PlayerManager { entityplayer.d = entityplayer.locX; entityplayer.e = entityplayer.locZ; + + // CraftBukkit start - send nearest chunks first + if (i1 > 1 || i1 < -1 || j1 > 1 || j1 < -1) { + final int x = i; + final int z = j; + List<ChunkCoordIntPair> chunksToSend = entityplayer.f; + Collections.sort(chunksToSend, new Comparator<ChunkCoordIntPair>() { + public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { + return Math.max(Math.abs(a.x-x), Math.abs(a.z-z)) - Math.max(Math.abs(b.x-x), Math.abs(b.z-z)); + } + }); + } + // CraftBukkit end } } } |