NewVillageFix.java

net.minecraft.util.datafix.fixes.NewVillageFix

信息

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

    TODO

字段/常量

内部类/嵌套类型

构造器

public NewVillageFix(Schema outputSchema, boolean changesType) @ L20

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

参数:

  • outputSchema: Schema
  • changesType: boolean

说明:

TODO

方法

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

protected TypeRewriteRule makeRule() @ L24

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

参数:

说明:

TODO

private <SF> TypeRewriteRule cap(CompoundListType<String,SF> startsType) @ L31

  • 方法名:cap
  • 源码定位:L31
  • 返回类型: TypeRewriteRule
  • 修饰符:private

参数:

  • startsType: CompoundListType<String,SF>

说明:

TODO

代码

public class NewVillageFix extends DataFix {
    public NewVillageFix(Schema outputSchema, boolean changesType) {
        super(outputSchema, changesType);
    }
 
    @Override
    protected TypeRewriteRule makeRule() {
        CompoundListType<String, ?> startsType = DSL.compoundList(DSL.string(), this.getInputSchema().getType(References.STRUCTURE_FEATURE));
        OpticFinder<? extends List<? extends Pair<String, ?>>> finder = startsType.finder();
        return this.cap(startsType);
    }
 
    private <SF> TypeRewriteRule cap(CompoundListType<String, SF> startsType) {
        Type<?> chunkType = this.getInputSchema().getType(References.CHUNK);
        Type<?> structureType = this.getInputSchema().getType(References.STRUCTURE_FEATURE);
        OpticFinder<?> levelFinder = chunkType.findField("Level");
        OpticFinder<?> structuresFinder = levelFinder.type().findField("Structures");
        OpticFinder<?> startsFinder = structuresFinder.type().findField("Starts");
        OpticFinder<List<Pair<String, SF>>> listFinder = startsType.finder();
        return TypeRewriteRule.seq(
            this.fixTypeEverywhereTyped(
                "NewVillageFix",
                chunkType,
                input -> input.updateTyped(
                    levelFinder,
                    level -> level.updateTyped(
                        structuresFinder,
                        structures -> structures.updateTyped(
                                startsFinder,
                                starts -> starts.update(
                                    listFinder,
                                    list -> list.stream()
                                        .filter(pair -> !Objects.equals(pair.getFirst(), "Village"))
                                        .map(pair -> pair.mapFirst(name -> name.equals("New_Village") ? "Village" : name))
                                        .collect(Collectors.toList())
                                )
                            )
                            .update(DSL.remainderFinder(), tag -> tag.update("References", references -> {
                                Optional<? extends Dynamic<?>> village = references.get("New_Village").result();
                                return DataFixUtils.orElse(village.map(v -> references.remove("New_Village").set("Village", (Dynamic<?>)v)), references)
                                    .remove("Village");
                            }))
                    )
                )
            ),
            this.fixTypeEverywhereTyped(
                "NewVillageStartFix",
                structureType,
                input -> input.update(
                    DSL.remainderFinder(),
                    tag -> tag.update(
                        "id",
                        id -> Objects.equals(NamespacedSchema.ensureNamespaced(id.asString("")), "minecraft:new_village")
                            ? id.createString("minecraft:village")
                            : id
                    )
                )
            )
        );
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • NamespacedSchema

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