diff --git a/patches/api/0374-Add-getComputedBiome-API.patch b/patches/api/0374-Add-getComputedBiome-API.patch new file mode 100644 index 0000000000..95a17b20e1 --- /dev/null +++ b/patches/api/0374-Add-getComputedBiome-API.patch @@ -0,0 +1,79 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Mon, 14 Mar 2022 22:45:32 -0700 +Subject: [PATCH] Add getComputedBiome API + + +diff --git a/src/main/java/org/bukkit/RegionAccessor.java b/src/main/java/org/bukkit/RegionAccessor.java +index e55f6e2baf35dbd91c433ab9e62713eaac85435b..1d7560a3b2de23e16486608f3785a5dccc296158 100644 +--- a/src/main/java/org/bukkit/RegionAccessor.java ++++ b/src/main/java/org/bukkit/RegionAccessor.java +@@ -26,6 +26,7 @@ public interface RegionAccessor { + * + * @param location the location of the biome + * @return Biome at the given location ++ * @see #getComputedBiome(int, int, int) + */ + @NotNull + Biome getBiome(@NotNull Location location); +@@ -37,10 +38,33 @@ public interface RegionAccessor { + * @param y Y-coordinate of the block + * @param z Z-coordinate of the block + * @return Biome at the given coordinates ++ * @see #getComputedBiome(int, int, int) + */ + @NotNull + Biome getBiome(int x, int y, int z); + ++ // Paper start ++ /** ++ * Gets the computed {@link Biome} at the given coordinates. ++ * ++ *

The computed Biome is the Biome as seen by clients for rendering ++ * purposes and in the "F3" debug menu. This is computed by looking at the noise biome ++ * at this and surrounding quarts and applying complex math operations.

++ * ++ *

Most other Biome-related methods named getBiome, setBiome, and similar ++ * operate on the "noise biome", which is stored per-quart, or in other words, ++ * 1 Biome per 4x4x4 block region. This is how Biomes are currently generated and ++ * stored on disk.

++ * ++ * @param x X-coordinate of the block ++ * @param y Y-coordinate of the block ++ * @param z Z-coordinate of the block ++ * @return Biome at the given coordinates ++ */ ++ @NotNull ++ Biome getComputedBiome(int x, int y, int z); ++ // Paper end ++ + /** + * Sets the {@link Biome} at the given {@link Location}. + * +diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java +index 3e980c630452c8ea72227bc4cd92c605253cd41b..f95b7a60dd6f3ed25f84296f249eb0776855d255 100644 +--- a/src/main/java/org/bukkit/block/Block.java ++++ b/src/main/java/org/bukkit/block/Block.java +@@ -370,10 +370,22 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran + * Returns the biome that this block resides in + * + * @return Biome type containing this block ++ * @see #getComputedBiome() + */ + @NotNull + Biome getBiome(); + ++ // Paper start ++ /** ++ * Gets the computed biome at the location of this Block. ++ * ++ * @return computed biome at the location of this Block. ++ * @see org.bukkit.RegionAccessor#getComputedBiome(int, int, int) ++ */ ++ @NotNull ++ Biome getComputedBiome(); ++ // Paper end ++ + /** + * Sets the biome that this block resides in + * diff --git a/patches/server/0879-Implement-getComputedBiome-API.patch b/patches/server/0879-Implement-getComputedBiome-API.patch new file mode 100644 index 0000000000..1ca1553fc2 --- /dev/null +++ b/patches/server/0879-Implement-getComputedBiome-API.patch @@ -0,0 +1,61 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Mon, 14 Mar 2022 22:46:05 -0700 +Subject: [PATCH] Implement getComputedBiome API + + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +index 99cb7625d50d5da4ce0999e10fb84403958a7ffe..e231636403a70f28e7e4bf51542608872234ce94 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +@@ -204,6 +204,13 @@ public abstract class CraftRegionAccessor implements RegionAccessor { + return CraftBlock.biomeBaseToBiome(this.getHandle().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), this.getHandle().getNoiseBiome(x >> 2, y >> 2, z >> 2)); + } + ++ // Paper start ++ @Override ++ public Biome getComputedBiome(int x, int y, int z) { ++ return CraftBlock.biomeBaseToBiome(this.getHandle().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), this.getHandle().getBiome(new BlockPos(x, y, z))); ++ } ++ // Paper end ++ + @Override + public void setBiome(Location location, Biome biome) { + this.setBiome(location.getBlockX(), location.getBlockY(), location.getBlockZ(), biome); +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +index 68eaae018646c541c8553ded80c5cafdfc5ae63f..a52e76c8870b1dd578c4332930c6f2fd3b31d471 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +@@ -341,6 +341,13 @@ public class CraftBlock implements Block { + return this.getWorld().getBiome(this.getX(), this.getY(), this.getZ()); + } + ++ // Paper start ++ @Override ++ public Biome getComputedBiome() { ++ return this.getWorld().getComputedBiome(this.getX(), this.getY(), this.getZ()); ++ } ++ // Paper end ++ + @Override + public void setBiome(Biome bio) { + this.getWorld().setBiome(this.getX(), this.getY(), this.getZ(), bio); +diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java b/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java +index 392701b0022e05d0fd03ee5836fd18f00502f028..b01904021bd4f485aaf03d1d7634b56f134d3099 100644 +--- a/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java ++++ b/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java +@@ -166,6 +166,14 @@ public class CraftLimitedRegion extends CraftRegionAccessor implements LimitedRe + return super.getBiome(x, y, z); + } + ++ // Paper start ++ @Override ++ public Biome getComputedBiome(int x, int y, int z) { ++ Preconditions.checkArgument(this.isInRegion(x, y, z), "Coordinates %s, %s, %s are not in the region", x, y, z); ++ return super.getComputedBiome(x, y, z); ++ } ++ // Paper end ++ + @Override + public void setBiome(int x, int y, int z, Holder biomeBase) { + Preconditions.checkArgument(this.isInRegion(x, y, z), "Coordinates %s, %s, %s are not in the region", x, y, z);