Paper/Spigot-Server-Patches/0311-Don-t-allow-digging-into-unloaded-chunks.patch
Daniel Ennis e792da723a
Updated Upstream (Bukkit/CraftBukkit/Spigot) (#4728)
Upstream has released updates that appears 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:
30885166 Update to Minecraft 1.16.4

CraftBukkit Changes:
3af81c71 Update to Minecraft 1.16.4

Spigot Changes:
f011ca24 Update to Minecraft 1.16.4

Co-authored-by: Mariell Hoversholm <proximyst@proximyst.com>
2020-11-02 20:22:15 -06:00

69 lines
4.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Sun, 11 Nov 2018 21:01:09 +0000
Subject: [PATCH] Don't allow digging into unloaded chunks
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index b4270cab83e676ea9cd6975286f96e350a493962..1adf90526360bd0cf2a46251dd767498ac44565c 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -1368,6 +1368,11 @@ public class PlayerConnection implements PacketListenerPlayIn {
case START_DESTROY_BLOCK:
case ABORT_DESTROY_BLOCK:
case STOP_DESTROY_BLOCK:
+ // Paper start - Don't allow digging in unloaded chunks
+ if (this.player.world.getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4) == null) {
+ return;
+ }
+ // Paper end - Don't allow digging in unloaded chunks
this.player.playerInteractManager.a(blockposition, packetplayinblockdig_enumplayerdigtype, packetplayinblockdig.c(), this.minecraftServer.getMaxBuildHeight());
return;
default:
diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java
index 9b282a917e797a652b5ec10f1f9f550b6d82777f..3056468a7e70238228b91be0f103cfbe111fedb5 100644
--- a/src/main/java/net/minecraft/server/PlayerInteractManager.java
+++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java
@@ -80,8 +80,8 @@ public class PlayerInteractManager {
IBlockData iblockdata;
if (this.j) {
- iblockdata = this.world.getType(this.k);
- if (iblockdata.isAir()) {
+ iblockdata = this.world.getTypeIfLoaded(this.k); // Paper
+ if (iblockdata == null || iblockdata.isAir()) { // Paper
this.j = false;
} else {
float f = this.a(iblockdata, this.k, this.l);
@@ -92,7 +92,13 @@ public class PlayerInteractManager {
}
}
} else if (this.f) {
- iblockdata = this.world.getType(this.h);
+ // Paper start - don't want to do same logic as above, return instead
+ iblockdata = this.world.getTypeIfLoaded(this.h);
+ if (iblockdata == null) {
+ this.f = false;
+ return;
+ }
+ // Paper end
if (iblockdata.isAir()) {
this.world.a(this.player.getId(), this.h, -1);
this.m = -1;
@@ -256,10 +262,12 @@ public class PlayerInteractManager {
this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "stopped destroying"));
} else if (packetplayinblockdig_enumplayerdigtype == PacketPlayInBlockDig.EnumPlayerDigType.ABORT_DESTROY_BLOCK) {
this.f = false;
- if (!Objects.equals(this.h, blockposition)) {
+ if (!Objects.equals(this.h, blockposition) && !BlockPosition.ZERO.equals(this.h)) {
PlayerInteractManager.LOGGER.debug("Mismatch in destroy block pos: " + this.h + " " + blockposition); // CraftBukkit - SPIGOT-5457 sent by client when interact event cancelled
- this.world.a(this.player.getId(), this.h, -1);
- this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(this.h, this.world.getType(this.h), packetplayinblockdig_enumplayerdigtype, true, "aborted mismatched destroying"));
+ IBlockData type = this.world.getTypeIfLoaded(this.h); // Paper - don't load unloaded chunks for stale records here
+ if (type != null) this.world.a(this.player.getId(), this.h, -1); // Paper
+ if (type != null) this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(this.h, type, packetplayinblockdig_enumplayerdigtype, true, "aborted mismatched destroying")); // Paper
+ this.h = BlockPosition.ZERO; // Paper
}
this.world.a(this.player.getId(), blockposition, -1);