renamed compute_density_function with 'sample_density' and tweaked its use

This commit is contained in:
gnembon committed 2023-01-28 19:51:13 +01:00
1 parent ea88c09c42
commit 659f0106e3
4 files changed
+35 -52

No files matched your search

+14 -33
View File
@@ -509,47 +509,28 @@ Returns the map colour of a block at position. One of:
`'brown_terracotta'`, `'green_terracotta'`, `'red_terracotta'`, `'black_terracotta'`,
`'crimson_nylium'`, `'crimson_stem'`, `'crimson_hyphae'`, `'warped_nylium'`, `'warped_stem'`, `'warped_hyphae'`, `'warped_wart'`
### `compute_density_function(pos, ...types?)` 1.19+ only
### `sample_density()`, `sample_density(pos, ... types?)` 1.19+
**Note: Replaces the old `sample_noise` function**
**Note: Replaces the old defunct `sample_noise` function**
Computes the density function(s) on the given position. Check the [Available Types](#available-types) for list of available density functions.
Samples the density function(s) / worldgen noise values at a given position.
If no types are passed in, it returns a list of all the available density functions. Built-in and custom ones.
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):
`'barrier_noise'`, `'fluid_level_floodedness_noise'`, `'fluid_level_spread_noise'`, `'lava_noise'`,
`'temperature'`, `'vegetation'`, `'continents'`, `'erosion'`, `'depth'`, `'ridges'`,
`'initial_density_without_jaggedness'`, `'final_density'`, `'vein_toggle'`, `'vein_ridged'` and `'vein_gap'`
<pre>
// requesting single value
sample_density(pos, 'continents') => 0.211626790923
// passing type as multiple arguments
compute_density_function(pos, 'continents', 'depth') => {continents: -0.205013844481, depth: 1.04772473438}
// passing types as a list with unpacking operator
compute_density_function(pos, ...['ridges', 'overworld/caves/pillars']) => {ridges: -0.186052125186, overworld/caves/pillars: 0.211626790923}
// Custom Defined types
compute_density_function(pos, 'mydatapack:my_density_func') => {mydatapack:my_density_func: -0.186052125186}
sample_density(pos, 'continents', 'depth', 'overworld/caves/pillars', 'mydatapack:foo/my_function') => [-0.205013844481, 1.04772473438, 0.211626790923, 0.123]
</pre>
#### Available types:
##### Built-in
`'barrier_noise'`, `'continents'`, `'depth'`, `'end/base_3d_noise'`, `'end/sloped_cheese'`, `'erosion'`, `'final_density'`,
`'fluid_level_floodedness_noise'`, `'fluid_level_spread_noise'`, `'initial_density_without_jaggedness'`, `'lava_noise'`,
`'nether/base_3d_noise'`, `'overworld/base_3d_noise'`, `'overworld/base_continents'`, `'overworld/caves/entrances'`,
`'overworld/caves/noodle'`, `'overworld/caves/pillars'`, `'overworld/caves/spaghetti_2d'`, `'overworld/caves/spaghetti_2d_thickness_modulator'`,
`'overworld/caves/spaghetti_roughness_function'`, `'overworld/continents'`, `'overworld/depth'`, `'overworld/erosion'`,
`'overworld/factor'`, `'overworld/jaggedness'`, `'overworld/offset'`, `'overworld/ridges'`, `'overworld/ridges_folded'`,
`'overworld/sloped_cheese'`, `'overworld_amplified/depth'`, `'overworld_amplified/factor'`, `'overworld_amplified/jaggedness'`,
`'overworld_amplified/offset'`, `'overworld_amplified/sloped_cheese'`, `'overworld_large_biomes/base_continents'`,
`'overworld_large_biomes/continents'`, `'overworld_large_biomes/depth'`, `'overworld_large_biomes/erosion'`,
`'overworld_large_biomes/factor'`, `'overworld_large_biomes/jaggedness'`, `'overworld_large_biomes/offset'`,
`'overworld_large_biomes/sloped_cheese'`, `'ridges'`, `'shift_x'`, `'shift_z'`, `'temperature'`, `'vegetation'`,
`'vein_gap'`, `'vein_gapbarrier_noise'`, `'vein_ridged'`, `'vein_toggle'`, `'y'`, `'zero'`
##### Custom
Custom defined density functions from datapacks are also available and can be used. However, unlike built-in types, these
ones must use full namespace. i.e. `namespace:path`. Examples: `'mydatapack:density_function'`, `'mydatapack:nested/density_function'`
**Note: Custom density functions require a server relaunch after enabling the datapack.**
### `loaded(pos)`
Boolean function, true if the block is accessible for the game mechanics. Normally `scarpet` doesn't check if operates
+1 -1
View File
@@ -93,7 +93,7 @@ reload_chunk
remove_all_markers
reset_chunk
run
compute_density_function
sample_density
save
scan
schedule
@@ -57,7 +57,7 @@
hardness blast_resistance top loaded suffocates power ticks_randomly update block_tick random_tick in_slime_chunk
set without_updates
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 compute_density_function inhabited_time spawn_potential chunk_tickets
place_item set_biome biome loaded_status generation_status sample_density inhabited_time spawn_potential chunk_tickets
plop harvest destroy create_explosion
structure_eligibility structures structure_references set_structure
reset_chunk reload_chunk create_datapack
@@ -1632,6 +1632,24 @@ public class WorldAccess {
return new NumericValue(ticket.timeout());
});
expression.addContextFunction("sample_density", -1, (c, t, lv) ->
{
final CarpetContext cc = (CarpetContext) c;
if (lv.size() == 0) {
return ListValue.wrap(cc.registry(Registries.DENSITY_FUNCTION).keySet().stream().map(ValueConversions::of));
}
final ServerLevel level = cc.level();
final BlockArgument locator = BlockArgument.findIn(cc, lv, 0);
final BlockPos pos = locator.block.getPos();
final String[] densityFunctionQueries = lv.stream().skip(locator.offset).map(Value::getString).toArray(String[]::new);
if (densityFunctionQueries.length == 0) {
return ListValue.wrap(cc.registry(Registries.DENSITY_FUNCTION).keySet().stream().map(ValueConversions::of));
}
if (densityFunctionQueries.length == 1) {
return NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, densityFunctionQueries[0])).apply(pos));
}
return ListValue.wrap(Arrays.stream(densityFunctionQueries).map(s -> NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, s)).apply(pos))));
});
}
public static Function<Pair<ServerLevel, String>, Function<BlockPos, Double>> stupidWorldgenNoiseCacheGetter = Util.memoize(pair -> {
@@ -1665,10 +1683,7 @@ public class WorldAccess {
yield densityFunctionRegistry.get(densityFunctionKey);
}
throw new InternalExpressionException(
"Density function '" + densityFunctionQuery + "' doesn't exist. " +
"Please check the spelling or use with full 'namespace:value' if its custom defined."
);
throw new InternalExpressionException("Density function '" + densityFunctionQuery + "' is not defined in the registies.");
}
};
@@ -1684,17 +1699,4 @@ public class WorldAccess {
}
return origin -> 0.0;
});
@ScarpetFunction(maxParams = -1)
public Value compute_density_function(Context c, @Locator.Block BlockPos pos, String... densityFunctionQueries) {
final CarpetContext cc = (CarpetContext) c;
if (densityFunctionQueries.length == 0) {
return ListValue.wrap(cc.registry(Registries.DENSITY_FUNCTION).keySet().stream().map(ValueConversions::of));
}
final ServerLevel level = cc.level();
if (densityFunctionQueries.length == 1) {
return NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, densityFunctionQueries[0])).apply(pos));
}
return ListValue.wrap(Arrays.stream(densityFunctionQueries).map(s -> NumericValue.of(stupidWorldgenNoiseCacheGetter.apply(Pair.of(level, s)).apply(pos))));
}
}