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
- 方法名:fields
- 源码定位:L25
- 返回类型: Type<Pair<A,Dynamic<?>>>
- 修饰符:protected static
参数:
说明:
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));
}
}