import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import net.minecraft.SharedConstants; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.server.Bootstrap; import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.FeatureSorter; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.placement.CountPlacement; import net.minecraft.world.level.levelgen.placement.PlacedFeature; // Emits FeatureSorter vectors from the official 26.1.2 runtime. The graph is // synthetic so this helper verifies ordering and identity without booting a // world or depending on registry datapack loading. public final class VanillaFeatureSorterVectors { private static final Map NAMES = new IdentityHashMap<>(); public static void main(String[] args) throws Exception { SharedConstants.tryDetectVersion(); Bootstrap.bootStrap(); PlacedFeature f1 = feature("f1", 1); PlacedFeature f2 = feature("f2", 2); PlacedFeature f3 = feature("f3", 3); PlacedFeature f4 = feature("f4", 4); PlacedFeature f5 = feature("f5", 5); BiomeGenerationSettings a = settings( List.of(List.of(f1), List.of(f3, f4))); BiomeGenerationSettings b = settings( List.of(List.of(f2, f1), List.of(f5, f4))); dump("ab", List.of(a, b)); dump("ba", List.of(b, a)); } private static PlacedFeature feature(String name, int count) { ConfiguredFeature> configured = new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE); PlacedFeature placed = new PlacedFeature(Holder.direct(configured), List.of(CountPlacement.of(count))); NAMES.put(placed, name); return placed; } @SuppressWarnings("unchecked") private static BiomeGenerationSettings settings(List> stages) throws Exception { List> holders = new ArrayList<>(); for (List stage : stages) { Holder[] values = stage.stream().map(Holder::direct).toArray(Holder[]::new); holders.add(HolderSet.direct(values)); } Constructor constructor = BiomeGenerationSettings.class .getDeclaredConstructor(HolderSet.class, List.class); constructor.setAccessible(true); return constructor.newInstance(HolderSet.empty(), holders); } private static void dump(String label, List biomes) { Function>> stages = BiomeGenerationSettings::features; List steps = FeatureSorter.buildFeaturesPerStep(biomes, stages, true); for (int stage = 0; stage < steps.size(); stage++) { FeatureSorter.StepFeatureData step = steps.get(stage); List values = new ArrayList<>(); for (int index = 0; index < step.features().size(); index++) { PlacedFeature feature = step.features().get(index); values.add(NAMES.get(feature) + "@" + step.indexMapping().applyAsInt(feature)); } System.out.println(label + ".stage" + stage + "=" + String.join(",", values)); } } }