mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-01 12:42:05 -07:00
This issue causes the item frame to move on the client erroneously, so we force the entity to resend its position the next tick. This utilizes a moonrise patch which has a resync flag that can be triggered for the next tick, so we just utilize this. I stub out the method to ensure that it still compiles without the feature patch.
103 lines
5.6 KiB
Diff
103 lines
5.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Tue, 20 Feb 2024 18:24:16 -0800
|
|
Subject: [PATCH] Fix entity tracker desync when new players are added to the
|
|
tracker
|
|
|
|
The delta position packet instructs the client to update
|
|
the entity position by a position difference. However, this position
|
|
difference is relative to the last position in the entity tracker
|
|
state, not the last position which has been sent to the player. As
|
|
a result, if the last position the player has recorded is different
|
|
than the one stored in the entity tracker (which occurs when a new
|
|
player is added to an existing entity tracker state) then the sent
|
|
position difference will cause a position desync for the client.
|
|
|
|
We can resolve this problem by either tracking the last position
|
|
sent per-player, or by simply resetting the last sent position
|
|
in the entity tracker state every time a new player is added.
|
|
Resetting the last sent position every time a new player is
|
|
added to the tracker is just easier to do, so that is what
|
|
this patch does.
|
|
|
|
This patch also fixes entities appearing to disappear when
|
|
teleporting to players by changing the initial position
|
|
in the spawn packet to the entities current tracking position.
|
|
When teleporting, the spawn packet will contain the old position
|
|
which is most likely in an unloaded chunk - which means that the
|
|
client will not tick the entity and thus not lerp the entity
|
|
from its old position to its new position.
|
|
|
|
diff --git a/net/minecraft/network/protocol/game/ClientboundAddEntityPacket.java b/net/minecraft/network/protocol/game/ClientboundAddEntityPacket.java
|
|
index db31989ebe3d7021cfd2311439e9a00f819b0841..1373977b339405ef59bb3ea03d195285c96dd3fe 100644
|
|
--- a/net/minecraft/network/protocol/game/ClientboundAddEntityPacket.java
|
|
+++ b/net/minecraft/network/protocol/game/ClientboundAddEntityPacket.java
|
|
@@ -42,9 +42,11 @@ public class ClientboundAddEntityPacket implements Packet<ClientGamePacketListen
|
|
this(
|
|
entity.getId(),
|
|
entity.getUUID(),
|
|
- serverEntity.getPositionBase().x(),
|
|
- serverEntity.getPositionBase().y(),
|
|
- serverEntity.getPositionBase().z(),
|
|
+ // Paper start - fix entity tracker desync
|
|
+ entity.trackingPosition().x(),
|
|
+ entity.trackingPosition().y(),
|
|
+ entity.trackingPosition().z(),
|
|
+ // Paper end - fix entity tracker desync
|
|
serverEntity.getLastSentXRot(),
|
|
serverEntity.getLastSentYRot(),
|
|
entity.getType(),
|
|
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
|
index 61692c07dfb75ca0c19f603aafc96c0817861107..56a1d081a28e8b38384cfca732b103462693e322 100644
|
|
--- a/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/net/minecraft/server/level/ChunkMap.java
|
|
@@ -1278,6 +1278,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
this.serverEntity.addPairing(player);
|
|
}
|
|
// Paper end - entity tracking events
|
|
+ this.serverEntity.onPlayerAdd(); // Paper - fix desync when a player is added to the tracker
|
|
}
|
|
} else if (this.seenBy.remove(player.connection)) {
|
|
this.serverEntity.removePairing(player);
|
|
diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java
|
|
index 50bde815b917c14bc4fb9163bd9df45bfa63ef47..dec11820b80094656e89e7384c4b515948280121 100644
|
|
--- a/net/minecraft/server/level/ServerEntity.java
|
|
+++ b/net/minecraft/server/level/ServerEntity.java
|
|
@@ -104,8 +104,9 @@ public class ServerEntity {
|
|
}
|
|
|
|
// Paper start - fix desync when a player is added to the tracker
|
|
+ private boolean forceStateResync;
|
|
public void onPlayerAdd() {
|
|
- // TODO - IMPLEMENT STUBBED METHOD FROM MOONRISE
|
|
+ this.forceStateResync = true;
|
|
}
|
|
// Paper end - fix desync when a player is added to the tracker
|
|
// Paper start - Improve AbstractHurtingProjectile syncing
|
|
@@ -159,7 +160,7 @@ public class ServerEntity {
|
|
this.sendDirtyEntityData();
|
|
}
|
|
|
|
- if (this.tickCount % this.updateInterval == 0 || this.entity.hasImpulse || this.entity.getEntityData().isDirty()) {
|
|
+ if (this.forceStateResync || this.tickCount % this.updateInterval == 0 || this.entity.hasImpulse || this.entity.getEntityData().isDirty()) { // Paper - fix desync when a player is added to the tracker
|
|
byte b = Mth.packDegrees(this.entity.getYRot());
|
|
byte b1 = Mth.packDegrees(this.entity.getXRot());
|
|
boolean flag = Math.abs(b - this.lastSentYRot) >= 1 || Math.abs(b1 - this.lastSentXRot) >= 1;
|
|
@@ -194,7 +195,7 @@ public class ServerEntity {
|
|
long l1 = this.positionCodec.encodeY(vec3);
|
|
long l2 = this.positionCodec.encodeZ(vec3);
|
|
boolean flag5 = l < -32768L || l > 32767L || l1 < -32768L || l1 > 32767L || l2 < -32768L || l2 > 32767L;
|
|
- if (this.entity.getRequiresPrecisePosition()
|
|
+ if (this.forceStateResync || this.entity.getRequiresPrecisePosition() // Paper - fix desync when a player is added to the tracker
|
|
|| flag5
|
|
|| this.teleportDelay > 400
|
|
|| this.wasRiding
|
|
@@ -263,6 +264,7 @@ public class ServerEntity {
|
|
}
|
|
|
|
this.entity.hasImpulse = false;
|
|
+ this.forceStateResync = false; // Paper - fix desync when a player is added to the tracker
|
|
}
|
|
|
|
this.tickCount++;
|