geforkt von Mirrors/Paper
c5a10665b8
Spigot still maintains some partial implementation of "tick skipping", a practice in which the MinecraftServer.currentTick field is updated not by an increment of one per actual tick, but instead set to System.currentTimeMillis() / 50. This behaviour means that the tracked tick may "skip" a tick value in case a previous tick took more than the expected 50ms. To compensate for this in important paths, spigot/craftbukkit implements "wall-time". Instead of incrementing/decrementing ticks on block entities/entities by one for each call to their tick() method, they instead increment/decrement important values, like an ItemEntity's age or pickupDelay, by the difference of `currentTick - lastTick`, where `lastTick` is the value of `currentTick` during the last tick() call. These "fixes" however do not play nicely with minecraft's simulation distance as entities/block entities implementing the above behaviour would "catch up" their values when moving from a non-ticking chunk to a ticking one as their `lastTick` value remains stuck on the last tick in a ticking chunk and hence lead to a large "catch up" once ticked again. Paper completely removes the "tick skipping" behaviour (See patch "Further-improve-server-tick-loop"), making the above precautions completely unnecessary, which also rids paper of the previous described incompatibility with non-ticking chunks.
43 Zeilen
2.2 KiB
Diff
43 Zeilen
2.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
Date: Sat, 19 Mar 2022 12:12:22 +0000
|
|
Subject: [PATCH] Buffer OOB setBlock calls
|
|
|
|
lets debug mode throw a trace in order to potentially see where
|
|
such calls are cascading from easier, but, generally, if you see one setBlock
|
|
call, you're gonna see more, and this just potentially causes a flood of logs
|
|
which can cause issues for slower terminals, etc.
|
|
|
|
We can limit the flood by just allowing one for a single gen region,
|
|
we'll also only gen a trace for the first one, I see no real pressing need
|
|
to generate more, given that that would *massively* negate this patch otherwise
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
index 421f146ea9c35b852251c0ddb29856c13e11aef3..13229388ddce668061a34c787ab9586d41854d8a 100644
|
|
--- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
|
|
@@ -284,6 +284,7 @@ public class WorldGenRegion implements WorldGenLevel {
|
|
}
|
|
}
|
|
|
|
+ private boolean hasSetFarWarned = false; // Paper - Buffer OOB setBlock calls
|
|
@Override
|
|
public boolean ensureCanWrite(BlockPos pos) {
|
|
int i = SectionPos.blockToSectionCoord(pos.getX());
|
|
@@ -303,7 +304,15 @@ public class WorldGenRegion implements WorldGenLevel {
|
|
|
|
return true;
|
|
} else {
|
|
+ // Paper start - Buffer OOB setBlock calls
|
|
+ if (!hasSetFarWarned) {
|
|
Util.logAndPauseIfInIde("Detected setBlock in a far chunk [" + i + ", " + j + "], pos: " + String.valueOf(pos) + ", status: " + String.valueOf(this.generatingStep.targetStatus()) + (this.currentlyGenerating == null ? "" : ", currently generating: " + (String) this.currentlyGenerating.get()));
|
|
+ hasSetFarWarned = true;
|
|
+ if (this.getServer() != null && this.getServer().isDebugging()) {
|
|
+ io.papermc.paper.util.TraceUtil.dumpTraceForThread("far setBlock call");
|
|
+ }
|
|
+ }
|
|
+ // Paper end - Buffer OOB setBlock calls
|
|
return false;
|
|
}
|
|
}
|