71 lines
2.9 KiB
Java
71 lines
2.9 KiB
Java
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<String> 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 <T> Dynamic<T> fix(Dynamic<T> 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 <T> Dynamic<T> fixFrontTextTag(Dynamic<T> tag) {
|
|
Dynamic<T> dynamic = LegacyComponentDataFixUtils.createEmptyComponent(tag.getOps());
|
|
List<Dynamic<T>> list = getLines(tag, "Text").map(optional -> (Dynamic)optional.orElse(dynamic)).toList();
|
|
Dynamic<T> 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<Optional<Dynamic<T>>> 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<T> dynamicx = (Dynamic<T>)list.get((int)l);
|
|
return (Dynamic<?>)optional.orElse(dynamicx);
|
|
})));
|
|
}
|
|
|
|
return dynamic2;
|
|
}
|
|
|
|
private static <T> Stream<Optional<Dynamic<T>>> getLines(Dynamic<T> 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 <T> Dynamic<T> createDefaultText(Dynamic<T> dynamic) {
|
|
return dynamic.emptyMap()
|
|
.set("messages", createEmptyLines(dynamic))
|
|
.set("color", dynamic.createString("black"))
|
|
.set("has_glowing_text", dynamic.createBoolean(false));
|
|
}
|
|
|
|
private static <T> Dynamic<T> createEmptyLines(Dynamic<T> dynamic) {
|
|
Dynamic<T> dynamic2 = LegacyComponentDataFixUtils.createEmptyComponent(dynamic.getOps());
|
|
return dynamic.createList(Stream.of(dynamic2, dynamic2, dynamic2, dynamic2));
|
|
}
|
|
}
|