Bind the surface rule tree to the world seed
The tree was parsed once, globally, and shared by every world -- so every condition that needs the seed simply did not work. Compiling it per RandomState fixes four of them at once. noise_threshold sampled a per-column random draw and pretended it was "minecraft:surface"; the other six noises it names were unsupported and returned false. Each condition now holds its own seeded noise, sampled once per column into a small cache the way vanilla's LazyXZCondition does. Powder snow, packed ice and ice appear in the dump for the first time; calcite, swamp water windows and gravel patches have their conditions back too. vertical_gradient tapered through a per-column RNG shared with the other rules. Vanilla rolls a positional random at the exact block, from a factory named by the rule. More importantly the anchor decoder read only above_bottom and discarded which kind of anchor it was, so the deepslate rule's absolute 0..8 collapsed onto y=-64 and **no deepslate existed anywhere in the world**. Anchors now carry their kind and resolve against the real height bounds -- which also retires a hardcoded 384 in y_above. Two more stubs land with them: hole is surfaceDepth <= 0 rather than a constant false, and steep reads the neighbouring column heights. steep needs the whole chunk's heightmap, so the column pass is now two passes -- terrain and fluids for all 256 columns, then surface rules -- which is the order vanilla uses anyway (doFill, then buildSurface). Deepslate was also missing from the block-ID table, and an unknown name resolved to 0, which the caller read as "no block" and skipped. So even a correct rule would have placed nothing. Unknown names are now a parse error, deepslate and mud are in the table, and a rule that resolves to air genuinely places air -- the frozen-ocean surface asks for exactly that. Below y=0 is now entirely deepslate, y=1..7 a scatter, above y=8 none.
This commit is contained in:
parent
1083e47211
commit
c19e5f0e4f
9 changed files with 478 additions and 255 deletions
|
|
@ -33,7 +33,7 @@ func LoadTemplate(path string) (*Template, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
// NBT files are usually gzipped.
|
||||
var r io.Reader = bytes.NewReader(b)
|
||||
if len(b) >= 2 && b[0] == 0x1f && b[1] == 0x8b {
|
||||
|
|
@ -81,7 +81,7 @@ func LoadTemplate(path string) (*Template, error) {
|
|||
nameTag, _ := stateComp.Get("Name")
|
||||
name := string(nameTag.(nbt.String))
|
||||
props := make(map[string]string)
|
||||
|
||||
|
||||
if propTag, ok := stateComp.Get("Properties"); ok {
|
||||
if propComp, ok := propTag.(*nbt.Compound); ok {
|
||||
for _, k := range propComp.Keys() {
|
||||
|
|
@ -92,9 +92,11 @@ func LoadTemplate(path string) (*Template, error) {
|
|||
}
|
||||
}
|
||||
}
|
||||
id := surfaceBlockID(name, props)
|
||||
if id == 0 && name != "minecraft:air" {
|
||||
// Fallback to default block ID for the name
|
||||
id, ok := surfaceBlockID(name, props)
|
||||
if !ok {
|
||||
// Structure templates name far more blocks than the
|
||||
// surface rules do; fall back to the broader
|
||||
// default-state table.
|
||||
id = defaultBlockIDs[name]
|
||||
}
|
||||
tmpl.Palette = append(tmpl.Palette, id)
|
||||
|
|
@ -112,7 +114,7 @@ func LoadTemplate(path string) (*Template, error) {
|
|||
}
|
||||
stateTag, _ := blockComp.Get("state")
|
||||
stateIdx := int(stateTag.(nbt.Int))
|
||||
|
||||
|
||||
var pos [3]int
|
||||
if posTag, ok := blockComp.Get("pos"); ok {
|
||||
if posList, ok := posTag.(nbt.List); ok && len(posList.Elems) == 3 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue