78 lines
2.9 KiB
Java
78 lines
2.9 KiB
Java
package net.minecraft.util.datafix.fixes;
|
|
|
|
import com.mojang.datafixers.DSL;
|
|
import com.mojang.datafixers.DataFix;
|
|
import com.mojang.datafixers.DataFixUtils;
|
|
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.Pair;
|
|
import com.mojang.serialization.Dynamic;
|
|
import java.util.List;
|
|
import java.util.Objects;
|
|
import java.util.Optional;
|
|
import java.util.stream.Collectors;
|
|
import net.minecraft.util.datafix.schemas.NamespacedSchema;
|
|
|
|
public class NewVillageFix extends DataFix {
|
|
public NewVillageFix(Schema outputSchema, boolean changesType) {
|
|
super(outputSchema, changesType);
|
|
}
|
|
|
|
@Override
|
|
protected TypeRewriteRule makeRule() {
|
|
CompoundListType<String, ?> compoundListType = DSL.compoundList(DSL.string(), this.getInputSchema().getType(References.STRUCTURE_FEATURE));
|
|
OpticFinder<? extends List<? extends Pair<String, ?>>> opticFinder = compoundListType.finder();
|
|
return this.cap(compoundListType);
|
|
}
|
|
|
|
private <SF> TypeRewriteRule cap(CompoundListType<String, SF> type) {
|
|
Type<?> type2 = this.getInputSchema().getType(References.CHUNK);
|
|
Type<?> type3 = this.getInputSchema().getType(References.STRUCTURE_FEATURE);
|
|
OpticFinder<?> opticFinder = type2.findField("Level");
|
|
OpticFinder<?> opticFinder2 = opticFinder.type().findField("Structures");
|
|
OpticFinder<?> opticFinder3 = opticFinder2.type().findField("Starts");
|
|
OpticFinder<List<Pair<String, SF>>> opticFinder4 = type.finder();
|
|
return TypeRewriteRule.seq(
|
|
this.fixTypeEverywhereTyped(
|
|
"NewVillageFix",
|
|
type2,
|
|
typed -> typed.updateTyped(
|
|
opticFinder,
|
|
typedx -> typedx.updateTyped(
|
|
opticFinder2,
|
|
typedxx -> typedxx.updateTyped(
|
|
opticFinder3,
|
|
typedxxx -> typedxxx.update(
|
|
opticFinder4,
|
|
list -> (List)list.stream()
|
|
.filter(pair -> !Objects.equals(pair.getFirst(), "Village"))
|
|
.map(pair -> pair.mapFirst(string -> string.equals("New_Village") ? "Village" : string))
|
|
.collect(Collectors.toList())
|
|
)
|
|
)
|
|
.update(DSL.remainderFinder(), dynamic -> dynamic.update("References", dynamicx -> {
|
|
Optional<? extends Dynamic<?>> optional = dynamicx.get("New_Village").result();
|
|
return DataFixUtils.orElse(optional.map(dynamic2 -> dynamicx.remove("New_Village").set("Village", dynamic2)), dynamicx).remove("Village");
|
|
}))
|
|
)
|
|
)
|
|
),
|
|
this.fixTypeEverywhereTyped(
|
|
"NewVillageStartFix",
|
|
type3,
|
|
typed -> typed.update(
|
|
DSL.remainderFinder(),
|
|
dynamic -> dynamic.update(
|
|
"id",
|
|
dynamicx -> Objects.equals(NamespacedSchema.ensureNamespaced(dynamicx.asString("")), "minecraft:new_village")
|
|
? dynamicx.createString("minecraft:village")
|
|
: dynamicx
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|