package net.minecraft.util.datafix.fixes; import com.mojang.datafixers.schemas.Schema; import com.mojang.serialization.Dynamic; import java.util.Map; import java.util.Optional; import java.util.function.Predicate; import org.jetbrains.annotations.Nullable; public class InvalidLockComponentFix extends DataComponentRemainderFix { private static final Optional INVALID_LOCK_CUSTOM_NAME = Optional.of("\"\""); public InvalidLockComponentFix(Schema outputSchema) { super(outputSchema, "InvalidLockComponentPredicateFix", "minecraft:lock"); } @Nullable @Override protected Dynamic fixComponent(Dynamic component) { return fixLock(component); } @Nullable public static Dynamic fixLock(Dynamic tag) { return isBrokenLock(tag) ? null : tag; } private static boolean isBrokenLock(Dynamic tag) { return isMapWithOneField( tag, "components", dynamic -> isMapWithOneField(dynamic, "minecraft:custom_name", dynamicx -> dynamicx.asString().result().equals(INVALID_LOCK_CUSTOM_NAME)) ); } private static boolean isMapWithOneField(Dynamic tag, String key, Predicate> predicate) { Optional, Dynamic>> optional = tag.getMapValues().result(); return !optional.isEmpty() && ((Map)optional.get()).size() == 1 ? tag.get(key).result().filter(predicate).isPresent() : false; } }