package net.minecraft.util.datafix.fixes; import com.google.common.collect.Streams; import com.mojang.datafixers.schemas.Schema; import com.mojang.serialization.Dynamic; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import net.minecraft.util.datafix.LegacyComponentDataFixUtils; public class BlockEntitySignDoubleSidedEditableTextFix extends NamedEntityWriteReadFix { public static final List FIELDS_TO_DROP = List.of( "Text1", "Text2", "Text3", "Text4", "FilteredText1", "FilteredText2", "FilteredText3", "FilteredText4", "Color", "GlowingText" ); public static final String FILTERED_CORRECT = "_filtered_correct"; private static final String DEFAULT_COLOR = "black"; public BlockEntitySignDoubleSidedEditableTextFix(Schema outputSchema, String name, String entityName) { super(outputSchema, true, name, References.BLOCK_ENTITY, entityName); } @Override protected Dynamic fix(Dynamic tag) { tag = tag.set("front_text", fixFrontTextTag(tag)) .set("back_text", createDefaultText(tag)) .set("is_waxed", tag.createBoolean(false)) .set("_filtered_correct", tag.createBoolean(true)); for (String string : FIELDS_TO_DROP) { tag = tag.remove(string); } return tag; } private static Dynamic fixFrontTextTag(Dynamic tag) { Dynamic dynamic = LegacyComponentDataFixUtils.createEmptyComponent(tag.getOps()); List> list = getLines(tag, "Text").map(optional -> (Dynamic)optional.orElse(dynamic)).toList(); Dynamic dynamic2 = tag.emptyMap() .set("messages", tag.createList(list.stream())) .set("color", (Dynamic)tag.get("Color").result().orElse(tag.createString("black"))) .set("has_glowing_text", (Dynamic)tag.get("GlowingText").result().orElse(tag.createBoolean(false))); List>> list2 = getLines(tag, "FilteredText").toList(); if (list2.stream().anyMatch(Optional::isPresent)) { dynamic2 = dynamic2.set("filtered_messages", tag.createList(Streams.mapWithIndex(list2.stream(), (optional, l) -> { Dynamic dynamicx = (Dynamic)list.get((int)l); return (Dynamic)optional.orElse(dynamicx); }))); } return dynamic2; } private static Stream>> getLines(Dynamic dynamic, String prefix) { return Stream.of( dynamic.get(prefix + "1").result(), dynamic.get(prefix + "2").result(), dynamic.get(prefix + "3").result(), dynamic.get(prefix + "4").result() ); } private static Dynamic createDefaultText(Dynamic dynamic) { return dynamic.emptyMap() .set("messages", createEmptyLines(dynamic)) .set("color", dynamic.createString("black")) .set("has_glowing_text", dynamic.createBoolean(false)); } private static Dynamic createEmptyLines(Dynamic dynamic) { Dynamic dynamic2 = LegacyComponentDataFixUtils.createEmptyComponent(dynamic.getOps()); return dynamic.createList(Stream.of(dynamic2, dynamic2, dynamic2, dynamic2)); } }