aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0767-Send-block-entities-after-destroy-prediction.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0767-Send-block-entities-after-destroy-prediction.patch')
-rw-r--r--patches/server/0767-Send-block-entities-after-destroy-prediction.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/patches/server/0767-Send-block-entities-after-destroy-prediction.patch b/patches/server/0767-Send-block-entities-after-destroy-prediction.patch
new file mode 100644
index 0000000000..c1bc860181
--- /dev/null
+++ b/patches/server/0767-Send-block-entities-after-destroy-prediction.patch
@@ -0,0 +1,91 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <[email protected]>
+Date: Sat, 25 Jun 2022 19:45:20 -0400
+Subject: [PATCH] Send block entities after destroy prediction
+
+Minecraft's prediction system does not handle block entities, so if we are manually sending block entities during
+block breaking we need to set it after the prediction is finished. This fixes block entities not showing when cancelling the BlockBreakEvent.
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+index 8f4c9b99b638cfce8cc7c55f6369f62e757f4e48..f3389dc345d8b6e5389ae37848d9b268d4bbad83 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -62,6 +62,8 @@ public class ServerPlayerGameMode {
+ private BlockPos delayedDestroyPos;
+ private int delayedTickStart;
+ private int lastSentState;
++ public boolean captureSentBlockEntities = false; // Paper - Send block entities after destroy prediction
++ public boolean capturedBlockEntity = false; // Paper - Send block entities after destroy prediction
+
+ public ServerPlayerGameMode(ServerPlayer player) {
+ this.gameModeForPlayer = GameType.DEFAULT_MODE;
+@@ -188,10 +190,7 @@ public class ServerPlayerGameMode {
+ this.player.connection.send(new ClientboundBlockUpdatePacket(pos, this.level.getBlockState(pos)));
+ this.debugLogging(pos, false, sequence, "may not interact");
+ // Update any tile entity data for this block
+- BlockEntity tileentity = this.level.getBlockEntity(pos);
+- if (tileentity != null) {
+- this.player.connection.send(tileentity.getUpdatePacket());
+- }
++ capturedBlockEntity = true; // Paper - Send block entities after destroy prediction
+ // CraftBukkit end
+ return;
+ }
+@@ -202,10 +201,7 @@ public class ServerPlayerGameMode {
+ // Let the client know the block still exists
+ this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
+ // Update any tile entity data for this block
+- BlockEntity tileentity = this.level.getBlockEntity(pos);
+- if (tileentity != null) {
+- this.player.connection.send(tileentity.getUpdatePacket());
+- }
++ capturedBlockEntity = true; // Paper - Send block entities after destroy prediction
+ return;
+ }
+ // CraftBukkit end
+@@ -387,10 +383,12 @@ public class ServerPlayerGameMode {
+ }
+
+ // Update any tile entity data for this block
++ if (!captureSentBlockEntities) { // Paper - Send block entities after destroy prediction
+ BlockEntity tileentity = this.level.getBlockEntity(pos);
+ if (tileentity != null) {
+ this.player.connection.send(tileentity.getUpdatePacket());
+ }
++ } else {capturedBlockEntity = true;} // Paper - Send block entities after destroy prediction
+ return false;
+ }
+ }
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 27eb4bc4d1276ea36b97d0faeed2acee8b7a64cc..b8f1549d1ea98a105577927a735bab331aff3840 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1704,8 +1704,28 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ return;
+ }
+ // Paper end - Don't allow digging into unloaded chunks
++ // Paper start - Send block entities after destroy prediction
++ this.player.gameMode.capturedBlockEntity = false;
++ this.player.gameMode.captureSentBlockEntities = true;
++ // Paper end - Send block entities after destroy prediction
+ this.player.gameMode.handleBlockBreakAction(blockposition, packetplayinblockdig_enumplayerdigtype, packet.getDirection(), this.player.level().getMaxBuildHeight(), packet.getSequence());
+ this.player.connection.ackBlockChangesUpTo(packet.getSequence());
++ // Paper start - Send block entities after destroy prediction
++ this.player.gameMode.captureSentBlockEntities = false;
++ // If a block entity was modified speedup the block change ack to avoid the block entity
++ // being overriden.
++ if (this.player.gameMode.capturedBlockEntity) {
++ // manually tick
++ this.send(new ClientboundBlockChangedAckPacket(this.ackBlockChangesUpTo));
++ this.player.connection.ackBlockChangesUpTo = -1;
++
++ this.player.gameMode.capturedBlockEntity = false;
++ BlockEntity tileentity = this.player.level().getBlockEntity(blockposition);
++ if (tileentity != null) {
++ this.player.connection.send(tileentity.getUpdatePacket());
++ }
++ }
++ // Paper end - Send block entities after destroy prediction
+ return;
+ default:
+ throw new IllegalArgumentException("Invalid player action");