e035fd7034
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: cc9aa21a SPIGOT-6399, SPIGOT-7344: Clarify collidable behavior for player entities f23325b6 Add API for per-world simulation distances 26e1774e Add API for per-world view distances 0b541e60 Add PlayerLoginEvent#getRealAddress 5f027d2d PR-949: Add Vector#fromJOML() overloads for read-only vector types CraftBukkit Changes: bcf56171a PR-1321: Clean up some stuff which got missed during previous PRs 7f833a2d1 SPIGOT-7462: Players no longer drop XP after dying near a Sculk Catalyst 752aac669 Implement APIs for per world view and simulation distances 57d7ef433 Preserve empty enchantment tags for glow effect 465ec3fb4 Remove connected check on setScoreboard f90ce621e Use one PermissibleBase for all command blocks 5876cca44 SPIGOT-7550: Fix creation of Arrow instances f03fc3aa3 SPIGOT-7549: ServerTickManager#setTickRate incorrect Precondition 9d7f49b01 SPIGOT-7548: Fix wrong spawn location for experience orb and dropped item Spigot Changes: ed9ba9a4 Drop no longer required patch ignoring -o option 86b5dd6a SPIGOT-7546: Fix hardcoded check for outdated client message aa7cde7a Remove obsolete APIs for per world view and simulation distances 6dff577e Remove obsolete patch preserving empty `ench` tags a3bf95b8 Remove obsolete PlayerLoginEvent#getRealAddress 1b02f5d6 Remove obsolete connected check on setScoreboard patch acf717eb Remove obsolete command block PermissibleBase patch 053fa2a9 Remove redundant patch dealing with null tile entities
172 Zeilen
13 KiB
Diff
172 Zeilen
13 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|
Date: Tue, 27 Jun 2023 21:09:11 -0400
|
|
Subject: [PATCH] Dont resend blocks on interactions
|
|
|
|
In general, the client now has an acknowledgment system which will prevent block changes made by the client to be reverted correctly.
|
|
|
|
It should be noted that this system does not yet support block entities, so those still need to resynced when needed.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
index b214c934b9a537f52cef142c519c2b9b55a89ae3..58f972832c39a27a8ccd606f9144e1c54adbf6f3 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
@@ -199,7 +199,7 @@ public class ServerPlayerGameMode {
|
|
PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, pos, direction, this.player.getInventory().getSelected(), InteractionHand.MAIN_HAND);
|
|
if (event.isCancelled()) {
|
|
// Let the client know the block still exists
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos)); // Paper - Don't resync blocks
|
|
// Update any tile entity data for this block
|
|
capturedBlockEntity = true; // Paper - send block entity after predicting
|
|
return;
|
|
@@ -214,7 +214,7 @@ public class ServerPlayerGameMode {
|
|
// Spigot start - handle debug stick left click for non-creative
|
|
if (this.player.getMainHandItem().is(net.minecraft.world.item.Items.DEBUG_STICK)
|
|
&& ((net.minecraft.world.item.DebugStickItem) net.minecraft.world.item.Items.DEBUG_STICK).handleInteraction(this.player, this.level.getBlockState(pos), this.level, pos, false, this.player.getMainHandItem())) {
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos)); // Paper - Don't resync block
|
|
return;
|
|
}
|
|
// Spigot end
|
|
@@ -232,15 +232,17 @@ public class ServerPlayerGameMode {
|
|
// CraftBukkit start - Swings at air do *NOT* exist.
|
|
if (event.useInteractedBlock() == Event.Result.DENY) {
|
|
// If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door.
|
|
- BlockState data = this.level.getBlockState(pos);
|
|
- if (data.getBlock() instanceof DoorBlock) {
|
|
- // For some reason *BOTH* the bottom/top part have to be marked updated.
|
|
- boolean bottom = data.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER;
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, bottom ? pos.above() : pos.below()));
|
|
- } else if (data.getBlock() instanceof TrapDoorBlock) {
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
- }
|
|
+ // Paper start - Don't resync blocks
|
|
+ //BlockState data = this.level.getBlockState(pos);
|
|
+ //if (data.getBlock() instanceof DoorBlock) {
|
|
+ // // For some reason *BOTH* the bottom/top part have to be marked updated.
|
|
+ // boolean bottom = data.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER;
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, bottom ? pos.above() : pos.below()));
|
|
+ //} else if (data.getBlock() instanceof TrapDoorBlock) {
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ //}
|
|
+ // Paper end
|
|
} else if (!iblockdata.isAir()) {
|
|
iblockdata.attack(this.level, pos, this.player);
|
|
f = iblockdata.getDestroyProgress(this.player, this.player.level(), pos);
|
|
@@ -249,7 +251,7 @@ public class ServerPlayerGameMode {
|
|
if (event.useItemInHand() == Event.Result.DENY) {
|
|
// If we 'insta destroyed' then the client needs to be informed.
|
|
if (f > 1.0f) {
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos)); // Paper - Don't resync blocks
|
|
}
|
|
return;
|
|
}
|
|
@@ -257,7 +259,7 @@ public class ServerPlayerGameMode {
|
|
|
|
if (blockEvent.isCancelled()) {
|
|
// Let the client know the block still exists
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos)); // Paper - Don't resync block
|
|
return;
|
|
}
|
|
|
|
@@ -350,7 +352,7 @@ public class ServerPlayerGameMode {
|
|
|
|
// Tell client the block is gone immediately then process events
|
|
// Don't tell the client if its a creative sword break because its not broken!
|
|
- if (this.level.getBlockEntity(pos) == null && !isSwordNoBreak) {
|
|
+ if (false && this.level.getBlockEntity(pos) == null && !isSwordNoBreak) { // Paper - Don't resync block
|
|
ClientboundBlockUpdatePacket packet = new ClientboundBlockUpdatePacket(pos, Blocks.AIR.defaultBlockState());
|
|
this.player.connection.send(packet);
|
|
}
|
|
@@ -376,13 +378,15 @@ public class ServerPlayerGameMode {
|
|
if (isSwordNoBreak) {
|
|
return false;
|
|
}
|
|
+ // Paper start - Dont resync blocks
|
|
// Let the client know the block still exists
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
+ //this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos));
|
|
|
|
// Brute force all possible updates
|
|
- for (Direction dir : Direction.values()) {
|
|
- this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos.relative(dir)));
|
|
- }
|
|
+ //for (Direction dir : Direction.values()) {
|
|
+ // this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, pos.relative(dir)));
|
|
+ //}
|
|
+ // Paper end
|
|
|
|
// Update any tile entity data for this block
|
|
if (!captureSentBlockEntities) { // Paper - Toggle this location for capturing as this is used for api
|
|
@@ -539,16 +543,18 @@ public class ServerPlayerGameMode {
|
|
if (event.useInteractedBlock() == Event.Result.DENY) {
|
|
// If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door.
|
|
if (iblockdata.getBlock() instanceof DoorBlock) {
|
|
- boolean bottom = iblockdata.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER;
|
|
- player.connection.send(new ClientboundBlockUpdatePacket(world, bottom ? blockposition.above() : blockposition.below()));
|
|
+ // Paper start - Don't resync blocks
|
|
+ // boolean bottom = iblockdata.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER;
|
|
+ // player.connection.send(new ClientboundBlockUpdatePacket(world, bottom ? blockposition.above() : blockposition.below()));
|
|
+ // Paper end
|
|
} else if (iblockdata.getBlock() instanceof CakeBlock) {
|
|
player.getBukkitEntity().sendHealthUpdate(); // SPIGOT-1341 - reset health for cake
|
|
} else if (this.interactItemStack.getItem() instanceof DoubleHighBlockItem) {
|
|
// send a correcting update to the client, as it already placed the upper half of the bisected item
|
|
- player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.relative(hitResult.getDirection()).above()));
|
|
+ //player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.relative(hitResult.getDirection()).above())); // Paper - don't resync blocks
|
|
|
|
// send a correcting update to the client for the block above as well, this because of replaceable blocks (such as grass, sea grass etc)
|
|
- player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.above()));
|
|
+ //player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.above())); // Paper - don't resync blocks
|
|
// Paper start - extend Player Interact cancellation // TODO: consider merging this into the extracted method
|
|
} else if (iblockdata.getBlock() instanceof net.minecraft.world.level.block.StructureBlock) {
|
|
player.connection.send(new net.minecraft.network.protocol.game.ClientboundContainerClosePacket(this.player.containerMenu.containerId));
|
|
diff --git a/src/main/java/net/minecraft/world/item/BucketItem.java b/src/main/java/net/minecraft/world/item/BucketItem.java
|
|
index 277555a26e8281dd1a626e572794b08cf51d00c5..aa0f09a18ea781e027ea70928b30d3e93061120f 100644
|
|
--- a/src/main/java/net/minecraft/world/item/BucketItem.java
|
|
+++ b/src/main/java/net/minecraft/world/item/BucketItem.java
|
|
@@ -77,7 +77,7 @@ public class BucketItem extends Item implements DispensibleContainerItem {
|
|
PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) world, user, blockposition, blockposition, movingobjectpositionblock.getDirection(), itemstack, dummyFluid.getItem(), hand);
|
|
|
|
if (event.isCancelled()) {
|
|
- ((ServerPlayer) user).connection.send(new ClientboundBlockUpdatePacket(world, blockposition)); // SPIGOT-5163 (see PlayerInteractManager)
|
|
+ // ((ServerPlayer) user).connection.send(new ClientboundBlockUpdatePacket(world, blockposition)); // SPIGOT-5163 (see PlayerInteractManager) // Paper - Don't resend blocks
|
|
((ServerPlayer) user).getBukkitEntity().updateInventory(); // SPIGOT-4541
|
|
return InteractionResultHolder.fail(itemstack);
|
|
}
|
|
@@ -186,7 +186,7 @@ public class BucketItem extends Item implements DispensibleContainerItem {
|
|
if (flag2 && entityhuman != null) {
|
|
PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) world, entityhuman, blockposition, clicked, enumdirection, itemstack, enumhand);
|
|
if (event.isCancelled()) {
|
|
- ((ServerPlayer) entityhuman).connection.send(new ClientboundBlockUpdatePacket(world, blockposition)); // SPIGOT-4238: needed when looking through entity
|
|
+ // ((ServerPlayer) entityhuman).connection.send(new ClientboundBlockUpdatePacket(world, blockposition)); // SPIGOT-4238: needed when looking through entity // Paper - Don't resend blocks
|
|
((ServerPlayer) entityhuman).getBukkitEntity().updateInventory(); // SPIGOT-4541
|
|
return false;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
index 852727221d5cb8bcc14c57664622c13d8d03c159..de277d61b718fe07a87d75a2547bb1c7f8553aa1 100644
|
|
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
@@ -457,10 +457,12 @@ public final class ItemStack {
|
|
world.preventPoiUpdated = false;
|
|
|
|
// Brute force all possible updates
|
|
- BlockPos placedPos = ((CraftBlock) placeEvent.getBlock()).getPosition();
|
|
- for (Direction dir : Direction.values()) {
|
|
- ((ServerPlayer) entityhuman).connection.send(new ClientboundBlockUpdatePacket(world, placedPos.relative(dir)));
|
|
- }
|
|
+ // Paper start - don't resync blocks
|
|
+ // BlockPos placedPos = ((CraftBlock) placeEvent.getBlock()).getPosition();
|
|
+ // for (Direction dir : Direction.values()) {
|
|
+ // ((ServerPlayer) entityhuman).connection.send(new ClientboundBlockUpdatePacket(world, placedPos.relative(dir)));
|
|
+ // }
|
|
+ // Paper end
|
|
SignItem.openSign = null; // SPIGOT-6758 - Reset on early return
|
|
} else {
|
|
// Change the stack to its new contents if it hasn't been tampered with.
|