renamed sample_density with 'sample_noise'. sample noise values directly from the local router if possible.
This commit is contained in:
1 parent
ec2b56183a
commit
2133675ac7
4 files changed
+54
-15
No files matched your search
@@ -509,19 +509,18 @@ Returns the map colour of a block at position. One of:
|
|||||||
`'brown_terracotta'`, `'green_terracotta'`, `'red_terracotta'`, `'black_terracotta'`,
|
`'brown_terracotta'`, `'green_terracotta'`, `'red_terracotta'`, `'black_terracotta'`,
|
||||||
`'crimson_nylium'`, `'crimson_stem'`, `'crimson_hyphae'`, `'warped_nylium'`, `'warped_stem'`, `'warped_hyphae'`, `'warped_wart'`
|
`'crimson_nylium'`, `'crimson_stem'`, `'crimson_hyphae'`, `'warped_nylium'`, `'warped_stem'`, `'warped_hyphae'`, `'warped_wart'`
|
||||||
|
|
||||||
### `sample_density()`, `sample_density(pos, ... types?)` 1.19+
|
### `sample_noise()`, `sample_noise(pos, ... types?)` 1.18+
|
||||||
|
|
||||||
**Note: Replaces the old defunct `sample_noise` function**
|
Samples the world generation noise values / data driven density function(s) at a given position.
|
||||||
|
|
||||||
Samples the density function(s) / worldgen noise values at a given position.
|
|
||||||
|
|
||||||
If no types are passed in, or no arguments are given, it returns a list of all the available registry defined density functions.
|
If no types are passed in, or no arguments are given, it returns a list of all the available registry defined density functions.
|
||||||
|
|
||||||
Function accepts any registry defined density functions, both built in, as well as namespaced defined in datapacks.
|
|
||||||
On top of that, scarpet provides the following list of functions for convenience (not returned with no-argument call):
|
|
||||||
|
|
||||||
With a single function name passed in, it returns a scalar. With multiple function names passed in, it returns a list of results.
|
With a single function name passed in, it returns a scalar. With multiple function names passed in, it returns a list of results.
|
||||||
|
|
||||||
|
Function accepts any registry defined density functions, both built in, as well as namespaced defined in datapacks.
|
||||||
|
On top of that, scarpet provides the following list of noises sampled directly from the current level (and not returned with no-argument call):
|
||||||
|
|
||||||
|
|
||||||
`'barrier_noise'`, `'fluid_level_floodedness_noise'`, `'fluid_level_spread_noise'`, `'lava_noise'`,
|
`'barrier_noise'`, `'fluid_level_floodedness_noise'`, `'fluid_level_spread_noise'`, `'lava_noise'`,
|
||||||
`'temperature'`, `'vegetation'`, `'continents'`, `'erosion'`, `'depth'`, `'ridges'`,
|
`'temperature'`, `'vegetation'`, `'continents'`, `'erosion'`, `'depth'`, `'ridges'`,
|
||||||
`'initial_density_without_jaggedness'`, `'final_density'`, `'vein_toggle'`, `'vein_ridged'` and `'vein_gap'`
|
`'initial_density_without_jaggedness'`, `'final_density'`, `'vein_toggle'`, `'vein_ridged'` and `'vein_gap'`
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ reload_chunk
|
|||||||
remove_all_markers
|
remove_all_markers
|
||||||
reset_chunk
|
reset_chunk
|
||||||
run
|
run
|
||||||
sample_density
|
sample_noise
|
||||||
save
|
save
|
||||||
scan
|
scan
|
||||||
schedule
|
schedule
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
hardness blast_resistance top loaded suffocates power ticks_randomly update block_tick random_tick in_slime_chunk
|
hardness blast_resistance top loaded suffocates power ticks_randomly update block_tick random_tick in_slime_chunk
|
||||||
set without_updates
|
set without_updates
|
||||||
blocks_movement block_sound material map_colour block_state block_list block_tags block_data poi set_poi
|
blocks_movement block_sound material map_colour block_state block_list block_tags block_data poi set_poi
|
||||||
place_item set_biome biome loaded_status generation_status sample_density inhabited_time spawn_potential chunk_tickets
|
place_item set_biome biome loaded_status generation_status sample_noise inhabited_time spawn_potential chunk_tickets
|
||||||
plop harvest destroy create_explosion
|
plop harvest destroy create_explosion
|
||||||
structure_eligibility structures structure_references set_structure
|
structure_eligibility structures structure_references set_structure
|
||||||
reset_chunk reload_chunk create_datapack
|
reset_chunk reload_chunk create_datapack
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ import net.minecraft.tags.TagKey;
|
|||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.level.chunk.PalettedContainer;
|
import net.minecraft.world.level.chunk.PalettedContainer;
|
||||||
import net.minecraft.world.level.levelgen.DensityFunction;
|
import net.minecraft.world.level.levelgen.DensityFunction;
|
||||||
|
import net.minecraft.world.level.levelgen.DensityFunctions;
|
||||||
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
||||||
import net.minecraft.world.level.levelgen.NoiseRouter;
|
import net.minecraft.world.level.levelgen.NoiseRouter;
|
||||||
import net.minecraft.world.level.levelgen.RandomState;
|
import net.minecraft.world.level.levelgen.RandomState;
|
||||||
@@ -1632,7 +1633,7 @@ public class WorldAccess {
|
|||||||
return new NumericValue(ticket.timeout());
|
return new NumericValue(ticket.timeout());
|
||||||
});
|
});
|
||||||
|
|
||||||
expression.addContextFunction("sample_density", -1, (c, t, lv) ->
|
expression.addContextFunction("sample_noise", -1, (c, t, lv) ->
|
||||||
{
|
{
|
||||||
final CarpetContext cc = (CarpetContext) c;
|
final CarpetContext cc = (CarpetContext) c;
|
||||||
if (lv.size() == 0) {
|
if (lv.size() == 0) {
|
||||||
@@ -1645,14 +1646,53 @@ public class WorldAccess {
|
|||||||
if (densityFunctionQueries.length == 0) {
|
if (densityFunctionQueries.length == 0) {
|
||||||
return ListValue.wrap(cc.registry(Registries.DENSITY_FUNCTION).keySet().stream().map(ValueConversions::of));
|
return ListValue.wrap(cc.registry(Registries.DENSITY_FUNCTION).keySet().stream().map(ValueConversions::of));
|
||||||
}
|
}
|
||||||
|
NoiseRouter router = level.getChunkSource().randomState().router();
|
||||||
if (densityFunctionQueries.length == 1) {
|
if (densityFunctionQueries.length == 1) {
|
||||||
return NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, densityFunctionQueries[0])).apply(pos));
|
return NumericValue.of(sampleNoise(router, level, densityFunctionQueries[0], pos));
|
||||||
}
|
}
|
||||||
return ListValue.wrap(Arrays.stream(densityFunctionQueries).map(s -> NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, s)).apply(pos))));
|
return ListValue.wrap(Arrays.stream(densityFunctionQueries).map(s -> NumericValue.of(sampleNoise(router, level, s, pos))));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Function<Pair<ServerLevel, String>, Function<BlockPos, Double>> stupidWorldgenNoiseCacheGetter = Util.memoize(pair -> {
|
public static double sampleNoise(NoiseRouter router, ServerLevel level, String what, BlockPos pos) {
|
||||||
|
DensityFunction densityFunction = switch (what) {
|
||||||
|
case "barrier_noise" -> router.barrierNoise();
|
||||||
|
case "fluid_level_floodedness_noise" -> router.fluidLevelFloodednessNoise();
|
||||||
|
case "fluid_level_spread_noise" -> router.fluidLevelSpreadNoise();
|
||||||
|
case "lava_noise" -> router.lavaNoise();
|
||||||
|
case "temperature" -> router.temperature();
|
||||||
|
case "vegetation" -> router.vegetation();
|
||||||
|
case "continents" -> router.continents();
|
||||||
|
case "erosion" -> router.erosion();
|
||||||
|
case "depth" -> router.depth();
|
||||||
|
case "ridges" -> router.ridges();
|
||||||
|
case "initial_density_without_jaggedness" -> router.initialDensityWithoutJaggedness();
|
||||||
|
case "final_density" -> router.finalDensity();
|
||||||
|
case "vein_toggle" -> router.veinToggle();
|
||||||
|
case "vein_ridged" -> router.veinRidged();
|
||||||
|
case "vein_gap" -> router.veinGap();
|
||||||
|
default -> stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, what));
|
||||||
|
/*ResourceLocation densityFunctionKey = InputValidator.identifierOf(what);
|
||||||
|
Registry<DensityFunction> densityFunctionRegistry = level.registryAccess().registryOrThrow(Registries.DENSITY_FUNCTION);
|
||||||
|
if (densityFunctionRegistry.containsKey(densityFunctionKey) && level.getChunkSource().getGenerator() instanceof NoiseBasedChunkGenerator noiseBasedChunkGenerator) {
|
||||||
|
DensityFunction densityFunction1 = densityFunctionRegistry.get(densityFunctionKey);
|
||||||
|
RandomState randomState = RandomState.create(
|
||||||
|
noiseBasedChunkGenerator.generatorSettings().value(),
|
||||||
|
level.registryAccess().lookupOrThrow(Registries.NOISE), level.getSeed()
|
||||||
|
);
|
||||||
|
DensityFunction.Visitor visitor = ((RandomStateVisitorAccessor) (Object) randomState).getVisitor();
|
||||||
|
|
||||||
|
DensityFunction temp = densityFunction.mapAll(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InternalExpressionException("Density function '" + what + "' is not defined in the registies.");*/
|
||||||
|
|
||||||
|
};
|
||||||
|
return densityFunction.compute(new DensityFunction.SinglePointContext(pos.getX(), pos.getY(), pos.getZ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// to be used with future seedable noise
|
||||||
|
public static Function<Pair<ServerLevel, String>, DensityFunction> stupidWorldgenNoiseCacheGetter = Util.memoize(pair -> {
|
||||||
ServerLevel level = pair.getKey();
|
ServerLevel level = pair.getKey();
|
||||||
String densityFunctionQuery = pair.getValue();
|
String densityFunctionQuery = pair.getValue();
|
||||||
ChunkGenerator generator = level.getChunkSource().getGenerator();
|
ChunkGenerator generator = level.getChunkSource().getGenerator();
|
||||||
@@ -1695,8 +1735,8 @@ public class WorldAccess {
|
|||||||
|
|
||||||
DensityFunction temp = densityFunction.mapAll(visitor);
|
DensityFunction temp = densityFunction.mapAll(visitor);
|
||||||
|
|
||||||
return pos -> temp.compute(new DensityFunction.SinglePointContext(pos.getX(), pos.getY(), pos.getZ()));
|
return temp;
|
||||||
}
|
}
|
||||||
return origin -> 0.0;
|
return DensityFunctions.zero();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user