minecraft-src/net/minecraft/util/datafix/fixes/AbstractUUIDFix.java
2025-07-04 01:41:11 +03:00

71 lines
3 KiB
Java

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<?>, 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<Dynamic<?>> replaceUUIDString(Dynamic<?> dynamic, String oldKey, String newKey) {
return createUUIDFromString(dynamic, oldKey).map(dynamic2 -> dynamic.remove(oldKey).set(newKey, dynamic2));
}
protected static Optional<Dynamic<?>> 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<Dynamic<?>> 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<Dynamic<?>> 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<Dynamic<?>> createUUIDFromML(Dynamic<?> dynamic) {
return createUUIDFromLongs(dynamic, "M", "L");
}
protected static Optional<Dynamic<?>> 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<Dynamic<?>> 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})));
}
}