WorldGenSettingsHeightAndBiomeFix.java

net.minecraft.util.datafix.fixes.WorldGenSettingsHeightAndBiomeFix

信息

  • 全限定名:net.minecraft.util.datafix.fixes.WorldGenSettingsHeightAndBiomeFix
  • 类型:public class
  • 包:net.minecraft.util.datafix.fixes
  • 源码路径:src/main/java/net/minecraft/util/datafix/fixes/WorldGenSettingsHeightAndBiomeFix.java
  • 起始行号:L16
  • 继承:DataFix
  • 职责:

    TODO

字段/常量

  • NAME

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

  • WAS_PREVIOUSLY_INCREASED_KEY

    • 类型: String
    • 修饰符: public static final
    • 源码定位: L18
    • 说明:

      TODO

内部类/嵌套类型

构造器

public WorldGenSettingsHeightAndBiomeFix(Schema outputSchema) @ L20

  • 构造器名:WorldGenSettingsHeightAndBiomeFix
  • 源码定位:L20
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

下面的方法块按源码顺序生成。

protected TypeRewriteRule makeRule() @ L24

  • 方法名:makeRule
  • 源码定位:L24
  • 返回类型:TypeRewriteRule
  • 修饰符:protected

参数:

说明:

TODO

private static Dynamic<?> updateLayers(Dynamic<?> layers) @ L101

  • 方法名:updateLayers
  • 源码定位:L101
  • 返回类型:Dynamic<?>
  • 修饰符:private static

参数:

  • layers: Dynamic<?>

说明:

TODO

代码

public class WorldGenSettingsHeightAndBiomeFix extends DataFix {
    private static final String NAME = "WorldGenSettingsHeightAndBiomeFix";
    public static final String WAS_PREVIOUSLY_INCREASED_KEY = "has_increased_height_already";
 
    public WorldGenSettingsHeightAndBiomeFix(Schema outputSchema) {
        super(outputSchema, true);
    }
 
    @Override
    protected TypeRewriteRule makeRule() {
        Type<?> worldGenSettingsType = this.getInputSchema().getType(References.WORLD_GEN_SETTINGS);
        OpticFinder<?> dimensionsFinder = worldGenSettingsType.findField("dimensions");
        Type<?> worldGenSettingsTypeNew = this.getOutputSchema().getType(References.WORLD_GEN_SETTINGS);
        Type<?> dimensionsType = worldGenSettingsTypeNew.findFieldType("dimensions");
        return this.fixTypeEverywhereTyped(
            "WorldGenSettingsHeightAndBiomeFix",
            worldGenSettingsType,
            worldGenSettingsTypeNew,
            input -> {
                OptionalDynamic<?> wasIncreasedOpt = input.get(DSL.remainderFinder()).get("has_increased_height_already");
                boolean wasExpSnap = wasIncreasedOpt.result().isEmpty();
                boolean wasPreviouslyIncreased = wasIncreasedOpt.asBoolean(true);
                return input.update(DSL.remainderFinder(), tag -> tag.remove("has_increased_height_already"))
                    .updateTyped(
                        dimensionsFinder,
                        dimensionsType,
                        dimensions -> Util.writeAndReadTypedOrThrow(
                            dimensions,
                            dimensionsType,
                            dimensionsTag -> dimensionsTag.update(
                                "minecraft:overworld",
                                overworldTag -> overworldTag.update(
                                    "generator",
                                    generator -> {
                                        String generatorType = generator.get("type").asString("");
                                        if ("minecraft:noise".equals(generatorType)) {
                                            MutableBoolean isLargeBiomes = new MutableBoolean();
                                            generator = generator.update(
                                                "biome_source",
                                                biomeSource -> {
                                                    String type = biomeSource.get("type").asString("");
                                                    if ("minecraft:vanilla_layered".equals(type) || wasExpSnap && "minecraft:multi_noise".equals(type)) {
                                                        if (biomeSource.get("large_biomes").asBoolean(false)) {
                                                            isLargeBiomes.setTrue();
                                                        }
 
                                                        return biomeSource.createMap(
                                                            ImmutableMap.of(
                                                                biomeSource.createString("preset"),
                                                                biomeSource.createString("minecraft:overworld"),
                                                                biomeSource.createString("type"),
                                                                biomeSource.createString("minecraft:multi_noise")
                                                            )
                                                        );
                                                    } else {
                                                        return biomeSource;
                                                    }
                                                }
                                            );
                                            return isLargeBiomes.booleanValue()
                                                ? generator.update(
                                                    "settings",
                                                    settings -> "minecraft:overworld".equals(settings.asString(""))
                                                        ? settings.createString("minecraft:large_biomes")
                                                        : settings
                                                )
                                                : generator;
                                        } else if ("minecraft:flat".equals(generatorType)) {
                                            return wasPreviouslyIncreased
                                                ? generator
                                                : generator.update(
                                                    "settings", settings -> settings.update("layers", WorldGenSettingsHeightAndBiomeFix::updateLayers)
                                                );
                                        } else {
                                            return generator;
                                        }
                                    }
                                )
                            )
                        )
                    );
            }
        );
    }
 
    private static Dynamic<?> updateLayers(Dynamic<?> layers) {
        Dynamic<?> airLayer = layers.createMap(
            ImmutableMap.of(layers.createString("height"), layers.createInt(64), layers.createString("block"), layers.createString("minecraft:air"))
        );
        return layers.createList(Stream.concat(Stream.of(airLayer), layers.asStream()));
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.writeAndReadTypedOrThrow()
  • ResolvableProfile

    • 引用位置: 参数/返回值