SavedDataFeaturePoolElementFix.java

net.minecraft.util.datafix.fixes.SavedDataFeaturePoolElementFix

信息

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

    TODO

字段/常量

  • INDEX_PATTERN

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

      TODO

  • PIECE_TYPE

    • 类型: Set<String>
    • 修饰符: private static final
    • 源码定位: L21
    • 说明:

      TODO

  • FEATURES

    • 类型: Set<String>
    • 修饰符: private static final
    • 源码定位: L24
    • 说明:

      TODO

内部类/嵌套类型

构造器

public SavedDataFeaturePoolElementFix(Schema outputSchema) @ L26

  • 构造器名:SavedDataFeaturePoolElementFix
  • 源码定位:L26
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

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

public TypeRewriteRule makeRule() @ L30

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

参数:

说明:

TODO

private static <T> Dynamic<T> fixTag(Dynamic<T> input) @ L40

  • 方法名:fixTag
  • 源码定位:L40
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic

说明:

TODO

private static <T> Dynamic<T> updateChildren(Dynamic<T> input) @ L44

  • 方法名:updateChildren
  • 源码定位:L44
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic

说明:

TODO

private static Stream<?extends Dynamic<?>> updateChildren(Stream<?extends Dynamic<?>> stream) @ L48

  • 方法名:updateChildren
  • 源码定位:L48
  • 返回类型:Stream>
  • 修饰符:private static

参数:

  • stream: Stream>

说明:

TODO

private static <T> OptionalDynamic<T> get(Dynamic<T> input, String... path) @ L64

  • 方法名:get
  • 源码定位:L64
  • 返回类型: OptionalDynamic
  • 修饰符:private static

参数:

  • input: Dynamic
  • path: String…

说明:

TODO

protected static Dynamic<?> fixFeature(Dynamic<?> value) @ L90

  • 方法名:fixFeature
  • 源码定位:L90
  • 返回类型:Dynamic<?>
  • 修饰符:protected static

参数:

  • value: Dynamic<?>

说明:

TODO

private static Optional<String> getReplacement(String type, String name, String stateProviderType, String stateProviderState, String stateProviderFirstWeighedState, String foliagePlacerType, String leavesProviderState) @ L104

  • 方法名:getReplacement
  • 源码定位:L104
  • 返回类型:Optional
  • 修饰符:private static

参数:

  • type: String
  • name: String
  • stateProviderType: String
  • stateProviderState: String
  • stateProviderFirstWeighedState: String
  • foliagePlacerType: String
  • leavesProviderState: String

说明:

TODO

代码

public class SavedDataFeaturePoolElementFix extends DataFix {
    private static final Pattern INDEX_PATTERN = Pattern.compile("\\[(\\d+)\\]");
    private static final Set<String> PIECE_TYPE = Sets.newHashSet(
        "minecraft:jigsaw", "minecraft:nvi", "minecraft:pcp", "minecraft:bastionremnant", "minecraft:runtime"
    );
    private static final Set<String> FEATURES = Sets.newHashSet("minecraft:tree", "minecraft:flower", "minecraft:block_pile", "minecraft:random_patch");
 
    public SavedDataFeaturePoolElementFix(Schema outputSchema) {
        super(outputSchema, false);
    }
 
    @Override
    public TypeRewriteRule makeRule() {
        return this.writeFixAndRead(
            "SavedDataFeaturePoolElementFix",
            this.getInputSchema().getType(References.STRUCTURE_FEATURE),
            this.getOutputSchema().getType(References.STRUCTURE_FEATURE),
            SavedDataFeaturePoolElementFix::fixTag
        );
    }
 
    private static <T> Dynamic<T> fixTag(Dynamic<T> input) {
        return input.update("Children", SavedDataFeaturePoolElementFix::updateChildren);
    }
 
    private static <T> Dynamic<T> updateChildren(Dynamic<T> input) {
        return input.asStreamOpt().map(SavedDataFeaturePoolElementFix::updateChildren).map(input::createList).result().orElse(input);
    }
 
    private static Stream<? extends Dynamic<?>> updateChildren(Stream<? extends Dynamic<?>> stream) {
        return stream.map(
            child -> {
                String id = child.get("id").asString("");
                if (!PIECE_TYPE.contains(id)) {
                    return child;
                } else {
                    OptionalDynamic<?> poolElement = child.get("pool_element");
                    return !poolElement.get("element_type").asString("").equals("minecraft:feature_pool_element")
                        ? child
                        : child.update("pool_element", pool -> pool.update("feature", SavedDataFeaturePoolElementFix::fixFeature));
                }
            }
        );
    }
 
    private static <T> OptionalDynamic<T> get(Dynamic<T> input, String... path) {
        if (path.length == 0) {
            throw new IllegalArgumentException("Missing path");
        } else {
            OptionalDynamic<T> output = input.get(path[0]);
 
            for (int i = 1; i < path.length; i++) {
                String element = path[i];
                Matcher matcher = INDEX_PATTERN.matcher(element);
                if (matcher.matches()) {
                    int id = Integer.parseInt(matcher.group(1));
                    List<? extends Dynamic<T>> dynamics = output.asList(Function.identity());
                    if (id >= 0 && id < dynamics.size()) {
                        output = new OptionalDynamic<>(input.getOps(), DataResult.success((Dynamic<T>)dynamics.get(id)));
                    } else {
                        output = new OptionalDynamic<>(input.getOps(), DataResult.error(() -> "Missing id:" + id));
                    }
                } else {
                    output = output.get(element);
                }
            }
 
            return output;
        }
    }
 
    @VisibleForTesting
    protected static Dynamic<?> fixFeature(Dynamic<?> value) {
        Optional<String> replacement = getReplacement(
            get(value, "type").asString(""),
            get(value, "name").asString(""),
            get(value, "config", "state_provider", "type").asString(""),
            get(value, "config", "state_provider", "state", "Name").asString(""),
            get(value, "config", "state_provider", "entries", "[0]", "data", "Name").asString(""),
            get(value, "config", "foliage_placer", "type").asString(""),
            get(value, "config", "leaves_provider", "state", "Name").asString("")
        );
        return replacement.isPresent() ? value.createString(replacement.get()) : value;
    }
 
    private static Optional<String> getReplacement(
        String type,
        String name,
        String stateProviderType,
        String stateProviderState,
        String stateProviderFirstWeighedState,
        String foliagePlacerType,
        String leavesProviderState
    ) {
        String feature;
        if (!type.isEmpty()) {
            feature = type;
        } else {
            if (name.isEmpty()) {
                return Optional.empty();
            }
 
            if ("minecraft:normal_tree".equals(name)) {
                feature = "minecraft:tree";
            } else {
                feature = name;
            }
        }
 
        if (FEATURES.contains(feature)) {
            if ("minecraft:random_patch".equals(feature)) {
                if ("minecraft:simple_state_provider".equals(stateProviderType)) {
                    if ("minecraft:sweet_berry_bush".equals(stateProviderState)) {
                        return Optional.of("minecraft:patch_berry_bush");
                    }
 
                    if ("minecraft:cactus".equals(stateProviderState)) {
                        return Optional.of("minecraft:patch_cactus");
                    }
                } else if ("minecraft:weighted_state_provider".equals(stateProviderType)
                    && ("minecraft:grass".equals(stateProviderFirstWeighedState) || "minecraft:fern".equals(stateProviderFirstWeighedState))) {
                    return Optional.of("minecraft:patch_taiga_grass");
                }
            } else if ("minecraft:block_pile".equals(feature)) {
                if (!"minecraft:simple_state_provider".equals(stateProviderType) && !"minecraft:rotated_block_provider".equals(stateProviderType)) {
                    if ("minecraft:weighted_state_provider".equals(stateProviderType)) {
                        if ("minecraft:packed_ice".equals(stateProviderFirstWeighedState) || "minecraft:blue_ice".equals(stateProviderFirstWeighedState)) {
                            return Optional.of("minecraft:pile_ice");
                        }
 
                        if ("minecraft:jack_o_lantern".equals(stateProviderFirstWeighedState) || "minecraft:pumpkin".equals(stateProviderFirstWeighedState)) {
                            return Optional.of("minecraft:pile_pumpkin");
                        }
                    }
                } else {
                    if ("minecraft:hay_block".equals(stateProviderState)) {
                        return Optional.of("minecraft:pile_hay");
                    }
 
                    if ("minecraft:melon".equals(stateProviderState)) {
                        return Optional.of("minecraft:pile_melon");
                    }
 
                    if ("minecraft:snow".equals(stateProviderState)) {
                        return Optional.of("minecraft:pile_snow");
                    }
                }
            } else {
                if ("minecraft:flower".equals(feature)) {
                    return Optional.of("minecraft:flower_plain");
                }
 
                if ("minecraft:tree".equals(feature)) {
                    if ("minecraft:acacia_foliage_placer".equals(foliagePlacerType)) {
                        return Optional.of("minecraft:acacia");
                    }
 
                    if ("minecraft:blob_foliage_placer".equals(foliagePlacerType) && "minecraft:oak_leaves".equals(leavesProviderState)) {
                        return Optional.of("minecraft:oak");
                    }
 
                    if ("minecraft:pine_foliage_placer".equals(foliagePlacerType)) {
                        return Optional.of("minecraft:pine");
                    }
 
                    if ("minecraft:spruce_foliage_placer".equals(foliagePlacerType)) {
                        return Optional.of("minecraft:spruce");
                    }
                }
            }
        }
 
        return Optional.empty();
    }
}

引用的其他类