Properly resend entities

This resolves some issues which caused entities to not be resent correctly.
Entities that are interacted with need to be resent to the client, so we resend all the entity
data to the player whilst making sure not to clear dirty entries from the tracker. This makes
sure that values will be correctly updated to other players.

This also adds utilities to aid in further preventing entity desyncs.

This also also fixes the bug causing cancelling PlayerInteractEvent to cause items to continue
to be used despite being cancelled on the server.

For example, items being consumed but never finishing, shields being put up, etc.
The underlying issue of this is that the client modifies their synced data values,
and so we have to (forcibly) resend them in order for the client to reset their using item state.

See: https://github.com/PaperMC/Paper/pull/1896

== AT ==
public net.minecraft.server.level.ChunkMap$TrackedEntity serverEntity
This commit is contained in:
Owen1212055
2022-12-07 17:25:19 -05:00
parent ea24e2c6aa
commit d300c94ec2
13 changed files with 358 additions and 246 deletions

View File

@@ -313,7 +313,7 @@
+ ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now
+ // CraftBukkit end
+
+ player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn
+ //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE
+
+ this.sendLevelInfo(player, worldserver1);
+
@@ -842,7 +842,24 @@
return entityplayer1;
}
@@ -516,15 +924,32 @@
@@ -505,26 +913,48 @@
}
public void sendActiveEffects(LivingEntity entity, ServerGamePacketListenerImpl networkHandler) {
+ // Paper start - collect packets
+ this.sendActiveEffects(entity, networkHandler::send);
+ }
+ public void sendActiveEffects(LivingEntity entity, java.util.function.Consumer<Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> packetConsumer) {
+ // Paper end - collect packets
Iterator iterator = entity.getActiveEffects().iterator();
while (iterator.hasNext()) {
MobEffectInstance mobeffect = (MobEffectInstance) iterator.next();
- networkHandler.send(new ClientboundUpdateMobEffectPacket(entity.getId(), mobeffect, false));
+ packetConsumer.accept(new ClientboundUpdateMobEffectPacket(entity.getId(), mobeffect, false)); // Paper - collect packets
}
}
public void sendPlayerPermissionLevel(ServerPlayer player) {
@@ -877,14 +894,10 @@
this.sendAllPlayerInfoIn = 0;
}
@@ -537,9 +962,28 @@
ServerPlayer entityplayer = (ServerPlayer) iterator.next();
@@ -541,6 +971,25 @@
}
entityplayer.connection.send(packet);
+ }
+
+ }
+
+ // CraftBukkit start - add a world/entity limited version
+ public void broadcastAll(Packet packet, net.minecraft.world.entity.player.Player entityhuman) {
+ for (int i = 0; i < this.players.size(); ++i) {
@@ -899,14 +912,15 @@
+ public void broadcastAll(Packet packet, Level world) {
+ for (int i = 0; i < world.players().size(); ++i) {
+ ((ServerPlayer) world.players().get(i)).connection.send(packet);
}
}
+ }
+
+ }
+ // CraftBukkit end
+
public void broadcastAll(Packet<?> packet, ResourceKey<Level> dimension) {
Iterator iterator = this.players.iterator();
@@ -554,7 +998,7 @@
@@ -554,7 +1003,7 @@
}
@@ -915,7 +929,7 @@
PlayerTeam scoreboardteam = source.getTeam();
if (scoreboardteam != null) {
@@ -573,7 +1017,7 @@
@@ -573,7 +1022,7 @@
}
}
@@ -924,7 +938,7 @@
PlayerTeam scoreboardteam = source.getTeam();
if (scoreboardteam == null) {
@@ -619,7 +1063,7 @@
@@ -619,7 +1068,7 @@
}
public void deop(GameProfile profile) {
@@ -933,7 +947,7 @@
ServerPlayer entityplayer = this.getPlayer(profile.getId());
if (entityplayer != null) {
@@ -629,6 +1073,11 @@
@@ -629,6 +1078,11 @@
}
private void sendPlayerPermissionLevel(ServerPlayer player, int permissionLevel) {
@@ -945,7 +959,7 @@
if (player.connection != null) {
byte b0;
@@ -643,36 +1092,53 @@
@@ -643,36 +1097,53 @@
player.connection.send(new ClientboundEntityEventPacket(player, b0));
}
@@ -1012,7 +1026,7 @@
if (entityplayer != player && entityplayer.level().dimension() == worldKey) {
double d4 = x - entityplayer.getX();
double d5 = y - entityplayer.getY();
@@ -687,10 +1153,12 @@
@@ -687,10 +1158,12 @@
}
public void saveAll() {
@@ -1025,7 +1039,7 @@
}
public UserWhiteList getWhiteList() {
@@ -712,15 +1180,19 @@
@@ -712,15 +1185,19 @@
public void reloadWhiteList() {}
public void sendLevelInfo(ServerPlayer player, ServerLevel world) {
@@ -1049,7 +1063,7 @@
}
player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.LEVEL_CHUNKS_LOAD_START, 0.0F));
@@ -729,8 +1201,16 @@
@@ -729,8 +1206,16 @@
public void sendAllPlayerInfo(ServerPlayer player) {
player.inventoryMenu.sendAllDataToRemote();
@@ -1067,7 +1081,7 @@
}
public int getPlayerCount() {
@@ -746,6 +1226,7 @@
@@ -746,6 +1231,7 @@
}
public void setUsingWhiteList(boolean whitelistEnabled) {
@@ -1075,7 +1089,7 @@
this.doWhiteList = whitelistEnabled;
}
@@ -786,11 +1267,35 @@
@@ -786,11 +1272,35 @@
}
public void removeAll() {
@@ -1113,7 +1127,7 @@
public void broadcastSystemMessage(Component message, boolean overlay) {
this.broadcastSystemMessage(message, (entityplayer) -> {
@@ -819,24 +1324,43 @@
@@ -819,24 +1329,43 @@
}
public void broadcastChatMessage(PlayerChatMessage message, ServerPlayer sender, ChatType.Bound params) {
@@ -1160,7 +1174,7 @@
}
if (flag1 && sender != null) {
@@ -845,20 +1369,27 @@
@@ -845,20 +1374,27 @@
}
@@ -1193,7 +1207,7 @@
Path path = file2.toPath();
if (FileUtil.isPathNormalized(path) && FileUtil.isPathPortable(path) && path.startsWith(file.getPath()) && file2.isFile()) {
@@ -867,7 +1398,7 @@
@@ -867,7 +1403,7 @@
}
serverstatisticmanager = new ServerStatsCounter(this.server, file1);
@@ -1202,7 +1216,7 @@
}
return serverstatisticmanager;
@@ -875,13 +1406,13 @@
@@ -875,13 +1411,13 @@
public PlayerAdvancements getPlayerAdvancements(ServerPlayer player) {
UUID uuid = player.getUUID();
@@ -1218,7 +1232,7 @@
}
advancementdataplayer.setPlayer(player);
@@ -932,15 +1463,39 @@
@@ -932,15 +1468,39 @@
}
public void reloadResources() {