e792da723a
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>
69 Zeilen
4.3 KiB
Diff
69 Zeilen
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);
|