package net.minecraft.util.datafix.fixes; import com.mojang.datafixers.DSL; import com.mojang.datafixers.DataFix; import com.mojang.datafixers.Typed; import com.mojang.datafixers.DSL.TypeReference; import com.mojang.datafixers.schemas.Schema; import com.mojang.datafixers.types.Type; import com.mojang.serialization.Dynamic; import java.util.Arrays; import java.util.Optional; import java.util.UUID; import java.util.function.Function; public abstract class AbstractUUIDFix extends DataFix { protected TypeReference typeReference; public AbstractUUIDFix(Schema outputSchema, TypeReference typeReference) { super(outputSchema, false); this.typeReference = typeReference; } protected Typed updateNamedChoice(Typed typed, String choiceName, Function, Dynamic> updater) { Type type = this.getInputSchema().getChoiceType(this.typeReference, choiceName); Type type2 = this.getOutputSchema().getChoiceType(this.typeReference, choiceName); return typed.updateTyped(DSL.namedChoice(choiceName, type), type2, typedx -> typedx.update(DSL.remainderFinder(), updater)); } protected static Optional> replaceUUIDString(Dynamic dynamic, String oldKey, String newKey) { return createUUIDFromString(dynamic, oldKey).map(dynamic2 -> dynamic.remove(oldKey).set(newKey, dynamic2)); } protected static Optional> replaceUUIDMLTag(Dynamic dynamic, String oldKey, String newKey) { return dynamic.get(oldKey).result().flatMap(AbstractUUIDFix::createUUIDFromML).map(dynamic2 -> dynamic.remove(oldKey).set(newKey, dynamic2)); } protected static Optional> replaceUUIDLeastMost(Dynamic dynamic, String oldKey, String newKey) { String string = oldKey + "Most"; String string2 = oldKey + "Least"; return createUUIDFromLongs(dynamic, string, string2).map(dynamic2 -> dynamic.remove(string).remove(string2).set(newKey, dynamic2)); } protected static Optional> createUUIDFromString(Dynamic dynamic, String uuidKey) { return dynamic.get(uuidKey).result().flatMap(dynamic2 -> { String string = dynamic2.asString(null); if (string != null) { try { UUID uUID = UUID.fromString(string); return createUUIDTag(dynamic, uUID.getMostSignificantBits(), uUID.getLeastSignificantBits()); } catch (IllegalArgumentException var4) { } } return Optional.empty(); }); } protected static Optional> createUUIDFromML(Dynamic dynamic) { return createUUIDFromLongs(dynamic, "M", "L"); } protected static Optional> createUUIDFromLongs(Dynamic dynamic, String mostKey, String leastKey) { long l = dynamic.get(mostKey).asLong(0L); long m = dynamic.get(leastKey).asLong(0L); return l != 0L && m != 0L ? createUUIDTag(dynamic, l, m) : Optional.empty(); } protected static Optional> createUUIDTag(Dynamic dynamic, long most, long least) { return Optional.of(dynamic.createIntList(Arrays.stream(new int[]{(int)(most >> 32), (int)most, (int)(least >> 32), (int)least}))); } }