110 lines
4.4 KiB
Java
110 lines
4.4 KiB
Java
package net.minecraft.util.datafix.fixes;
|
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
import com.mojang.datafixers.DSL;
|
|
import com.mojang.datafixers.DataFix;
|
|
import com.mojang.datafixers.DataFixUtils;
|
|
import com.mojang.datafixers.FieldFinder;
|
|
import com.mojang.datafixers.OpticFinder;
|
|
import com.mojang.datafixers.TypeRewriteRule;
|
|
import com.mojang.datafixers.schemas.Schema;
|
|
import com.mojang.datafixers.types.Type;
|
|
import com.mojang.datafixers.types.templates.CompoundList.CompoundListType;
|
|
import com.mojang.datafixers.util.Either;
|
|
import com.mojang.datafixers.util.Pair;
|
|
import com.mojang.datafixers.util.Unit;
|
|
import com.mojang.serialization.Dynamic;
|
|
import java.util.List;
|
|
import net.minecraft.util.datafix.schemas.NamespacedSchema;
|
|
|
|
public class MissingDimensionFix extends DataFix {
|
|
public MissingDimensionFix(Schema outputSchema, boolean changesType) {
|
|
super(outputSchema, changesType);
|
|
}
|
|
|
|
protected static <A> Type<Pair<A, Dynamic<?>>> fields(String name, Type<A> element) {
|
|
return DSL.and(DSL.field(name, element), DSL.remainderType());
|
|
}
|
|
|
|
protected static <A> Type<Pair<Either<A, Unit>, Dynamic<?>>> optionalFields(String name, Type<A> element) {
|
|
return DSL.and(DSL.optional(DSL.field(name, element)), DSL.remainderType());
|
|
}
|
|
|
|
protected static <A1, A2> Type<Pair<Either<A1, Unit>, Pair<Either<A2, Unit>, Dynamic<?>>>> optionalFields(
|
|
String name1, Type<A1> element1, String name2, Type<A2> element2
|
|
) {
|
|
return DSL.and(DSL.optional(DSL.field(name1, element1)), DSL.optional(DSL.field(name2, element2)), DSL.remainderType());
|
|
}
|
|
|
|
@Override
|
|
protected TypeRewriteRule makeRule() {
|
|
Schema schema = this.getInputSchema();
|
|
Type<?> type = 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, ?> compoundListType = DSL.compoundList(NamespacedSchema.namespacedString(), fields("generator", type));
|
|
Type<?> type2 = DSL.and(compoundListType, DSL.remainderType());
|
|
Type<?> type3 = schema.getType(References.WORLD_GEN_SETTINGS);
|
|
FieldFinder<?> fieldFinder = new FieldFinder<>("dimensions", type2);
|
|
if (!type3.findFieldType("dimensions").equals(type2)) {
|
|
throw new IllegalStateException();
|
|
} else {
|
|
OpticFinder<? extends List<? extends Pair<String, ?>>> opticFinder = compoundListType.finder();
|
|
return this.fixTypeEverywhereTyped(
|
|
"MissingDimensionFix", type3, typed -> typed.updateTyped(fieldFinder, typed2 -> typed2.updateTyped(opticFinder, typed2x -> {
|
|
if (!(typed2x.getValue() instanceof List)) {
|
|
throw new IllegalStateException("List exptected");
|
|
} else if (((List)typed2x.getValue()).isEmpty()) {
|
|
Dynamic<?> dynamic = typed.get(DSL.remainderFinder());
|
|
Dynamic<?> dynamic2 = this.recreateSettings(dynamic);
|
|
return DataFixUtils.orElse(compoundListType.readTyped(dynamic2).result().map(Pair::getFirst), typed2x);
|
|
} else {
|
|
return typed2x;
|
|
}
|
|
}))
|
|
);
|
|
}
|
|
}
|
|
|
|
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> dynamic) {
|
|
long l = dynamic.get("seed").asLong(0L);
|
|
return new Dynamic<>(dynamic.getOps(), WorldGenSettingsFix.vanillaLevels(dynamic, l, WorldGenSettingsFix.defaultOverworld(dynamic, l), false));
|
|
}
|
|
}
|