papermc/Spigot-Server-Patches/0042-Send-absolute-position-the-first-time-an-entity-is-s.patch

81 lines
4 KiB
Diff
Raw Normal View History

2016-11-17 02:23:38 +00:00
From 609427e7e62088cfde2ec8cf8026a4a1faf6520d Mon Sep 17 00:00:00 2001
From: Jedediah Smith <jedediah@silencegreys.com>
2016-02-29 23:09:49 +00:00
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
2016-11-17 02:23:38 +00:00
index b688e99..370cb9c 100644
--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
+++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
2016-02-29 23:09:49 +00:00
@@ -41,7 +41,12 @@ public class EntityTrackerEntry {
private boolean x;
private boolean y;
2016-02-29 23:09:49 +00:00
public boolean b;
2016-06-09 03:57:14 +00:00
- public final Set<EntityPlayer> trackedPlayers = Sets.newHashSet();
2016-02-29 23:09:49 +00:00
+ // 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();
2016-02-29 23:09:49 +00:00
+ // Paper end
2016-02-29 23:09:49 +00:00
public EntityTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
this.tracker = entity;
2016-06-09 03:57:14 +00:00
@@ -142,6 +147,7 @@ public class EntityTrackerEntry {
boolean flag1 = l1 * l1 + i2 * i2 + j2 * j2 >= 128L || this.a % 60 == 0;
boolean flag2 = Math.abs(j1 - this.yRot) >= 1 || Math.abs(k1 - this.xRot) >= 1;
2016-02-29 23:09:49 +00:00
+ if (this.a > 0 || this.tracker instanceof EntityArrow) { // Paper - Moved up
2016-06-09 03:57:14 +00:00
// CraftBukkit start - Code moved from below
if (flag1) {
this.xLoc = k;
@@ -155,7 +161,6 @@ public class EntityTrackerEntry {
}
2016-02-29 23:09:49 +00:00
// CraftBukkit end
2016-06-09 03:57:14 +00:00
2016-02-29 23:09:49 +00:00
- if (this.a > 0 || this.tracker instanceof EntityArrow) {
2016-06-09 03:57:14 +00:00
if (l1 >= -32768L && l1 < 32768L && i2 >= -32768L && i2 < 32768L && j2 >= -32768L && j2 < 32768L && this.v <= 400 && !this.x && this.y == this.tracker.onGround) {
if ((!flag1 || !flag2) && !(this.tracker instanceof EntityArrow)) {
if (flag1) {
@@ -201,7 +206,26 @@ public class EntityTrackerEntry {
}
if (object != null) {
- this.broadcast((Packet) object);
2016-02-29 23:09:49 +00:00
+ // 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) {
2016-02-29 23:09:49 +00:00
+ teleportPacket = new PacketPlayOutEntityTeleport(this.tracker);
+ }
+ viewer.getKey().playerConnection.sendPacket(teleportPacket);
+ } else {
+ viewer.getKey().playerConnection.sendPacket((Packet) object);
+ }
+ }
+ }
2016-02-29 23:09:49 +00:00
+ // Paper end
}
2016-02-29 23:09:49 +00:00
this.d();
2016-06-09 03:57:14 +00:00
@@ -338,7 +362,7 @@ public class EntityTrackerEntry {
entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId()));
// CraftBukkit end
- this.trackedPlayers.add(entityplayer);
2016-02-29 23:09:49 +00:00
+ this.trackedPlayerMap.put(entityplayer, true); // Paper
Packet packet = this.e();
entityplayer.playerConnection.sendPacket(packet);
--
2016-11-17 02:23:38 +00:00
2.10.2