Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-16 21:10:17 +01:00
5b6dfb3463
This work is 100% unfinished. I am pushing it up so that we as a team can work on this update. Do not try to use this branch. You will fail.
81 Zeilen
4.0 KiB
Diff
81 Zeilen
4.0 KiB
Diff
From 6fd7638017aa2ac3c12fd9499df14b0f3cd6b9cf 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 0410f9cf3..6ae576a2e 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 final 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;
|
|
@@ -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;
|
|
|
|
+ if (this.a > 0 || this.tracker instanceof EntityArrow) { // Paper - Moved up
|
|
// CraftBukkit start - Code moved from below
|
|
if (flag1) {
|
|
this.xLoc = k;
|
|
@@ -155,7 +161,6 @@ public class EntityTrackerEntry {
|
|
}
|
|
// CraftBukkit end
|
|
|
|
- if (this.a > 0 || this.tracker instanceof EntityArrow) {
|
|
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);
|
|
+ // 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 +362,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.18.0
|
|
|