mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-05 02:22:12 +01:00
d8e07590e3
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 5dbedae1 PR-864: Fix Registry#match() failing namespaced inputs 49256865 PR-863: Fix boolean PersistentDataType 9f15450b SPIGOT-7195, SPIGOT-7197: Add DataPack API ebef5b6a Disable InterfaceIsType Checkstyle check 01d577f5 Slight tweak to boolean PersistentDataType javadoc d2b99e56 PR-857: Add boolean PersistentDataType CraftBukkit Changes: 2270366cd PR-1196: Test Registry instances more thoroughly 863dacb7a PR-1191: Do not start on pre-release Java 17 1f2dd8e12 SPIGOT-7362: Properly handle null in CraftBlock#blockFaceToNotch() dbc70bed5 SPIGOT-7195, SPIGOT-7197: Add DataPack API
98 lines
5.6 KiB
Diff
98 lines
5.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Nassim Jahnke <nassim@njahnke.dev>
|
|
Date: Mon, 31 Jan 2022 11:21:50 +0100
|
|
Subject: [PATCH] Implement regenerateChunk
|
|
|
|
Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index fafcc9948778a80841975191014aa0435f1cad94..1d50e5ace7035873523ca16d683b196732176ea5 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -142,6 +142,7 @@ import org.jetbrains.annotations.NotNull;
|
|
public class CraftWorld extends CraftRegionAccessor implements World {
|
|
public static final int CUSTOM_DIMENSION_OFFSET = 10;
|
|
private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
|
|
+ private static final ChunkStatus[] REGEN_CHUNK_STATUSES = {ChunkStatus.BIOMES, ChunkStatus.NOISE, ChunkStatus.SURFACE, ChunkStatus.CARVERS, ChunkStatus.LIQUID_CARVERS, ChunkStatus.FEATURES}; // Paper - implement regenerate chunk method
|
|
|
|
private final ServerLevel world;
|
|
private WorldBorder worldBorder;
|
|
@@ -427,27 +428,62 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
@Override
|
|
public boolean regenerateChunk(int x, int z) {
|
|
org.spigotmc.AsyncCatcher.catchOp("chunk regenerate"); // Spigot
|
|
- throw new UnsupportedOperationException("Not supported in this Minecraft version! Unless you can fix it, this is not a bug :)");
|
|
- /*
|
|
- if (!unloadChunk0(x, z, false)) {
|
|
- return false;
|
|
- }
|
|
-
|
|
- final long chunkKey = ChunkCoordIntPair.pair(x, z);
|
|
- world.getChunkProvider().unloadQueue.remove(chunkKey);
|
|
+ // Paper start - implement regenerateChunk method
|
|
+ final ServerLevel serverLevel = this.world;
|
|
+ final net.minecraft.server.level.ServerChunkCache serverChunkCache = serverLevel.getChunkSource();
|
|
+ final ChunkPos chunkPos = new ChunkPos(x, z);
|
|
+ final net.minecraft.world.level.chunk.LevelChunk levelChunk = serverChunkCache.getChunk(chunkPos.x, chunkPos.z, true);
|
|
+ for (final BlockPos blockPos : BlockPos.betweenClosed(chunkPos.getMinBlockX(), serverLevel.getMinBuildHeight(), chunkPos.getMinBlockZ(), chunkPos.getMaxBlockX(), serverLevel.getMaxBuildHeight() - 1, chunkPos.getMaxBlockZ())) {
|
|
+ levelChunk.removeBlockEntity(blockPos);
|
|
+ serverLevel.setBlock(blockPos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState(), 16);
|
|
+ }
|
|
+
|
|
+ for (final ChunkStatus chunkStatus : REGEN_CHUNK_STATUSES) {
|
|
+ final List<ChunkAccess> list = new ArrayList<>();
|
|
+ final int range = Math.max(1, chunkStatus.getRange());
|
|
+ for (int chunkX = chunkPos.z - range; chunkX <= chunkPos.z + range; chunkX++) {
|
|
+ for (int chunkZ = chunkPos.x - range; chunkZ <= chunkPos.x + range; chunkZ++) {
|
|
+ ChunkAccess chunkAccess = serverChunkCache.getChunk(chunkZ, chunkX, chunkStatus.getParent(), true);
|
|
+ if (chunkAccess instanceof ImposterProtoChunk accessProtoChunk) {
|
|
+ chunkAccess = new ImposterProtoChunk(accessProtoChunk.getWrapped(), true);
|
|
+ } else if (chunkAccess instanceof net.minecraft.world.level.chunk.LevelChunk accessLevelChunk) {
|
|
+ chunkAccess = new ImposterProtoChunk(accessLevelChunk, true);
|
|
+ }
|
|
+ list.add(chunkAccess);
|
|
+ }
|
|
+ }
|
|
|
|
- net.minecraft.server.Chunk chunk = world.getChunkProvider().generateChunk(x, z);
|
|
- PlayerChunk playerChunk = world.getPlayerChunkMap().getChunk(x, z);
|
|
- if (playerChunk != null) {
|
|
- playerChunk.chunk = chunk;
|
|
+ final java.util.concurrent.CompletableFuture<com.mojang.datafixers.util.Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> future = chunkStatus.generate(
|
|
+ Runnable::run,
|
|
+ serverLevel,
|
|
+ serverChunkCache.getGenerator(),
|
|
+ serverLevel.getStructureManager(),
|
|
+ serverChunkCache.getLightEngine(),
|
|
+ chunk -> {
|
|
+ throw new UnsupportedOperationException("Not creating full chunks here");
|
|
+ },
|
|
+ list,
|
|
+ true
|
|
+ );
|
|
+ serverChunkCache.mainThreadProcessor.managedBlock(future::isDone);
|
|
+ if (chunkStatus == ChunkStatus.NOISE) {
|
|
+ future.join().left().ifPresent(chunk -> net.minecraft.world.level.levelgen.Heightmap.primeHeightmaps(chunk, ChunkStatus.POST_FEATURES));
|
|
+ }
|
|
}
|
|
|
|
- if (chunk != null) {
|
|
- refreshChunk(x, z);
|
|
+ for (final BlockPos blockPos : BlockPos.betweenClosed(chunkPos.getMinBlockX(), serverLevel.getMinBuildHeight(), chunkPos.getMinBlockZ(), chunkPos.getMaxBlockX(), serverLevel.getMaxBuildHeight() - 1, chunkPos.getMaxBlockZ())) {
|
|
+ serverChunkCache.blockChanged(blockPos);
|
|
}
|
|
|
|
- return chunk != null;
|
|
- */
|
|
+ final Set<ChunkPos> chunksToRelight = new HashSet<>(9);
|
|
+ for (int chunkX = chunkPos.x - 1; chunkX <= chunkPos.x + 1 ; chunkX++) {
|
|
+ for (int chunkZ = chunkPos.z - 1; chunkZ <= chunkPos.z + 1 ; chunkZ++) {
|
|
+ chunksToRelight.add(new ChunkPos(chunkX, chunkZ));
|
|
+ }
|
|
+ }
|
|
+ serverChunkCache.getLightEngine().relight(chunksToRelight, pos -> {}, relit -> {});
|
|
+ return true;
|
|
+ // Paper end
|
|
}
|
|
|
|
@Override
|