mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 15:30:19 +01:00
dd11ef8441
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: 3a3bea52 SPIGOT-7829: Increase maximum outgoing plugin message size to match Vanilla intention 5cd1c8cb SPIGOT-7831: Add CreatureSpawnEvent.SpawnReason#POTION_EFFECT a8e278f0 SPIGOT-7827: Sync EntityPortalEvent with PlayerPortalEvent since non-players can now create portals 53729d12 Remove spurious ApiStatus.Internal annotation b9f57486 SPIGOT-7799, PR-1039: Expose explosion world interaction in EntityExplodeEvent and BlockExplodeEvent 7983b966 PR-1029: Trial changing a small number of inner enums to classes/interfaces to better support custom values CraftBukkit Changes: 403accd56 SPIGOT-7831: Add CreatureSpawnEvent.SpawnReason#POTION_EFFECT 812761660 Increase outdated build delay bed1e3ff6 SPIGOT-7827: Sync EntityPortalEvent with PlayerPortalEvent since non-players can now create portals 2444c8b23 SPIGOT-7823: Suspicious sand and gravel material are not marked as having gravity correctly aceddcd0b SPIGOT-7820: Enum changes - duplicate method name a0d2d6a84 SPIGOT-7813: Material#isInteractable() always returns false 8fd64b091 SPIGOT-7806: Handle both loot and inventory item drop behaviour in PlayerDeathEvent a4ee40b74 SPIGOT-7799, PR-1436: Expose explosion world interaction in EntityExplodeEvent and BlockExplodeEvent 082aa51c5 PR-1424: Trial changing a small number of inner enums to classes/interfaces to better support custom values 66e78a96b SPIGOT-7815: Consider EntityDamageEvent status for Wolf armor damage Spigot Changes: 5bbef5ad SPIGOT-7834: Modify max value for generic.max_absorption
137 lines
8.4 KiB
Diff
137 lines
8.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
Date: Thu, 6 Jan 2022 15:59:06 -0800
|
|
Subject: [PATCH] Expose vanilla BiomeProvider from WorldInfo
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 6ad7c34513034c87059f8a0790aea3231dd0d2a9..188b1844ca6ee5a97f7a588121255417a184a4df 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -612,7 +612,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
List<CustomSpawner> list = ImmutableList.of(new PhantomSpawner(), new PatrolSpawner(), new CatSpawner(), new VillageSiege(), new WanderingTraderSpawner(iworlddataserver));
|
|
LevelStem worlddimension = (LevelStem) dimensions.get(dimensionKey);
|
|
|
|
- org.bukkit.generator.WorldInfo worldInfo = new org.bukkit.craftbukkit.generator.CraftWorldInfo(iworlddataserver, worldSession, org.bukkit.World.Environment.getEnvironment(dimension), worlddimension.type().value());
|
|
+ org.bukkit.generator.WorldInfo worldInfo = new org.bukkit.craftbukkit.generator.CraftWorldInfo(iworlddataserver, worldSession, org.bukkit.World.Environment.getEnvironment(dimension), worlddimension.type().value(), worlddimension.generator(), this.registryAccess()); // Paper - Expose vanilla BiomeProvider from WorldInfo
|
|
if (biomeProvider == null && gen != null) {
|
|
biomeProvider = gen.getDefaultBiomeProvider(worldInfo);
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 9707b24da58fdc56732d6372038055e8676e9e0d..05dbcff299d42dc05e3a8db0265fb607197731e7 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -1306,7 +1306,7 @@ public final class CraftServer implements Server {
|
|
List<CustomSpawner> list = ImmutableList.of(new PhantomSpawner(), new PatrolSpawner(), new CatSpawner(), new VillageSiege(), new WanderingTraderSpawner(worlddata));
|
|
LevelStem worlddimension = iregistry.get(actualDimension);
|
|
|
|
- WorldInfo worldInfo = new CraftWorldInfo(worlddata, worldSession, creator.environment(), worlddimension.type().value());
|
|
+ WorldInfo worldInfo = new CraftWorldInfo(worlddata, worldSession, creator.environment(), worlddimension.type().value(), worlddimension.generator(), this.getHandle().getServer().registryAccess()); // Paper - Expose vanilla BiomeProvider from WorldInfo
|
|
if (biomeProvider == null && generator != null) {
|
|
biomeProvider = generator.getDefaultBiomeProvider(worldInfo);
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index 0c2734c1d06b6c5dff383f9c6139c0389f220a76..da556cdbd7eecfd0743924d9ab79142c41f08d0a 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -212,6 +212,29 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
public int getPlayerCount() {
|
|
return world.players().size();
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public BiomeProvider vanillaBiomeProvider() {
|
|
+ net.minecraft.server.level.ServerChunkCache serverCache = this.getHandle().chunkSource;
|
|
+
|
|
+ final net.minecraft.world.level.biome.BiomeSource biomeSource = serverCache.getGenerator().getBiomeSource();
|
|
+ final net.minecraft.world.level.biome.Climate.Sampler sampler = serverCache.randomState().sampler();
|
|
+
|
|
+ final List<Biome> possibleBiomes = biomeSource.possibleBiomes().stream()
|
|
+ .map(biome -> org.bukkit.craftbukkit.block.CraftBiome.minecraftHolderToBukkit(biome))
|
|
+ .toList();
|
|
+ return new BiomeProvider() {
|
|
+ @Override
|
|
+ public Biome getBiome(final org.bukkit.generator.WorldInfo worldInfo, final int x, final int y, final int z) {
|
|
+ return org.bukkit.craftbukkit.block.CraftBiome.minecraftHolderToBukkit(biomeSource.getNoiseBiome(x >> 2, y >> 2, z >> 2, sampler));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public List<Biome> getBiomes(final org.bukkit.generator.WorldInfo worldInfo) {
|
|
+ return possibleBiomes;
|
|
+ }
|
|
+ };
|
|
+ }
|
|
// Paper end
|
|
|
|
private static final Random rand = new Random();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CraftWorldInfo.java b/src/main/java/org/bukkit/craftbukkit/generator/CraftWorldInfo.java
|
|
index 5d655d6cd3e23e0287069f8bdf77601487e862fd..cf57c6e9ce63f7b1d95d91ead2453409a31a5c52 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/generator/CraftWorldInfo.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/generator/CraftWorldInfo.java
|
|
@@ -17,8 +17,14 @@ public class CraftWorldInfo implements WorldInfo {
|
|
private final long seed;
|
|
private final int minHeight;
|
|
private final int maxHeight;
|
|
+ // Paper start
|
|
+ private final net.minecraft.world.level.chunk.ChunkGenerator vanillaChunkGenerator;
|
|
+ private final net.minecraft.core.RegistryAccess.Frozen registryAccess;
|
|
|
|
- public CraftWorldInfo(ServerLevelData worldDataServer, LevelStorageSource.LevelStorageAccess session, World.Environment environment, DimensionType dimensionManager) {
|
|
+ public CraftWorldInfo(ServerLevelData worldDataServer, LevelStorageSource.LevelStorageAccess session, World.Environment environment, DimensionType dimensionManager, net.minecraft.world.level.chunk.ChunkGenerator chunkGenerator, net.minecraft.core.RegistryAccess.Frozen registryAccess) {
|
|
+ this.registryAccess = registryAccess;
|
|
+ this.vanillaChunkGenerator = chunkGenerator;
|
|
+ // Paper end
|
|
this.name = worldDataServer.getLevelName();
|
|
this.uuid = WorldUUID.getUUID(session.levelDirectory.path().toFile());
|
|
this.environment = environment;
|
|
@@ -27,15 +33,6 @@ public class CraftWorldInfo implements WorldInfo {
|
|
this.maxHeight = dimensionManager.minY() + dimensionManager.height();
|
|
}
|
|
|
|
- public CraftWorldInfo(String name, UUID uuid, World.Environment environment, long seed, int minHeight, int maxHeight) {
|
|
- this.name = name;
|
|
- this.uuid = uuid;
|
|
- this.environment = environment;
|
|
- this.seed = seed;
|
|
- this.minHeight = minHeight;
|
|
- this.maxHeight = maxHeight;
|
|
- }
|
|
-
|
|
@Override
|
|
public String getName() {
|
|
return this.name;
|
|
@@ -65,4 +62,34 @@ public class CraftWorldInfo implements WorldInfo {
|
|
public int getMaxHeight() {
|
|
return this.maxHeight;
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public org.bukkit.generator.BiomeProvider vanillaBiomeProvider() {
|
|
+ final net.minecraft.world.level.levelgen.RandomState randomState;
|
|
+ if (vanillaChunkGenerator instanceof net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator noiseBasedChunkGenerator) {
|
|
+ randomState = net.minecraft.world.level.levelgen.RandomState.create(noiseBasedChunkGenerator.generatorSettings().value(),
|
|
+ registryAccess.lookupOrThrow(net.minecraft.core.registries.Registries.NOISE), getSeed());
|
|
+ } else {
|
|
+ randomState = net.minecraft.world.level.levelgen.RandomState.create(net.minecraft.world.level.levelgen.NoiseGeneratorSettings.dummy(),
|
|
+ registryAccess.lookupOrThrow(net.minecraft.core.registries.Registries.NOISE), getSeed());
|
|
+ }
|
|
+
|
|
+ final java.util.List<org.bukkit.block.Biome> possibleBiomes = CraftWorldInfo.this.vanillaChunkGenerator.getBiomeSource().possibleBiomes().stream()
|
|
+ .map(biome -> org.bukkit.craftbukkit.block.CraftBiome.minecraftHolderToBukkit(biome))
|
|
+ .toList();
|
|
+ return new org.bukkit.generator.BiomeProvider() {
|
|
+ @Override
|
|
+ public org.bukkit.block.Biome getBiome(final WorldInfo worldInfo, final int x, final int y, final int z) {
|
|
+ return org.bukkit.craftbukkit.block.CraftBiome.minecraftHolderToBukkit(
|
|
+ CraftWorldInfo.this.vanillaChunkGenerator.getBiomeSource().getNoiseBiome(x >> 2, y >> 2, z >> 2, randomState.sampler()));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public java.util.List<org.bukkit.block.Biome> getBiomes(final org.bukkit.generator.WorldInfo worldInfo) {
|
|
+ return possibleBiomes;
|
|
+ }
|
|
+ };
|
|
+ }
|
|
+ // Paper end
|
|
}
|