geforkt von Mirrors/Paper
8ed2992da9
Portion of diff was dropped in the mappings update commit. Also remove the option to remove invalid statistics. The server will automatically do this now as of... 1.13?, our option wasn't even doing anything.
129 Zeilen
5.5 KiB
Diff
129 Zeilen
5.5 KiB
Diff
From 08d5af6c98be159bee0271797d26563fdd1814f9 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
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 9aba755a4..2033ace4f 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -425,4 +425,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 d14a9e3a3..0be1bf0d9 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 a8ca29d37..02d8d9749 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<VillageDoor> 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 62771547f..74ac3c1ba 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.20.0
|
|
|