71 lines
3 KiB
Java
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})));
|
|
}
|
|
}
|