MissingDimensionFix.java

net.minecraft.util.datafix.fixes.MissingDimensionFix

信息

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

    TODO

字段/常量

内部类/嵌套类型

构造器

public MissingDimensionFix(Schema schema, boolean changesType) @ L21

  • 构造器名:MissingDimensionFix
  • 源码定位:L21
  • 修饰符:public

参数:

  • schema: Schema
  • changesType: boolean

说明:

TODO

方法

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

protected static <A> Type<Pair<A,Dynamic<?>>> fields(String name, Type<A> type) @ L25

参数:

说明:

TODO

protected static <A> Type<Pair<Either<A,Unit>,Dynamic<?>>> optionalFields(String name, Type<A> type) @ L29

参数:

说明:

TODO

protected static <A1,A2> Type<Pair<Either<A1,Unit>,Pair<Either<A2,Unit>,Dynamic<?>>>> optionalFields(String name1, Type<A1> type1, String name2, Type<A2> type2) @ L33

  • 方法名:optionalFields
  • 源码定位:L33
  • 返回类型:<A1,A2> Type<Pair<Either<A1,Unit>,Pair<Either<A2,Unit>,Dynamic<?>>>>
  • 修饰符:protected static

参数:

  • name1: String
  • type1: Type
  • name2: String
  • type2: Type

说明:

TODO

protected TypeRewriteRule makeRule() @ L39

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

参数:

说明:

TODO

protected static Type<?extends Pair<?extends Either<?extends Pair<?extends Either<?,Unit>,?extends Pair<?extends Either<?extends List<?extends Pair<?extends Either<?,Unit>,Dynamic<?>>>,Unit>,Dynamic<?>>>,Unit>,Dynamic<?>>> flatType(Schema schema) @ L103

  • 方法名:flatType
  • 源码定位:L103
  • 返回类型:Type,?extends Pair,Dynamic>>,Unit>,Dynamic>>,Unit>,Dynamic>>
  • 修饰符:protected static

参数:

  • schema: Schema

说明:

TODO

private <T> Dynamic<T> recreateSettings(Dynamic<T> tag) @ L112

  • 方法名:recreateSettings
  • 源码定位:L112
  • 返回类型: Dynamic
  • 修饰符:private

参数:

  • tag: Dynamic

说明:

TODO

代码

public class MissingDimensionFix extends DataFix {
    public MissingDimensionFix(Schema schema, boolean changesType) {
        super(schema, changesType);
    }
 
    protected static <A> Type<Pair<A, Dynamic<?>>> fields(String name, Type<A> type) {
        return DSL.and(DSL.field(name, type), DSL.remainderType());
    }
 
    protected static <A> Type<Pair<Either<A, Unit>, Dynamic<?>>> optionalFields(String name, Type<A> type) {
        return DSL.and(DSL.optional(DSL.field(name, type)), DSL.remainderType());
    }
 
    protected static <A1, A2> Type<Pair<Either<A1, Unit>, Pair<Either<A2, Unit>, Dynamic<?>>>> optionalFields(
        String name1, Type<A1> type1, String name2, Type<A2> type2
    ) {
        return DSL.and(DSL.optional(DSL.field(name1, type1)), DSL.optional(DSL.field(name2, type2)), DSL.remainderType());
    }
 
    @Override
    protected TypeRewriteRule makeRule() {
        Schema schema = this.getInputSchema();
        Type<?> generatorType = DSL.taggedChoiceType(
            "type",
            DSL.string(),
            ImmutableMap.of(
                "minecraft:debug",
                DSL.remainderType(),
                "minecraft:flat",
                flatType(schema),
                "minecraft:noise",
                optionalFields(
                    "biome_source",
                    DSL.taggedChoiceType(
                        "type",
                        DSL.string(),
                        ImmutableMap.of(
                            "minecraft:fixed",
                            fields("biome", schema.getType(References.BIOME)),
                            "minecraft:multi_noise",
                            DSL.list(fields("biome", schema.getType(References.BIOME))),
                            "minecraft:checkerboard",
                            fields("biomes", DSL.list(schema.getType(References.BIOME))),
                            "minecraft:vanilla_layered",
                            DSL.remainderType(),
                            "minecraft:the_end",
                            DSL.remainderType()
                        )
                    ),
                    "settings",
                    DSL.or(
                        DSL.string(),
                        optionalFields("default_block", schema.getType(References.BLOCK_NAME), "default_fluid", schema.getType(References.BLOCK_NAME))
                    )
                )
            )
        );
        CompoundListType<String, ?> dimensionsType = DSL.compoundList(NamespacedSchema.namespacedString(), fields("generator", generatorType));
        Type<?> expectedDimensionsType = DSL.and(dimensionsType, DSL.remainderType());
        Type<?> settings = schema.getType(References.WORLD_GEN_SETTINGS);
        FieldFinder<?> dimensionsFinder = new FieldFinder<>("dimensions", expectedDimensionsType);
        if (!settings.findFieldType("dimensions").equals(expectedDimensionsType)) {
            throw new IllegalStateException();
        } else {
            OpticFinder<? extends List<? extends Pair<String, ?>>> dimensionListFinder = dimensionsType.finder();
            return this.fixTypeEverywhereTyped(
                "MissingDimensionFix",
                settings,
                input -> input.updateTyped(dimensionsFinder, dimensions -> dimensions.updateTyped(dimensionListFinder, generators -> {
                    if (!(generators.getValue() instanceof List)) {
                        throw new IllegalStateException("List exptected");
                    } else if (((List)generators.getValue()).isEmpty()) {
                        Dynamic<?> tag = input.get(DSL.remainderFinder());
                        Dynamic<?> newDimensions = this.recreateSettings(tag);
                        return DataFixUtils.orElse(dimensionsType.readTyped(newDimensions).result().map(Pair::getFirst), generators);
                    } else {
                        return generators;
                    }
                }))
            );
        }
    }
 
    protected static Type<? extends Pair<? extends Either<? extends Pair<? extends Either<?, Unit>, ? extends Pair<? extends Either<? extends List<? extends Pair<? extends Either<?, Unit>, Dynamic<?>>>, Unit>, Dynamic<?>>>, Unit>, Dynamic<?>>> flatType(
        Schema schema
    ) {
        return optionalFields(
            "settings",
            optionalFields("biome", schema.getType(References.BIOME), "layers", DSL.list(optionalFields("block", schema.getType(References.BLOCK_NAME))))
        );
    }
 
    private <T> Dynamic<T> recreateSettings(Dynamic<T> tag) {
        long seed = tag.get("seed").asLong(0L);
        return new Dynamic<>(tag.getOps(), WorldGenSettingsFix.vanillaLevels(tag, seed, WorldGenSettingsFix.defaultOverworld(tag, seed), false));
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • WorldGenSettingsFix

    • 引用位置: 方法调用
    • 关联成员: WorldGenSettingsFix.defaultOverworld(), WorldGenSettingsFix.vanillaLevels()
  • NamespacedSchema

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

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