From 303049b123b3adb9aea02f550750a9afc8a45887 Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 5 Jun 2018 00:32:22 -0400 Subject: [PATCH] Configurable Villages loading chunks for door checks This avoids villages spam loading chunks sync. diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java index af6b97708a..a005c8c4ec 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -420,4 +420,12 @@ public class PaperWorldConfig { disableEnderpearlExploit = getBoolean("game-mechanics.disable-unloaded-chunk-enderpearl-exploit", disableEnderpearlExploit); log("Disable Unloaded Chunk Enderpearl Exploit: " + (disableEnderpearlExploit ? "enabled" : "disabled")); } + + public boolean villagesLoadChunks = false; + private void villagesLoadChunks() { + villagesLoadChunks = getBoolean("game-mechanics.villages-load-chunks", false); + if (villagesLoadChunks) { + log("Villages can load chunks - Warning this can cause intense TPS loss. Strongly consider disabling this."); + } + } } diff --git a/src/main/java/net/minecraft/server/PersistentVillage.java b/src/main/java/net/minecraft/server/PersistentVillage.java index d14a9e3a3e..0be1bf0d99 100644 --- a/src/main/java/net/minecraft/server/PersistentVillage.java +++ b/src/main/java/net/minecraft/server/PersistentVillage.java @@ -123,7 +123,7 @@ public class PersistentVillage extends PersistentBase { for(int j = -4; j < 4; ++j) { for(int k = -16; k < 16; ++k) { blockposition$mutableblockposition.g(blockposition).d(i, j, k); - IBlockData iblockdata = this.world.getType(blockposition$mutableblockposition); + IBlockData iblockdata = this.world.paperConfig.villagesLoadChunks ? this.world.getType(blockposition$mutableblockposition) : this.world.getTypeIfLoaded(blockposition$mutableblockposition); // Paper if (this.a(iblockdata)) { VillageDoor villagedoor = this.c(blockposition$mutableblockposition); if (villagedoor == null) { @@ -193,7 +193,7 @@ public class PersistentVillage extends PersistentBase { } private boolean a(IBlockData iblockdata) { - return iblockdata.getBlock() instanceof BlockDoor && iblockdata.getMaterial() == Material.WOOD; + return iblockdata != null && iblockdata.getBlock() instanceof BlockDoor && iblockdata.getMaterial() == Material.WOOD; // Paper } public void a(NBTTagCompound nbttagcompound) { diff --git a/src/main/java/net/minecraft/server/Village.java b/src/main/java/net/minecraft/server/Village.java index bda67faefe..5b56ae1818 100644 --- a/src/main/java/net/minecraft/server/Village.java +++ b/src/main/java/net/minecraft/server/Village.java @@ -11,10 +11,10 @@ import javax.annotation.Nullable; public class Village { - private World a; + private World a; private World getWorld() { return a; } // Paper - OBFHELPER private final List b = Lists.newArrayList(); private BlockPosition c; - private BlockPosition d; + private BlockPosition d;private BlockPosition getCenter() { return d; } // Paper - OBFHELPER private int e; private int f; private int g; @@ -44,6 +44,12 @@ public class Village { } public void a(int i) { + // Paper - don't tick village if chunk isn't loaded + Chunk chunk = getWorld().getChunkIfLoaded(getCenter()); + if (chunk == null || !chunk.areNeighborsLoaded(1)) { + return; + } + // Paper end this.g = i; this.m(); this.l(); @@ -292,6 +298,12 @@ public class Village { while (iterator.hasNext()) { VillageDoor villagedoor = (VillageDoor) iterator.next(); + // Paper start - don't remove doors from unloaded chunks + if (!getWorld().isLoaded(villagedoor.getPosition())) { + villagedoor.setLastSeen(villagedoor.getLastSeen() + 1); + continue; + } + // Paper end if (flag1) { villagedoor.a(); @@ -312,7 +324,9 @@ public class Village { } private boolean g(BlockPosition blockposition) { - IBlockData iblockdata = this.a.getType(blockposition); + IBlockData iblockdata = this.a.paperConfig.villagesLoadChunks ? this.a.getType(blockposition) : this.a.getTypeIfLoaded(blockposition); // Paper + if (iblockdata == null) return false; // Paper + Block block = iblockdata.getBlock(); return block instanceof BlockDoor ? iblockdata.getMaterial() == Material.WOOD : false; diff --git a/src/main/java/net/minecraft/server/VillageDoor.java b/src/main/java/net/minecraft/server/VillageDoor.java index 62771547f6..74ac3c1ba6 100644 --- a/src/main/java/net/minecraft/server/VillageDoor.java +++ b/src/main/java/net/minecraft/server/VillageDoor.java @@ -59,6 +59,7 @@ public class VillageDoor { return this.f; } + public BlockPosition getPosition() { return d(); } // Paper - OBFHELPER public BlockPosition d() { return this.a; } @@ -75,10 +76,12 @@ public class VillageDoor { return this.c.getAdjacentZ() * 2; } + public int getLastSeen() { return h(); } // Paper - OBFHELPER public int h() { return this.d; } + public void setLastSeen(int i) { a(i); } // Paper - OBFHELPER public void a(int i) { this.d = i; } -- 2.19.1