LevelFlatGeneratorInfoFix.java

net.minecraft.util.datafix.fixes.LevelFlatGeneratorInfoFix

信息

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

    TODO

字段/常量

  • GENERATOR_OPTIONS

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

      TODO

  • DEFAULT

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

      TODO

  • SPLITTER

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

      TODO

  • LAYER_SPLITTER

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

      TODO

  • OLD_AMOUNT_SPLITTER

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

      TODO

  • AMOUNT_SPLITTER

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

      TODO

  • BLOCK_SPLITTER

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

      TODO

内部类/嵌套类型

构造器

public LevelFlatGeneratorInfoFix(Schema outputSchema, boolean changesType) @ L27

  • 构造器名:LevelFlatGeneratorInfoFix
  • 源码定位:L27
  • 修饰符:public

参数:

  • outputSchema: Schema
  • changesType: boolean

说明:

TODO

方法

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

public TypeRewriteRule makeRule() @ L31

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

参数:

说明:

TODO

private Dynamic<?> fix(Dynamic<?> input) @ L38

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

参数:

  • input: Dynamic<?>

说明:

TODO

String fixString(String generatorOptions) @ L46

  • 方法名:fixString
  • 源码定位:L46
  • 返回类型:String
  • 修饰符:package-private

参数:

  • generatorOptions: String

说明:

TODO

代码

public class LevelFlatGeneratorInfoFix extends DataFix {
    private static final String GENERATOR_OPTIONS = "generatorOptions";
    @VisibleForTesting
    static final String DEFAULT = "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village";
    private static final Splitter SPLITTER = Splitter.on(';').limit(5);
    private static final Splitter LAYER_SPLITTER = Splitter.on(',');
    private static final Splitter OLD_AMOUNT_SPLITTER = Splitter.on('x').limit(2);
    private static final Splitter AMOUNT_SPLITTER = Splitter.on('*').limit(2);
    private static final Splitter BLOCK_SPLITTER = Splitter.on(':').limit(3);
 
    public LevelFlatGeneratorInfoFix(Schema outputSchema, boolean changesType) {
        super(outputSchema, changesType);
    }
 
    @Override
    public TypeRewriteRule makeRule() {
        return this.fixTypeEverywhereTyped(
            "LevelFlatGeneratorInfoFix", this.getInputSchema().getType(References.LEVEL), input -> input.update(DSL.remainderFinder(), this::fix)
        );
    }
 
    private Dynamic<?> fix(Dynamic<?> input) {
        return input.get("generatorName").asString("").equalsIgnoreCase("flat")
            ? input.update(
                "generatorOptions", options -> DataFixUtils.orElse(options.asString().map(this::fixString).map(options::createString).result(), options)
            )
            : input;
    }
 
    @VisibleForTesting
    String fixString(String generatorOptions) {
        if (generatorOptions.isEmpty()) {
            return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village";
        } else {
            Iterator<String> parts = SPLITTER.split(generatorOptions).iterator();
            String firstPart = parts.next();
            int version;
            String layerInfo;
            if (parts.hasNext()) {
                version = NumberUtils.toInt(firstPart, 0);
                layerInfo = parts.next();
            } else {
                version = 0;
                layerInfo = firstPart;
            }
 
            if (version >= 0 && version <= 3) {
                StringBuilder result = new StringBuilder();
                Splitter heightSplitter = version < 3 ? OLD_AMOUNT_SPLITTER : AMOUNT_SPLITTER;
                result.append(StreamSupport.stream(LAYER_SPLITTER.split(layerInfo).spliterator(), false).map(layerString -> {
                    List<String> list = heightSplitter.splitToList(layerString);
                    int height;
                    String layerType;
                    if (list.size() == 2) {
                        height = NumberUtils.toInt(list.get(0));
                        layerType = list.get(1);
                    } else {
                        height = 1;
                        layerType = list.get(0);
                    }
 
                    List<String> layerParts = BLOCK_SPLITTER.splitToList(layerType);
                    int nameIndex = layerParts.get(0).equals("minecraft") ? 1 : 0;
                    String blockString = layerParts.get(nameIndex);
                    int blockId = version == 3 ? EntityBlockStateFix.getBlockId("minecraft:" + blockString) : NumberUtils.toInt(blockString, 0);
                    int dataIndex = nameIndex + 1;
                    int data = layerParts.size() > dataIndex ? NumberUtils.toInt(layerParts.get(dataIndex), 0) : 0;
                    return (height == 1 ? "" : height + "*") + BlockStateData.getTag(blockId << 4 | data).get("Name").asString("");
                }).collect(Collectors.joining(",")));
 
                while (parts.hasNext()) {
                    result.append(';').append(parts.next());
                }
 
                return result.toString();
            } else {
                return "minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;1;village";
            }
        }
    }
}

引用的其他类