mojira.dev
MC-310037

In the `campsite_cherry_grove_3` abandoned camp structure, one cherry tree can never be placed successfully

Cherry placement requires a space check: the second-layer 5×5 area above must consist solely of blocks tagged #minecraft:replaceable_by_trees. However, a Cobweb exists in that area, and Cobweb is not part of this tag or its sub-tags

Call chain:

cherry.json //(data\minecraft\worldgen\template_pool\abandoned_camp\trees\cherry.json)
    → cherry_checked.json
      → feature: "minecraft:cherry"
        → cherry.json //(data\minecraft\worldgen\feature\cherry.json)
          → "type": "minecraft:tree" //(TreeFeature.place())
            → TreeFeature.getMaxFreeTreeHeight() //Scans each layer with radius from getSizeAtHeight(), upper_size=2 yields a 5×5 area per layer
              → minimum_size: minecraft:two_layers_feature_size //(TwoLayersFeatureSize)
                   config from cherry.json: limit=1 (default), lower_size=0 (default), upper_size=2
              → trunk_placer: minecraft:cherry_trunk_placer //(CherryTrunkPlacer.isFree())
                → TreeFeature.validTreePos()
                  → state.isAir() || state.is(BlockTags.REPLACEABLE_BY_TREES) //This is where it checks whether the block is air or tagged #minecraft:replaceable_by_trees

getMaxFreeTreeHeight():

private int getMaxFreeTreeHeight(WorldGenLevel level, int maxTreeHeight, BlockPos treePos) {
    BlockPos.MutableBlockPos blockPos = new BlockPos.MutableBlockPos();
    for (int y = 0; y <= maxTreeHeight + 1; ++y) {
        int r = this.minimumSize.getSizeAtHeight(maxTreeHeight, y);
        for (int x = -r; x <= r; ++x) {
            for (int z = -r; z <= r; ++z) {
                 blockPos.setWithOffset(treePos, x, y, z);
                 if (this.trunkPlacer.isFree(level, blockPos) && (this.ignoreVines || !TreeFeature.isVine(level, blockPos))) continue;
                return y - 2;
            }
         }
     }
    return maxTreeHeight;
}

getSizeAtHeight():

public int getSizeAtHeight(int treeHeight, int yo) {
    return yo < this.limit ? this.lowerSize : this.upperSize;
}

validTreePos():

public static boolean validTreePos(LevelSimulatedReader level, BlockPos pos) {
    return level.isStateAtPosition(pos, state -> state.isAir() || state.is(BlockTags.REPLACEABLE_BY_TREES));
}

replaceable_by_trees.json:

{
  "values": [
    "#minecraft:leaves",
    "#minecraft:small_flowers",
    "minecraft:pale_moss_carpet",
    "minecraft:short_grass",
    "minecraft:fern",
    "minecraft:dead_bush",
    "minecraft:vine",
    "minecraft:glow_lichen",
    "minecraft:sunflower",
    "minecraft:lilac",
    "minecraft:rose_bush",
    "minecraft:peony",
    "minecraft:tall_grass",
    "minecraft:large_fern",
    "minecraft:hanging_roots",
    "minecraft:pitcher_plant",
    "minecraft:water",
    "minecraft:seagrass",
    "minecraft:tall_seagrass",
    "minecraft:bush",
    "minecraft:firefly_bush",
    "minecraft:warped_roots",
    "minecraft:nether_sprouts",
    "minecraft:crimson_roots",
    "minecraft:leaf_litter",
    "minecraft:short_dry_grass",
    "minecraft:tall_dry_grass"
  ]
}

Attachments

Comments 3

Thank you for helping us improve Minecraft! We saved your files:

[media]

This issue has been reviewed by our team.

Please add new, relevant information if it helps us understand or reproduce the issue. To show that you’re affected, use the vote feature rather than commenting.

If a fix is implemented, it will be listed in our official changelogs.

For major outages or urgent assistance, visit the Minecraft Help Center.

This issue is fixed

Y.k

(Unassigned)

1654606

Confirmed

Expansion A

26.3 Snapshot 3, 26.3 Snapshot 4, 26.3 Snapshot 5

Retrieved