30f02fe6e5
I think its pretty clear that no one uses this given that it didn't work at all before
97 lines
4.5 KiB
Diff
97 lines
4.5 KiB
Diff
From ed74eec99de709a341951b574c4fe0f53c3b77d8 Mon Sep 17 00:00:00 2001
|
|
From: Jedediah Smith <jedediah@silencegreys.com>
|
|
Date: Wed, 2 Mar 2016 23:13:07 -0600
|
|
Subject: [PATCH] Send absolute position the first time an entity is seen
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
index f8570a8..1602dff 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
|
|
@@ -41,7 +41,12 @@ public class EntityTrackerEntry {
|
|
private boolean x;
|
|
private boolean y;
|
|
public boolean b;
|
|
- public Set<EntityPlayer> trackedPlayers = Sets.newHashSet();
|
|
+ // Paper 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<EntityPlayer, Boolean> trackedPlayerMap = new java.util.HashMap<EntityPlayer, Boolean>();
|
|
+ public Set<EntityPlayer> trackedPlayers = trackedPlayerMap.keySet();
|
|
+ // Paper end
|
|
|
|
public EntityTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
|
this.tracker = entity;
|
|
@@ -126,20 +131,22 @@ public class EntityTrackerEntry {
|
|
boolean flag = k1 * k1 + l1 * l1 + i2 * i2 >= 128L || this.a % 60 == 0;
|
|
boolean flag1 = Math.abs(i1 - this.yRot) >= 1 || Math.abs(j1 - this.xRot) >= 1;
|
|
|
|
- // CraftBukkit start - Code moved from below
|
|
- if (flag) {
|
|
- this.xLoc = j;
|
|
- this.yLoc = k;
|
|
- this.zLoc = l;
|
|
- }
|
|
+ if (this.a > 0 || this.tracker instanceof EntityArrow) { // Paper - Moved up
|
|
+ // CraftBukkit start - Code moved from below
|
|
+ if (flag) {
|
|
+ this.xLoc = j;
|
|
+ this.yLoc = k;
|
|
+ this.zLoc = l;
|
|
+ }
|
|
|
|
- if (flag1) {
|
|
+ if (flag1) {
|
|
+ this.yRot = i1;
|
|
+ this.xRot = j1;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
this.yRot = i1;
|
|
this.xRot = j1;
|
|
- }
|
|
// CraftBukkit end
|
|
-
|
|
- if (this.a > 0 || this.tracker instanceof EntityArrow) {
|
|
if (k1 >= -32768L && k1 < 32768L && l1 >= -32768L && l1 < 32768L && i2 >= -32768L && i2 < 32768L && this.v <= 400 && !this.x && this.y == this.tracker.onGround) {
|
|
if ((!flag || !flag1) && !(this.tracker instanceof EntityArrow)) {
|
|
if (flag) {
|
|
@@ -185,7 +192,26 @@ public class EntityTrackerEntry {
|
|
}
|
|
|
|
if (object != null) {
|
|
- this.broadcast((Packet) object);
|
|
+ // Paper start - ensure fresh viewers get an absolute position on their first update,
|
|
+ // since we can't be certain what position they received in the spawn packet.
|
|
+ if (object instanceof PacketPlayOutEntityTeleport) {
|
|
+ this.broadcast((Packet) object);
|
|
+ } else {
|
|
+ PacketPlayOutEntityTeleport teleportPacket = null;
|
|
+
|
|
+ for (java.util.Map.Entry<EntityPlayer, Boolean> viewer : trackedPlayerMap.entrySet()) {
|
|
+ if (viewer.getValue()) {
|
|
+ viewer.setValue(false);
|
|
+ if (teleportPacket == null) {
|
|
+ teleportPacket = new PacketPlayOutEntityTeleport(this.tracker);
|
|
+ }
|
|
+ viewer.getKey().playerConnection.sendPacket(teleportPacket);
|
|
+ } else {
|
|
+ viewer.getKey().playerConnection.sendPacket((Packet) object);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
|
|
this.d();
|
|
@@ -338,7 +364,7 @@ public class EntityTrackerEntry {
|
|
|
|
entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId()));
|
|
// CraftBukkit end
|
|
- this.trackedPlayers.add(entityplayer);
|
|
+ this.trackedPlayerMap.put(entityplayer, true); // Paper
|
|
Packet packet = this.e();
|
|
|
|
entityplayer.playerConnection.sendPacket(packet);
|
|
--
|
|
2.7.2
|
|
|