Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-21 05:50:05 +01:00
129 Zeilen
5.6 KiB
Diff
129 Zeilen
5.6 KiB
Diff
From 303049b123b3adb9aea02f550750a9afc8a45887 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 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<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 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
|
|
|