package net.minecraft.util.datafix.fixes; import com.mojang.datafixers.DSL; import com.mojang.datafixers.DataFixUtils; import com.mojang.datafixers.Typed; import com.mojang.datafixers.DSL.TypeReference; import com.mojang.datafixers.schemas.Schema; import com.mojang.serialization.Dynamic; import com.mojang.serialization.DynamicOps; import java.util.function.Function; import java.util.function.IntFunction; public class EntityVariantFix extends NamedEntityFix { private final String fieldName; private final IntFunction idConversions; public EntityVariantFix(Schema outputSchema, String name, TypeReference type, String entityName, String fieldName, IntFunction idConversions) { super(outputSchema, false, name, type, entityName); this.fieldName = fieldName; this.idConversions = idConversions; } private static Dynamic updateAndRename(Dynamic dynamic, String fieldName, String newFieldName, Function, Dynamic> fixer) { return dynamic.map(object -> { DynamicOps dynamicOps = dynamic.getOps(); Function function2 = objectx -> ((Dynamic)fixer.apply(new Dynamic<>(dynamicOps, (T)objectx))).getValue(); return dynamicOps.get((T)object, fieldName).map(object2 -> dynamicOps.set((T)object, newFieldName, (T)function2.apply(object2))).result().orElse(object); }); } @Override protected Typed fix(Typed typed) { return typed.update( DSL.remainderFinder(), dynamic -> updateAndRename( dynamic, this.fieldName, "variant", dynamicx -> DataFixUtils.orElse( dynamicx.asNumber().map(number -> dynamicx.createString((String)this.idConversions.apply(number.intValue()))).result(), dynamicx ) ) ); } }