geforkt von Mirrors/Paper
ef0e5a642d
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: 9ae3f10f SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API 48c0c547 PR-786: Add methods to get sounds from entities CraftBukkit Changes: 5cc9c022a SPIGOT-7152: Handle hand item changing during air interact event 4ffa1acf6 SPIGOT-7154: Players get kicked when interacting with a conversation 4daa21123 SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API e5d6a9bbf PR-1100: Add methods to get sounds from entities b7e9f1c8b SPIGOT-7146: Reduce use of Material switch in ItemMeta Spigot Changes: 4c157bb4 Rebuild patches
130 Zeilen
6.8 KiB
Diff
130 Zeilen
6.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: MiniDigger <admin@benndorf.dev>
|
|
Date: Wed, 29 Apr 2020 02:10:32 +0200
|
|
Subject: [PATCH] Allow delegation to vanilla chunk gen
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 4adacf6f849fe41918690fb8f195727a9c880b53..96ad0b334b2985c295be4f20df06e6eb73fbb22f 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -2329,6 +2329,90 @@ public final class CraftServer implements Server {
|
|
return new OldCraftChunkData(world.getMinHeight(), world.getMaxHeight(), handle.registryAccess().registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY), world); // Paper - Anti-Xray - Add parameters
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private static final List<net.minecraft.world.level.chunk.ChunkStatus> VANILLA_GEN_STATUSES = List.of(
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.EMPTY,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.STRUCTURE_STARTS,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.STRUCTURE_REFERENCES,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.BIOMES,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.NOISE,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.SURFACE,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.CARVERS,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.LIQUID_CARVERS,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.FEATURES,
|
|
+ net.minecraft.world.level.chunk.ChunkStatus.LIGHT
|
|
+ );
|
|
+
|
|
+ @Override
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public ChunkGenerator.ChunkData createVanillaChunkData(World world, int x, int z) {
|
|
+ // do bunch of vanilla shit
|
|
+ final net.minecraft.server.level.ServerLevel serverLevel = ((CraftWorld) world).getHandle();
|
|
+ final net.minecraft.core.Registry<net.minecraft.world.level.biome.Biome> biomeRegistry = serverLevel.getServer().registryAccess().registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY);
|
|
+ final net.minecraft.world.level.chunk.ProtoChunk protoChunk = new net.minecraft.world.level.chunk.ProtoChunk(
|
|
+ new net.minecraft.world.level.ChunkPos(x, z),
|
|
+ net.minecraft.world.level.chunk.UpgradeData.EMPTY,
|
|
+ serverLevel,
|
|
+ biomeRegistry,
|
|
+ null
|
|
+ );
|
|
+
|
|
+ final net.minecraft.world.level.chunk.ChunkGenerator chunkGenerator;
|
|
+ if (serverLevel.chunkSource.getGenerator() instanceof org.bukkit.craftbukkit.generator.CustomChunkGenerator bukkit) {
|
|
+ chunkGenerator = bukkit.delegate;
|
|
+ } else {
|
|
+ chunkGenerator = serverLevel.chunkSource.getGenerator();
|
|
+ }
|
|
+
|
|
+ final net.minecraft.world.level.ChunkPos chunkPos = new net.minecraft.world.level.ChunkPos(x, z);
|
|
+ final net.minecraft.util.thread.ProcessorMailbox<Runnable> mailbox = net.minecraft.util.thread.ProcessorMailbox.create(
|
|
+ net.minecraft.Util.backgroundExecutor(),
|
|
+ "CraftServer#createVanillaChunkData(worldName='" + world.getName() + "', x='" + x + "', z='" + z + "')"
|
|
+ );
|
|
+ for (final net.minecraft.world.level.chunk.ChunkStatus chunkStatus : VANILLA_GEN_STATUSES) {
|
|
+ final List<net.minecraft.world.level.chunk.ChunkAccess> chunks = Lists.newArrayList();
|
|
+ final int statusRange = Math.max(1, chunkStatus.getRange());
|
|
+
|
|
+ for (int zz = chunkPos.z - statusRange; zz <= chunkPos.z + statusRange; ++zz) {
|
|
+ for (int xx = chunkPos.x - statusRange; xx <= chunkPos.x + statusRange; ++xx) {
|
|
+ if (xx == chunkPos.x && zz == chunkPos.z) {
|
|
+ chunks.add(protoChunk);
|
|
+ } else {
|
|
+ final net.minecraft.core.Holder<net.minecraft.world.level.biome.Biome> biomeHolder = serverLevel.registryAccess().registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY).getHolderOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS);
|
|
+ final net.minecraft.world.level.chunk.ChunkAccess chunk = new net.minecraft.world.level.chunk.EmptyLevelChunk(serverLevel, new net.minecraft.world.level.ChunkPos(xx, zz), biomeHolder);
|
|
+ chunks.add(chunk);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ chunkStatus.generate(
|
|
+ mailbox::tell,
|
|
+ serverLevel,
|
|
+ chunkGenerator,
|
|
+ serverLevel.getStructureManager(),
|
|
+ serverLevel.chunkSource.getLightEngine(),
|
|
+ chunk -> {
|
|
+ throw new UnsupportedOperationException("Not creating full chunks here");
|
|
+ },
|
|
+ chunks,
|
|
+ true
|
|
+ ).thenAccept(either -> {
|
|
+ if (chunkStatus == net.minecraft.world.level.chunk.ChunkStatus.NOISE) {
|
|
+ either.left().ifPresent(chunk -> net.minecraft.world.level.levelgen.Heightmap.primeHeightmaps(chunk, net.minecraft.world.level.chunk.ChunkStatus.POST_FEATURES));
|
|
+ }
|
|
+ }).join();
|
|
+ }
|
|
+
|
|
+ // get empty object
|
|
+ OldCraftChunkData data = (OldCraftChunkData) this.createChunkData(world);
|
|
+ // copy over generated sections
|
|
+ data.getLights().addAll(protoChunk.getLights().toList());
|
|
+ data.setRawChunkData(protoChunk.getSections());
|
|
+ // hooray!
|
|
+ return data;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public BossBar createBossBar(String title, BarColor color, BarStyle style, BarFlag... flags) {
|
|
return new CraftBossBar(title, color, style, flags);
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java b/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java
|
|
index 4a23d03757e1735b9ebb8c003adcc0374a7d672d..ce006e1d6c38e5b0bdb336c480fb9d291292f75c 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java
|
|
@@ -23,7 +23,7 @@ import org.bukkit.material.MaterialData;
|
|
public final class OldCraftChunkData implements ChunkGenerator.ChunkData {
|
|
private final int minHeight;
|
|
private final int maxHeight;
|
|
- private final LevelChunkSection[] sections;
|
|
+ private LevelChunkSection[] sections; // Paper
|
|
private final Registry<net.minecraft.world.level.biome.Biome> biomes;
|
|
private Set<BlockPos> tiles;
|
|
private final Set<BlockPos> lights = new HashSet<>();
|
|
@@ -194,7 +194,13 @@ public final class OldCraftChunkData implements ChunkGenerator.ChunkData {
|
|
return this.tiles;
|
|
}
|
|
|
|
- Set<BlockPos> getLights() {
|
|
+ public Set<BlockPos> getLights() { // Paper
|
|
return this.lights;
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ public void setRawChunkData(LevelChunkSection[] sections) {
|
|
+ this.sections = sections;
|
|
+ }
|
|
+ // Paper end
|
|
}
|