mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-08-27 04:37:47 +00:00
chunk granularity
This commit is contained in:
+31
@@ -1,6 +1,7 @@
|
|||||||
package art.arcane.iris.core.nms.v26_2_R1;
|
package art.arcane.iris.core.nms.v26_2_R1;
|
||||||
|
|
||||||
import art.arcane.iris.platform.bukkit.BukkitWorldBinding;
|
import art.arcane.iris.platform.bukkit.BukkitWorldBinding;
|
||||||
|
import com.mojang.datafixers.util.Pair;
|
||||||
import com.mojang.serialization.MapCodec;
|
import com.mojang.serialization.MapCodec;
|
||||||
import art.arcane.iris.spi.IrisLogging;
|
import art.arcane.iris.spi.IrisLogging;
|
||||||
import art.arcane.iris.engine.data.cache.AtomicCache;
|
import art.arcane.iris.engine.data.cache.AtomicCache;
|
||||||
@@ -13,6 +14,7 @@ import art.arcane.iris.engine.object.IrisDimension;
|
|||||||
import art.arcane.iris.util.project.context.IrisContext;
|
import art.arcane.iris.util.project.context.IrisContext;
|
||||||
import art.arcane.volmlib.util.collection.KMap;
|
import art.arcane.volmlib.util.collection.KMap;
|
||||||
import art.arcane.volmlib.util.math.RNG;
|
import art.arcane.volmlib.util.math.RNG;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.QuartPos;
|
import net.minecraft.core.QuartPos;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
@@ -20,6 +22,7 @@ import net.minecraft.core.RegistryAccess;
|
|||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.resources.Identifier;
|
import net.minecraft.resources.Identifier;
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
import net.minecraft.world.level.biome.BiomeSource;
|
import net.minecraft.world.level.biome.BiomeSource;
|
||||||
import net.minecraft.world.level.biome.Climate;
|
import net.minecraft.world.level.biome.Climate;
|
||||||
@@ -40,10 +43,14 @@ import java.util.LinkedHashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class CustomBiomeSource extends BiomeSource {
|
public class CustomBiomeSource extends BiomeSource {
|
||||||
private static final int NOISE_BIOME_CACHE_MAX = 262144;
|
private static final int NOISE_BIOME_CACHE_MAX = 262144;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_Y = 0;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_RADIUS = 112;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_QUART_STEP = 4;
|
||||||
|
|
||||||
private final long seed;
|
private final long seed;
|
||||||
private final Engine engine;
|
private final Engine engine;
|
||||||
@@ -309,6 +316,30 @@ public class CustomBiomeSource extends BiomeSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pair<BlockPos, Holder<Biome>> findBiomeHorizontal(
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int z,
|
||||||
|
int searchRadius,
|
||||||
|
Predicate<Holder<Biome>> allowed,
|
||||||
|
RandomSource random,
|
||||||
|
Climate.Sampler sampler
|
||||||
|
) {
|
||||||
|
int quartStep = horizontalBiomeSearchQuartStep(y, searchRadius);
|
||||||
|
if (quartStep == 1) {
|
||||||
|
return super.findBiomeHorizontal(x, y, z, searchRadius, allowed, random, sampler);
|
||||||
|
}
|
||||||
|
return super.findBiomeHorizontal(
|
||||||
|
x, y, z, searchRadius, quartStep, allowed, random, false, sampler);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int horizontalBiomeSearchQuartStep(int blockY, int searchRadius) {
|
||||||
|
return blockY == STRONGHOLD_RING_SEARCH_Y && searchRadius == STRONGHOLD_RING_SEARCH_RADIUS
|
||||||
|
? STRONGHOLD_RING_SEARCH_QUART_STEP
|
||||||
|
: 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Holder<Biome>> getBiomesWithin(int x, int y, int z, int radius, Climate.Sampler sampler) {
|
public Set<Holder<Biome>> getBiomesWithin(int x, int y, int z, int radius, Climate.Sampler sampler) {
|
||||||
GenerationSessionLease lease = tryAcquireGenerationLease("bukkit_biomes_within");
|
GenerationSessionLease lease = tryAcquireGenerationLease("bukkit_biomes_within");
|
||||||
|
|||||||
+12
@@ -37,4 +37,16 @@ public class CustomBiomeSourceStructureContractTest {
|
|||||||
assertTrue(source.contains("catch (GenerationSessionException e)"));
|
assertTrue(source.contains("catch (GenerationSessionException e)"));
|
||||||
assertTrue(source.contains("e.isExpectedTeardown()"));
|
assertTrue(source.contains("e.isExpectedTeardown()"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void strongholdRingSearchSamplesOneQuartColumnPerChunk() throws IOException {
|
||||||
|
String source = Files.readString(Path.of(System.getProperty("iris.customBiomeSource")));
|
||||||
|
|
||||||
|
assertTrue(source.contains("private static final int STRONGHOLD_RING_SEARCH_Y = 0"));
|
||||||
|
assertTrue(source.contains("private static final int STRONGHOLD_RING_SEARCH_RADIUS = 112"));
|
||||||
|
assertTrue(source.contains("private static final int STRONGHOLD_RING_SEARCH_QUART_STEP = 4"));
|
||||||
|
assertTrue(source.contains("x, y, z, searchRadius, quartStep, allowed, random, false, sampler"));
|
||||||
|
assertTrue(source.contains(
|
||||||
|
"return super.findBiomeHorizontal(x, y, z, searchRadius, allowed, random, sampler)"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+31
@@ -25,7 +25,9 @@ import art.arcane.iris.engine.object.IrisBiome;
|
|||||||
import art.arcane.iris.engine.object.IrisBiomeCustom;
|
import art.arcane.iris.engine.object.IrisBiomeCustom;
|
||||||
import art.arcane.iris.util.project.context.IrisContext;
|
import art.arcane.iris.util.project.context.IrisContext;
|
||||||
import art.arcane.volmlib.util.math.RNG;
|
import art.arcane.volmlib.util.math.RNG;
|
||||||
|
import com.mojang.datafixers.util.Pair;
|
||||||
import com.mojang.serialization.MapCodec;
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.HolderLookup;
|
import net.minecraft.core.HolderLookup;
|
||||||
import net.minecraft.core.QuartPos;
|
import net.minecraft.core.QuartPos;
|
||||||
@@ -34,6 +36,7 @@ import net.minecraft.core.registries.Registries;
|
|||||||
import net.minecraft.resources.Identifier;
|
import net.minecraft.resources.Identifier;
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
import net.minecraft.world.level.biome.BiomeSource;
|
import net.minecraft.world.level.biome.BiomeSource;
|
||||||
import net.minecraft.world.level.biome.Climate;
|
import net.minecraft.world.level.biome.Climate;
|
||||||
@@ -49,10 +52,14 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.concurrent.atomic.AtomicReferenceArray;
|
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
final class IrisModdedBiomeSource extends BiomeSource {
|
final class IrisModdedBiomeSource extends BiomeSource {
|
||||||
private static final int UNRESOLVED_WARN_KEYS_MAX = 256;
|
private static final int UNRESOLVED_WARN_KEYS_MAX = 256;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_Y = 0;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_RADIUS = 112;
|
||||||
|
private static final int STRONGHOLD_RING_SEARCH_QUART_STEP = 4;
|
||||||
|
|
||||||
private final BiomeSource serializedSource;
|
private final BiomeSource serializedSource;
|
||||||
private final Set<String> warnedUnresolvedBiomeKeys = ConcurrentHashMap.newKeySet();
|
private final Set<String> warnedUnresolvedBiomeKeys = ConcurrentHashMap.newKeySet();
|
||||||
@@ -554,6 +561,12 @@ final class IrisModdedBiomeSource extends BiomeSource {
|
|||||||
return radius == 29 && blockY == minHeight + fluidHeight;
|
return radius == 29 && blockY == minHeight + fluidHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int horizontalBiomeSearchQuartStep(int blockY, int searchRadius) {
|
||||||
|
return blockY == STRONGHOLD_RING_SEARCH_Y && searchRadius == STRONGHOLD_RING_SEARCH_RADIUS
|
||||||
|
? STRONGHOLD_RING_SEARCH_QUART_STEP
|
||||||
|
: 1;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isReady(Engine engine) {
|
private static boolean isReady(Engine engine) {
|
||||||
return engine != null && !engine.isClosed() && engine.getComplex() != null;
|
return engine != null && !engine.isClosed() && engine.getComplex() != null;
|
||||||
}
|
}
|
||||||
@@ -861,6 +874,24 @@ final class IrisModdedBiomeSource extends BiomeSource {
|
|||||||
return resolved;
|
return resolved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pair<BlockPos, Holder<Biome>> findBiomeHorizontal(
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int z,
|
||||||
|
int searchRadius,
|
||||||
|
Predicate<Holder<Biome>> allowed,
|
||||||
|
RandomSource random,
|
||||||
|
Climate.Sampler sampler
|
||||||
|
) {
|
||||||
|
int quartStep = horizontalBiomeSearchQuartStep(y, searchRadius);
|
||||||
|
if (quartStep == 1) {
|
||||||
|
return super.findBiomeHorizontal(x, y, z, searchRadius, allowed, random, sampler);
|
||||||
|
}
|
||||||
|
return super.findBiomeHorizontal(
|
||||||
|
x, y, z, searchRadius, quartStep, allowed, random, false, sampler);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Holder<Biome>> getBiomesWithin(int x, int y, int z, int radius, Climate.Sampler sampler) {
|
public Set<Holder<Biome>> getBiomesWithin(int x, int y, int z, int radius, Climate.Sampler sampler) {
|
||||||
return super.getBiomesWithin(x, y, z, radius, sampler);
|
return super.getBiomesWithin(x, y, z, radius, sampler);
|
||||||
|
|||||||
+16
@@ -13,6 +13,9 @@ import net.minecraft.server.Bootstrap;
|
|||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
@@ -56,6 +59,19 @@ public class IrisModdedStructureParityTest {
|
|||||||
assertFalse(IrisModdedBiomeSource.isMonumentSurfaceBiomeQuery(50, 28, -256, 306));
|
assertFalse(IrisModdedBiomeSource.isMonumentSurfaceBiomeQuery(50, 28, -256, 306));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void strongholdRingSearchSamplesOneQuartColumnPerChunk() throws IOException {
|
||||||
|
assertEquals(4, IrisModdedBiomeSource.horizontalBiomeSearchQuartStep(0, 112));
|
||||||
|
assertEquals(1, IrisModdedBiomeSource.horizontalBiomeSearchQuartStep(1, 112));
|
||||||
|
assertEquals(1, IrisModdedBiomeSource.horizontalBiomeSearchQuartStep(0, 111));
|
||||||
|
String source = Files.readString(Path.of(
|
||||||
|
System.getProperty("iris.moddedCommonSources"),
|
||||||
|
"art/arcane/iris/modded/IrisModdedBiomeSource.java"));
|
||||||
|
assertTrue(source.contains("x, y, z, searchRadius, quartStep, allowed, random, false, sampler"));
|
||||||
|
assertTrue(source.contains(
|
||||||
|
"return super.findBiomeHorizontal(x, y, z, searchRadius, allowed, random, sampler)"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void spawnHeightMatchesPaperFixedSpawnClamp() {
|
public void spawnHeightMatchesPaperFixedSpawnClamp() {
|
||||||
assertEquals(96, ModdedDimensionMetadata.clampSpawnHeight(-64, 384));
|
assertEquals(96, ModdedDimensionMetadata.clampSpawnHeight(-64, 384));
|
||||||
|
|||||||
Reference in New Issue
Block a user