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";
}
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
BlockStateData.getTag()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
EntityBlockStateFix.getBlockId()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置: