e38eceb42a
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 Spigot Changes: a19903d2 SPIGOT-520: Add option to disable player data saving
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 3a12052b805c84de8b3ed43cdc0f7fb81a4b1211..1ea1066109814ae441f5ec3be2e72766bf6b67b7 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
@@ -1370,6 +1370,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);
|