summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTravis Watkins <amaranth@ubuntu.com>2012-10-13 15:27:45 -0500
committerTravis Watkins <amaranth@ubuntu.com>2012-10-13 15:27:45 -0500
commit506a1a0765b34574bef661f622fd0ab654cea8fb (patch)
tree67a027d6dcae5e63cae2d4f7a3087f95cde074bb
parentcb2f8244e9d6ad8861706bf4dc771ac8e5104438 (diff)
downloadcraftbukkit-506a1a0765b34574bef661f622fd0ab654cea8fb.tar
craftbukkit-506a1a0765b34574bef661f622fd0ab654cea8fb.tar.gz
craftbukkit-506a1a0765b34574bef661f622fd0ab654cea8fb.tar.lz
craftbukkit-506a1a0765b34574bef661f622fd0ab654cea8fb.tar.xz
craftbukkit-506a1a0765b34574bef661f622fd0ab654cea8fb.zip
Ensure entity isn't destroyed when trying to show it. Fixes BUKKIT-2038
If two players (or a player and any other entity) are teleported to the same location in the same tick they will both get added to the other's destroy queue then have a new entity spawn packet sent. Next tick the destroy queue will be processed and they will then be invisible to each other. To prevent this situation we remove the entity from the destroy queue when sending out a spawn packet for them.
-rw-r--r--src/main/java/net/minecraft/server/EntityTrackerEntry.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java1
2 files changed, 4 insertions, 3 deletions
diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
index c504d35f..d735e8e0 100644
--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
+++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
@@ -234,12 +234,14 @@ public class EntityTrackerEntry {
if (d0 >= (double) (-this.b) && d0 <= (double) this.b && d1 >= (double) (-this.b) && d1 <= (double) this.b) {
if (!this.trackedPlayers.contains(entityplayer) && this.d(entityplayer)) {
// CraftBukkit start
- if (tracker instanceof EntityPlayer) {
- Player player = ((EntityPlayer) tracker).getBukkitEntity();
+ if (this.tracker instanceof EntityPlayer) {
+ Player player = ((EntityPlayer) this.tracker).getBukkitEntity();
if (!entityplayer.getBukkitEntity().canSee(player)) {
return;
}
}
+
+ entityplayer.g.remove(Integer.valueOf(this.tracker.id)); // Should be called destroyQueue
// CraftBukkit end
this.trackedPlayers.add(entityplayer);
Packet packet = this.b();
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 1b88232b..4e6dfb5c 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -631,7 +631,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
EntityTracker tracker = ((WorldServer) entity.world).tracker;
EntityPlayer other = ((CraftPlayer) player).getHandle();
EntityTrackerEntry entry = (EntityTrackerEntry) tracker.trackedEntities.get(other.id);
- getHandle().g.remove(Integer.valueOf(other.id)); // Should be called destroyQueue
if (entry != null && !entry.trackedPlayers.contains(getHandle())) {
entry.updatePlayer(getHandle());
}