package net.minecraft.util.datafix.fixes; import com.google.common.collect.Streams; import com.mojang.datafixers.DSL; import com.mojang.datafixers.DataFix; import com.mojang.datafixers.OpticFinder; import com.mojang.datafixers.TypeRewriteRule; import com.mojang.datafixers.schemas.Schema; import com.mojang.datafixers.types.Type; import com.mojang.serialization.Dynamic; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import net.minecraft.Util; import net.minecraft.util.datafix.LegacyComponentDataFixUtils; public class DropInvalidSignDataFix extends DataFix { private final String entityName; public DropInvalidSignDataFix(Schema outputSchema, String entityName) { super(outputSchema, false); this.entityName = entityName; } private Dynamic fix(Dynamic data) { data = data.update("front_text", DropInvalidSignDataFix::fixText); data = data.update("back_text", DropInvalidSignDataFix::fixText); for (String string : BlockEntitySignDoubleSidedEditableTextFix.FIELDS_TO_DROP) { data = data.remove(string); } return data; } private static Dynamic fixText(Dynamic textDynamic) { Optional>> optional = textDynamic.get("filtered_messages").asStreamOpt().result(); if (optional.isEmpty()) { return textDynamic; } else { Dynamic dynamic = LegacyComponentDataFixUtils.createEmptyComponent(textDynamic.getOps()); List> list = ((Stream)textDynamic.get("messages").asStreamOpt().result().orElse(Stream.of())).toList(); List> list2 = Streams.>mapWithIndex((Stream)optional.get(), (dynamic2, l) -> { Dynamic dynamic3 = l < list.size() ? (Dynamic)list.get((int)l) : dynamic; return dynamic2.equals(dynamic) ? dynamic3 : dynamic2; }).toList(); return list2.equals(list) ? textDynamic.remove("filtered_messages") : textDynamic.set("filtered_messages", textDynamic.createList(list2.stream())); } } @Override public TypeRewriteRule makeRule() { Type type = this.getInputSchema().getType(References.BLOCK_ENTITY); Type type2 = this.getInputSchema().getChoiceType(References.BLOCK_ENTITY, this.entityName); OpticFinder opticFinder = DSL.namedChoice(this.entityName, type2); return this.fixTypeEverywhereTyped("DropInvalidSignDataFix for " + this.entityName, type, typed -> typed.updateTyped(opticFinder, type2, typedx -> { boolean bl = typedx.get(DSL.remainderFinder()).get("_filtered_correct").asBoolean(false); return bl ? typedx.update(DSL.remainderFinder(), dynamic -> dynamic.remove("_filtered_correct")) : Util.writeAndReadTypedOrThrow(typedx, type2, this::fix); })); } }