@@ -5052,7 +5052,7 @@ index 868f6799a0e406401eecf18bc939fbdf88f534a2..dd8d14a1b128f801a4e1c811de5990d2
5052
5052
} catch (Throwable throwable) {
5053
5053
// Spigot Start
5054
5054
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
5055
- index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81eff0e4358 100644
5055
+ index a6dc73ddb58465667b9e227bece32f2952aa2270..e9523a7a3e1c6ee944ba539b952c8f25350bf815 100644
5056
5056
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
5057
5057
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
5058
5058
@@ -52,9 +52,9 @@ public class ChunkHolder {
@@ -5077,38 +5077,31 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5077
5077
public ChunkHolder(ChunkPos pos, int level, LevelHeightAccessor world, LevelLightEngine lightingProvider, ChunkHolder.LevelChangeListener levelUpdateListener, ChunkHolder.PlayerProvider playersWatchingChunkProvider) {
5078
5078
this.futures = new AtomicReferenceArray(ChunkHolder.CHUNK_STATUSES.size());
5079
5079
this.fullChunkFuture = ChunkHolder.UNLOADED_LEVEL_CHUNK_FUTURE;
5080
- @@ -93,8 +95,30 @@ public class ChunkHolder {
5080
+ @@ -93,8 +95,23 @@ public class ChunkHolder {
5081
5081
this.queueLevel = this.oldTicketLevel;
5082
5082
this.setTicketLevel(level);
5083
5083
this.changedBlocksPerSection = new ShortSet[world.getSectionsCount()];
5084
5084
+ this.chunkMap = (ChunkMap)playersWatchingChunkProvider; // Paper
5085
- + }
5086
- +
5087
- + // Paper start
5088
- + public LevelChunk getFullChunkUnchecked() {
5089
- + CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> statusFuture = this.getFutureIfPresentUnchecked(ChunkStatus.FULL);
5090
- + Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure> either = (Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>) statusFuture.getNow(null);
5091
- + return (either == null) ? null : (LevelChunk) either.left().orElse(null);
5092
5085
}
5093
5086
5094
- + public ChunkAccess getAvailableChunkNow() {
5087
+ + // Paper start
5088
+ + public @Nullable ChunkAccess getAvailableChunkNow() {
5095
5089
+ // TODO can we just getStatusFuture(EMPTY)?
5096
5090
+ for (ChunkStatus curr = ChunkStatus.FULL, next = curr.getParent(); curr != next; curr = next, next = next.getParent()) {
5097
5091
+ CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> future = this.getFutureIfPresentUnchecked(curr);
5098
5092
+ Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure> either = future.getNow(null);
5099
- + if (either == null || ! either.left().isPresent ()) {
5093
+ + if (either == null || either.left().isEmpty ()) {
5100
5094
+ continue;
5101
5095
+ }
5102
5096
+ return either.left().get();
5103
5097
+ }
5104
5098
+ return null;
5105
5099
+ }
5106
5100
+ // Paper end
5107
- +
5108
- public CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> getFutureIfPresentUnchecked(ChunkStatus leastStatus) {
5109
- CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = (CompletableFuture) this.futures.get(leastStatus.getIndex());
5110
-
5111
- @@ -105,20 +129,20 @@ public class ChunkHolder {
5101
+ // CraftBukkit start
5102
+ public LevelChunk getFullChunkNow() {
5103
+ // Note: We use the oldTicketLevel for isLoaded checks.
5104
+ @@ -119,20 +136,20 @@ public class ChunkHolder {
5112
5105
return ChunkHolder.getStatus(this.ticketLevel).isOrAfter(leastStatus) ? this.getFutureIfPresentUnchecked(leastStatus) : ChunkHolder.UNLOADED_CHUNK_FUTURE;
5113
5106
}
5114
5107
@@ -5133,7 +5126,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5133
5126
CompletableFuture<Either<LevelChunk, ChunkHolder.ChunkLoadingFailure>> completablefuture = this.getTickingChunkFuture();
5134
5127
Either<LevelChunk, ChunkHolder.ChunkLoadingFailure> either = (Either) completablefuture.getNow(null); // CraftBukkit - decompile error
5135
5128
5136
- @@ -126 ,7 +150 ,7 @@ public class ChunkHolder {
5129
+ @@ -140 ,7 +157 ,7 @@ public class ChunkHolder {
5137
5130
}
5138
5131
5139
5132
@Nullable
@@ -5142,7 +5135,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5142
5135
CompletableFuture<Either<LevelChunk, ChunkHolder.ChunkLoadingFailure>> completablefuture = this.getFullChunkFuture();
5143
5136
Either<LevelChunk, ChunkHolder.ChunkLoadingFailure> either = (Either) completablefuture.getNow(null); // CraftBukkit - decompile error
5144
5137
5145
- @@ -147 ,6 +171 ,21 @@ public class ChunkHolder {
5138
+ @@ -161 ,6 +178 ,21 @@ public class ChunkHolder {
5146
5139
return null;
5147
5140
}
5148
5141
@@ -5164,7 +5157,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5164
5157
@Nullable
5165
5158
public ChunkAccess getLastAvailable() {
5166
5159
for (int i = ChunkHolder.CHUNK_STATUSES.size() - 1; i >= 0; --i) {
5167
- @@ -165 ,7 +204 ,7 @@ public class ChunkHolder {
5160
+ @@ -179 ,7 +211 ,7 @@ public class ChunkHolder {
5168
5161
return null;
5169
5162
}
5170
5163
@@ -5173,7 +5166,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5173
5166
return this.chunkToSave;
5174
5167
}
5175
5168
5176
- @@ -342 ,11 +381 ,11 @@ public class ChunkHolder {
5169
+ @@ -356 ,11 +388 ,11 @@ public class ChunkHolder {
5177
5170
return ChunkHolder.getFullChunkStatus(this.ticketLevel);
5178
5171
}
5179
5172
@@ -5187,7 +5180,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5187
5180
return this.ticketLevel;
5188
5181
}
5189
5182
5190
- @@ -435 ,14 +474 ,27 @@ public class ChunkHolder {
5183
+ @@ -449 ,14 +481 ,27 @@ public class ChunkHolder {
5191
5184
5192
5185
this.wasAccessibleSinceLastSave |= flag3;
5193
5186
if (!flag2 && flag3) {
@@ -5215,7 +5208,7 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5215
5208
}
5216
5209
5217
5210
boolean flag4 = playerchunk_state.isOrAfter(ChunkHolder.FullChunkStatus.TICKING);
5218
- @@ -451 ,12 +503 ,29 @@ public class ChunkHolder {
5211
+ @@ -465 ,12 +510 ,29 @@ public class ChunkHolder {
5219
5212
if (!flag4 && flag5) {
5220
5213
this.tickingChunkFuture = chunkStorage.prepareTickingChunk(this);
5221
5214
this.scheduleFullChunkPromotion(chunkStorage, this.tickingChunkFuture, executor, ChunkHolder.FullChunkStatus.TICKING);
@@ -5238,15 +5231,15 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5238
5231
+ this.tickingChunkFuture.complete(ChunkHolder.UNLOADED_LEVEL_CHUNK); this.isTickingReady = false; // Paper - cache chunk ticking stage
5239
5232
this.tickingChunkFuture = ChunkHolder.UNLOADED_LEVEL_CHUNK_FUTURE;
5240
5233
+ // Paper start - ticking chunk set
5241
- + LevelChunk chunkIfCached = this.getFullChunkUnchecked ();
5234
+ + LevelChunk chunkIfCached = this.getFullChunkNowUnchecked ();
5242
5235
+ if (chunkIfCached != null) {
5243
5236
+ this.chunkMap.level.getChunkSource().tickingChunks.remove(chunkIfCached);
5244
5237
+ }
5245
5238
+ // Paper end - ticking chunk set
5246
5239
}
5247
5240
5248
5241
boolean flag6 = playerchunk_state.isOrAfter(ChunkHolder.FullChunkStatus.ENTITY_TICKING);
5249
- @@ -469 ,12 +538 ,28 @@ public class ChunkHolder {
5242
+ @@ -483 ,12 +545 ,28 @@ public class ChunkHolder {
5250
5243
5251
5244
this.entityTickingChunkFuture = chunkStorage.prepareEntityTickingChunk(this.pos);
5252
5245
this.scheduleFullChunkPromotion(chunkStorage, this.entityTickingChunkFuture, executor, ChunkHolder.FullChunkStatus.ENTITY_TICKING);
@@ -5268,15 +5261,15 @@ index d1a053dbade32fde28784c79659d9b150c90ed93..2b936c67265f3c672d3b623e6aedd81e
5268
5261
+ this.entityTickingChunkFuture.complete(ChunkHolder.UNLOADED_LEVEL_CHUNK); this.isEntityTickingReady = false; // Paper - cache chunk ticking stage
5269
5262
this.entityTickingChunkFuture = ChunkHolder.UNLOADED_LEVEL_CHUNK_FUTURE;
5270
5263
+ // Paper start - entity ticking chunk set
5271
- + LevelChunk chunkIfCached = this.getFullChunkUnchecked ();
5264
+ + LevelChunk chunkIfCached = this.getFullChunkNowUnchecked ();
5272
5265
+ if (chunkIfCached != null) {
5273
5266
+ this.chunkMap.level.getChunkSource().entityTickingChunks.remove(chunkIfCached);
5274
5267
+ }
5275
5268
+ // Paper end - entity ticking chunk set
5276
5269
}
5277
5270
5278
5271
if (!playerchunk_state1.isOrAfter(playerchunk_state)) {
5279
- @@ -590 ,4 +675 ,18 @@ public class ChunkHolder {
5272
+ @@ -604 ,4 +682 ,18 @@ public class ChunkHolder {
5280
5273
}
5281
5274
};
5282
5275
}
@@ -5496,7 +5489,7 @@ index 6c98676827ceb6999f340fa2b06a0b3e1cb4cae2..f08089b8672454acf8c2309e850466b3
5496
5489
5497
5490
while (objectiterator.hasNext()) {
5498
5491
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
5499
- index 2015e527044db26bed960b2915b5422a7d7ad0e3..94d717f43336ace9375409b48d1e0e4291072656 100644
5492
+ index 7c034b62dbebbbc4c9c4ceb427b1509fe8f986e3..e4d0035bbf17008642cdcc0e1dca5bae832bbbaa 100644
5500
5493
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
5501
5494
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
5502
5495
@@ -49,6 +49,7 @@ import net.minecraft.world.level.storage.LevelStorageSource;
@@ -5842,7 +5835,7 @@ index 2015e527044db26bed960b2915b5422a7d7ad0e3..94d717f43336ace9375409b48d1e0e42
5842
5835
5843
5836
public ServerChunkCache(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureManager structureManager, Executor workerExecutor, ChunkGenerator chunkGenerator, int viewDistance, int simulationDistance, boolean dsync, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory) {
5844
5837
this.level = world;
5845
- @@ -127 ,6 +456 ,49 @@ public class ServerChunkCache extends ChunkSource {
5838
+ @@ -119 ,6 +448 ,49 @@ public class ServerChunkCache extends ChunkSource {
5846
5839
this.lastChunk[0] = chunk;
5847
5840
}
5848
5841
@@ -5859,7 +5852,7 @@ index 2015e527044db26bed960b2915b5422a7d7ad0e3..94d717f43336ace9375409b48d1e0e42
5859
5852
+ return null;
5860
5853
+ }
5861
5854
+
5862
- + return playerChunk.getFullChunkUnchecked ();
5855
+ + return playerChunk.getFullChunkNowUnchecked ();
5863
5856
+ }
5864
5857
+
5865
5858
+ @Nullable
0 commit comments