Set correct riding position for entity passengers on vehicle move packet

Since Folia moves the connection tick to the beginning of the tick,
the player's position would be incorrectly updated by the move
packet and be used during the tick.

This would cause the player's bounding box to be incorrect, which
would cause incorrect movement collision calculations, such as
colliding with fire.

Fixes https://github.com/PaperMC/Folia/issues/119
This commit is contained in:
Spottedleaf 2023-07-09 20:31:48 -07:00
parent c0631fd5cd
commit 62b165bd7c
3 changed files with 77 additions and 43 deletions

View File

@ -15381,7 +15381,7 @@ index 44d99e89226adb6234b9405f25ac9dab9bd84297..072634e26d32ca0b3438a5d3a03be367
Collections.shuffle( this.connections ); Collections.shuffle( this.connections );
} }
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9ea9b5581b 100644 index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..dee7813af91d6729060cbe44d81569a66563357d 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -325,10 +325,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -325,10 +325,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
@ -15531,7 +15531,37 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
++this.receivedMovePacketCount; ++this.receivedMovePacketCount;
int i = this.receivedMovePacketCount - this.knownMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount;
@@ -759,7 +773,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -696,7 +710,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
Location curPos = this.getCraftPlayer().getLocation(); // Spigot
entity.absMoveTo(d3, d4, d5, f, f1);
- this.player.absMoveTo(d3, d4, d5, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
+ //this.player.absMoveTo(d3, d4, d5, this.player.getYRot(), this.player.getXRot()); // CraftBukkit // Folia - move to repositionAllPassengers
// Paper start - optimise out extra getCubes
boolean teleportBack = flag2; // violating this is always a fail
@@ -709,11 +723,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
}
if (teleportBack) { // Paper end - optimise out extra getCubes
entity.absMoveTo(d0, d1, d2, f, f1);
- this.player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
+ //this.player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit // Folia - not needed, the player is no longer updated
this.connection.send(new ClientboundMoveVehiclePacket(entity));
return;
}
+ // Folia start - move to positionRider
+ // this correction is required on folia since we move the connection tick to the beginning of the server
+ // tick, which would make any desync here visible
+ // this will correctly update the passenger positions for all mounted entities
+ // this prevents desync and ensures that all passengers have the correct rider-adjusted position
+ entity.repositionAllPassengers(false);
+ // Folia end - move to positionRider
+
// CraftBukkit start - fire PlayerMoveEvent
Player player = this.getCraftPlayer();
// Spigot Start
@@ -759,7 +781,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// If the event is cancelled we move the player back to their old location. // If the event is cancelled we move the player back to their old location.
if (event.isCancelled()) { if (event.isCancelled()) {
@ -15540,7 +15570,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
@@ -767,7 +781,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -767,7 +789,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors.
// We only do this if the Event was not cancelled. // We only do this if the Event was not cancelled.
if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { if (!oldTo.equals(event.getTo()) && !event.isCancelled()) {
@ -15549,7 +15579,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
@@ -883,13 +897,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -883,13 +905,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - run this async // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - run this async
// CraftBukkit start // CraftBukkit start
if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable
@ -15565,7 +15595,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
// Paper end // Paper end
@@ -914,7 +928,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -914,7 +936,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
if (!event.isHandled()) { if (!event.isHandled()) {
if (!event.isCancelled()) { if (!event.isCancelled()) {
@ -15574,7 +15604,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
@@ -925,7 +939,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -925,7 +947,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions())); this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions()));
// Paper end - Brigadier API // Paper end - Brigadier API
}); });
@ -15583,7 +15613,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} }
} else if (!completions.isEmpty()) { } else if (!completions.isEmpty()) {
final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(command, stringreader.getTotalLength()); final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(command, stringreader.getTotalLength());
@@ -1230,7 +1244,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1230,7 +1252,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
if (byteLength > 256 * 4) { if (byteLength > 256 * 4) {
ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send a book with with a page too large!"); ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send a book with with a page too large!");
@ -15592,7 +15622,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
byteTotal += byteLength; byteTotal += byteLength;
@@ -1253,17 +1267,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1253,17 +1275,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
if (byteTotal > byteAllowed) { if (byteTotal > byteAllowed) {
ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size());
@ -15614,7 +15644,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
// CraftBukkit end // CraftBukkit end
int i = packet.getSlot(); int i = packet.getSlot();
@@ -1283,7 +1297,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1283,7 +1305,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.updateBookContents(list1, i); this.updateBookContents(list1, i);
}; };
@ -15635,7 +15665,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} }
} }
@@ -1449,9 +1475,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1449,9 +1483,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
int i = this.receivedMovePacketCount - this.knownMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount;
// CraftBukkit start - handle custom speeds and skipped ticks // CraftBukkit start - handle custom speeds and skipped ticks
@ -15648,7 +15678,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
if (i > Math.max(this.allowedPlayerTicks, 5)) { if (i > Math.max(this.allowedPlayerTicks, 5)) {
ServerGamePacketListenerImpl.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName().getString(), i); ServerGamePacketListenerImpl.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName().getString(), i);
@@ -1608,7 +1635,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1608,7 +1643,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// If the event is cancelled we move the player back to their old location. // If the event is cancelled we move the player back to their old location.
if (event.isCancelled()) { if (event.isCancelled()) {
@ -15657,7 +15687,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
@@ -1616,7 +1643,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1616,7 +1651,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors.
// We only do this if the Event was not cancelled. // We only do this if the Event was not cancelled.
if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { if (!oldTo.equals(event.getTo()) && !event.isCancelled()) {
@ -15666,7 +15696,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
@@ -1830,9 +1857,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1830,9 +1865,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
if (!this.player.isSpectator()) { if (!this.player.isSpectator()) {
// limit how quickly items can be dropped // limit how quickly items can be dropped
// If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick.
@ -15678,7 +15708,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} else { } else {
// Else we increment the drop count and check the amount. // Else we increment the drop count and check the amount.
this.dropCount++; this.dropCount++;
@@ -1860,7 +1887,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1860,7 +1895,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
case ABORT_DESTROY_BLOCK: case ABORT_DESTROY_BLOCK:
case STOP_DESTROY_BLOCK: case STOP_DESTROY_BLOCK:
// Paper start - Don't allow digging in unloaded chunks // Paper start - Don't allow digging in unloaded chunks
@ -15687,7 +15717,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
this.player.connection.ackBlockChangesUpTo(packet.getSequence()); this.player.connection.ackBlockChangesUpTo(packet.getSequence());
return; return;
} }
@@ -1944,7 +1971,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1944,7 +1979,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
BlockPos blockposition = movingobjectpositionblock.getBlockPos(); BlockPos blockposition = movingobjectpositionblock.getBlockPos();
Vec3 vec3d1 = Vec3.atCenterOf(blockposition); Vec3 vec3d1 = Vec3.atCenterOf(blockposition);
@ -15696,7 +15726,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
Vec3 vec3d2 = vec3d.subtract(vec3d1); Vec3 vec3d2 = vec3d.subtract(vec3d1);
double d0 = 1.0000001D; double d0 = 1.0000001D;
@@ -2058,7 +2085,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2058,7 +2093,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
Entity entity = packet.getEntity(worldserver); Entity entity = packet.getEntity(worldserver);
if (entity != null) { if (entity != null) {
@ -15705,7 +15735,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
} }
@@ -2121,6 +2148,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2121,6 +2156,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.player.disconnect(); this.player.disconnect();
// Paper start - Adventure // Paper start - Adventure
quitMessage = quitMessage == null ? this.server.getPlayerList().remove(this.player) : this.server.getPlayerList().remove(this.player, quitMessage); // Paper - pass in quitMessage to fix kick message not being used quitMessage = quitMessage == null ? this.server.getPlayerList().remove(this.player) : this.server.getPlayerList().remove(this.player, quitMessage); // Paper - pass in quitMessage to fix kick message not being used
@ -15714,7 +15744,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) { if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) {
this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false); this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false);
// Paper end // Paper end
@@ -2206,9 +2235,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2206,9 +2243,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
} }
// CraftBukkit end // CraftBukkit end
if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.message())) { if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.message())) {
@ -15726,7 +15756,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} else { } else {
Optional<LastSeenMessages> optional = this.tryHandleChat(packet.message(), packet.timeStamp(), packet.lastSeenMessages()); Optional<LastSeenMessages> optional = this.tryHandleChat(packet.message(), packet.timeStamp(), packet.lastSeenMessages());
@@ -2242,23 +2271,22 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2242,23 +2279,22 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
@Override @Override
public void handleChatCommand(ServerboundChatCommandPacket packet) { public void handleChatCommand(ServerboundChatCommandPacket packet) {
if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.command())) { if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.command())) {
@ -15754,7 +15784,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} }
} }
@@ -2332,9 +2360,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2332,9 +2368,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
private Optional<LastSeenMessages> tryHandleChat(String message, Instant timestamp, LastSeenMessages.Update acknowledgment) { private Optional<LastSeenMessages> tryHandleChat(String message, Instant timestamp, LastSeenMessages.Update acknowledgment) {
if (!this.updateChatOrder(timestamp)) { if (!this.updateChatOrder(timestamp)) {
ServerGamePacketListenerImpl.LOGGER.warn("{} sent out-of-order chat: '{}': {} > {}", this.player.getName().getString(), message, this.lastChatTimeStamp.get().getEpochSecond(), timestamp.getEpochSecond()); // Paper ServerGamePacketListenerImpl.LOGGER.warn("{} sent out-of-order chat: '{}': {} > {}", this.player.getName().getString(), message, this.lastChatTimeStamp.get().getEpochSecond(), timestamp.getEpochSecond()); // Paper
@ -15766,7 +15796,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return Optional.empty(); return Optional.empty();
} else { } else {
Optional<LastSeenMessages> optional = this.unpackAndApplyLastSeen(acknowledgment); Optional<LastSeenMessages> optional = this.unpackAndApplyLastSeen(acknowledgment);
@@ -2409,7 +2437,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2409,7 +2445,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
String originalFormat = event.getFormat(), originalMessage = event.getMessage(); String originalFormat = event.getFormat(), originalMessage = event.getMessage();
this.cserver.getPluginManager().callEvent(event); this.cserver.getPluginManager().callEvent(event);
@ -15775,7 +15805,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
// Evil plugins still listening to deprecated event // Evil plugins still listening to deprecated event
final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients());
queueEvent.setCancelled(event.isCancelled()); queueEvent.setCancelled(event.isCancelled());
@@ -2487,6 +2515,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2487,6 +2523,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
public void handleCommand(String s) { // Paper - private -> public public void handleCommand(String s) { // Paper - private -> public
// Paper Start // Paper Start
if (!org.spigotmc.AsyncCatcher.shuttingDown && !org.bukkit.Bukkit.isPrimaryThread()) { if (!org.spigotmc.AsyncCatcher.shuttingDown && !org.bukkit.Bukkit.isPrimaryThread()) {
@ -15783,7 +15813,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
LOGGER.error("Command Dispatched Async: " + s); LOGGER.error("Command Dispatched Async: " + s);
LOGGER.error("Please notify author of plugin causing this execution to fix this bug! see: http://bit.ly/1oSiM6C", new Throwable()); LOGGER.error("Please notify author of plugin causing this execution to fix this bug! see: http://bit.ly/1oSiM6C", new Throwable());
Waitable<Void> wait = new Waitable<>() { Waitable<Void> wait = new Waitable<>() {
@@ -2547,6 +2576,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2547,6 +2584,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
if (s.isEmpty()) { if (s.isEmpty()) {
ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message");
} else if (this.getCraftPlayer().isConversing()) { } else if (this.getCraftPlayer().isConversing()) {
@ -15791,7 +15821,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
final String conversationInput = s; final String conversationInput = s;
this.server.processQueue.add(new Runnable() { this.server.processQueue.add(new Runnable() {
@Override @Override
@@ -2788,7 +2818,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2788,7 +2826,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.player.resetLastActionTime(); this.player.resetLastActionTime();
this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); this.player.setShiftKeyDown(packet.isUsingSecondaryAction());
@ -15800,7 +15830,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) {
return; return;
} }
@@ -2928,6 +2958,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2928,6 +2966,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
switch (packetplayinclientcommand_enumclientcommand) { switch (packetplayinclientcommand_enumclientcommand) {
case PERFORM_RESPAWN: case PERFORM_RESPAWN:
if (this.player.wonGame) { if (this.player.wonGame) {
@ -15813,7 +15843,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
this.player.wonGame = false; this.player.wonGame = false;
this.player = this.server.getPlayerList().respawn(this.player, this.server.getLevel(this.player.getRespawnDimension()), true, null, true, RespawnReason.END_PORTAL, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag.END_PORTAL); // Paper - add isEndCreditsRespawn argument this.player = this.server.getPlayerList().respawn(this.player, this.server.getLevel(this.player.getRespawnDimension()), true, null, true, RespawnReason.END_PORTAL, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag.END_PORTAL); // Paper - add isEndCreditsRespawn argument
CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD); CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD);
@@ -2936,6 +2972,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -2936,6 +2980,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
return; return;
} }
@ -15832,7 +15862,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
this.player = this.server.getPlayerList().respawn(this.player, false, RespawnReason.DEATH); this.player = this.server.getPlayerList().respawn(this.player, false, RespawnReason.DEATH);
if (this.server.isHardcore()) { if (this.server.isHardcore()) {
this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper
@@ -3289,7 +3337,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -3289,7 +3345,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// Paper start // Paper start
if (!org.bukkit.Bukkit.isPrimaryThread()) { if (!org.bukkit.Bukkit.isPrimaryThread()) {
if (this.recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { if (this.recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) {
@ -15841,7 +15871,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
return; return;
} }
} }
@@ -3431,7 +3479,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -3431,7 +3487,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.filterTextPacket(list).thenAcceptAsync((list1) -> { this.filterTextPacket(list).thenAcceptAsync((list1) -> {
this.updateSignText(packet, list1); this.updateSignText(packet, list1);
@ -15861,7 +15891,7 @@ index b777547cb9f8edf4e7b3c2cfb894f8cd1b1a35a5..b0de5f603f01010a496c6760610dab9e
} }
private void updateSignText(ServerboundSignUpdatePacket packet, List<FilteredText> signText) { private void updateSignText(ServerboundSignUpdatePacket packet, List<FilteredText> signText) {
@@ -3464,9 +3523,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -3464,9 +3531,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.keepAlivePending = false; this.keepAlivePending = false;
} else if (!this.isSingleplayerOwner()) { } else if (!this.isSingleplayerOwner()) {
// Paper start - This needs to be handled on the main thread for plugins // Paper start - This needs to be handled on the main thread for plugins
@ -16645,7 +16675,7 @@ index ea27b46eec01bda427653335f922ccd068cffcb5..e551d3b875eab6851b75041f418c9a08
return blockToFallLocation(blockState); return blockToFallLocation(blockState);
} else { } else {
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d5182e392 100644 index 305b43071aa1cf8feee75fae757bb7734ae33771..27475335c6e340de6fdd690bb19829afcd257bf6 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java --- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -166,7 +166,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -166,7 +166,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
@ -16793,7 +16823,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
return; return;
} }
// CraftBukkit end // CraftBukkit end
@@ -3502,6 +3511,771 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -3502,6 +3511,775 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
this.portalEntrancePos = original.portalEntrancePos; this.portalEntrancePos = original.portalEntrancePos;
} }
@ -16878,7 +16908,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
+ } + }
+ } + }
+ +
+ public void adjustRiders() { + public void adjustRiders(boolean teleport) {
+ java.util.ArrayDeque<EntityTreeNode> queue = new java.util.ArrayDeque<>(); + java.util.ArrayDeque<EntityTreeNode> queue = new java.util.ArrayDeque<>();
+ queue.add(this); + queue.add(this);
+ +
@ -16890,12 +16920,16 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
+ } + }
+ +
+ for (EntityTreeNode passenger : passengers) { + for (EntityTreeNode passenger : passengers) {
+ curr.root.positionRider(passenger.root, Entity::moveTo); + curr.root.positionRider(passenger.root, teleport ? Entity::moveTo : Entity::setPos);
+ } + }
+ } + }
+ } + }
+ } + }
+ +
+ public void repositionAllPassengers(boolean teleport) {
+ this.makePassengerTree().adjustRiders(teleport);
+ }
+
+ protected EntityTreeNode makePassengerTree() { + protected EntityTreeNode makePassengerTree() {
+ io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot read passengers off of the main thread"); + io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot read passengers off of the main thread");
+ +
@ -17014,7 +17048,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
+ +
+ // restore passenger tree + // restore passenger tree
+ passengerTree.restore(); + passengerTree.restore();
+ passengerTree.adjustRiders(); + passengerTree.adjustRiders(true);
+ +
+ // invoke post dimension change now + // invoke post dimension change now
+ for (EntityTreeNode node : fullTree) { + for (EntityTreeNode node : fullTree) {
@ -17163,7 +17197,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
+ passengerTree.addTracker(); + passengerTree.addTracker();
+ +
+ // adjust entities to final position + // adjust entities to final position
+ passengerTree.adjustRiders(); + passengerTree.adjustRiders(true);
+ +
+ // the tracker clear/add logic is only used in the same region, as the other logic + // the tracker clear/add logic is only used in the same region, as the other logic
+ // performs add/remove from world logic which will also perform add/remove tracker logic + // performs add/remove from world logic which will also perform add/remove tracker logic
@ -17565,7 +17599,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
@Nullable @Nullable
public Entity changeDimension(ServerLevel destination) { public Entity changeDimension(ServerLevel destination) {
// CraftBukkit start // CraftBukkit start
@@ -3510,6 +4284,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -3510,6 +4288,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
@Nullable @Nullable
public Entity teleportTo(ServerLevel worldserver, PositionImpl location) { public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
@ -17577,7 +17611,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
// CraftBukkit end // CraftBukkit end
// Paper start - fix bad state entities causing dupes // Paper start - fix bad state entities causing dupes
if (!this.isAlive() || !this.valid) { if (!this.isAlive() || !this.valid) {
@@ -3593,6 +4372,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -3593,6 +4376,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
} }
} }
@ -17590,7 +17624,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
protected void removeAfterChangingDimensions() { protected void removeAfterChangingDimensions() {
this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION);
} }
@@ -4037,17 +4822,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -4037,17 +4826,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
// Paper start // Paper start
public void startSeenByPlayer(ServerPlayer player) { public void startSeenByPlayer(ServerPlayer player) {
@ -17610,7 +17644,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
} }
// Paper end // Paper end
@@ -4542,7 +5323,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -4542,7 +5327,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
} }
} }
// Paper end - fix MC-4 // Paper end - fix MC-4
@ -17620,7 +17654,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
synchronized (this.posLock) { // Paper synchronized (this.posLock) { // Paper
this.position = new Vec3(x, y, z); this.position = new Vec3(x, y, z);
} // Paper } // Paper
@@ -4563,7 +5345,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -4563,7 +5349,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
// Paper start - never allow AABB to become desynced from position // Paper start - never allow AABB to become desynced from position
// hanging has its own special logic // hanging has its own special logic
@ -17629,7 +17663,7 @@ index 305b43071aa1cf8feee75fae757bb7734ae33771..bce3c60667ca11a062f1e83cbf125b1d
this.setBoundingBox(this.makeBoundingBox()); this.setBoundingBox(this.makeBoundingBox());
} }
// Paper end // Paper end
@@ -4650,6 +5432,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -4650,6 +5436,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
return this.removalReason != null; return this.removalReason != null;
} }

View File

@ -29,7 +29,7 @@ index 41bf71d116ffc5431586ce54abba7f8def6c1dcf..519da6886613b8460e989767b1a21e31
} }
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index bce3c60667ca11a062f1e83cbf125b1d5182e392..52aa759db930c04a051686766c1b822a5131a20a 100644 index 27475335c6e340de6fdd690bb19829afcd257bf6..ee15661227754149164893d6acf678d13b2e1b27 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java --- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -2820,6 +2820,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -2820,6 +2820,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {

View File

@ -5,7 +5,7 @@ Subject: [PATCH] Work around https://github.com/PaperMC/paperweight/issues/194
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index b0de5f603f01010a496c6760610dab9ea9b5581b..3c5b412ac6b09c667b05d9c44f341d4e8506c4cc 100644 index dee7813af91d6729060cbe44d81569a66563357d..b2feaea169fa9d3977c3dfdfdf3dea9283f5d854 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -504,7 +504,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -504,7 +504,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic