61 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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 <T> Dynamic<T> fix(Dynamic<T> 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 <T> Dynamic<T> fixText(Dynamic<T> textDynamic) {
 | |
| 		Optional<Stream<Dynamic<T>>> optional = textDynamic.get("filtered_messages").asStreamOpt().result();
 | |
| 		if (optional.isEmpty()) {
 | |
| 			return textDynamic;
 | |
| 		} else {
 | |
| 			Dynamic<T> dynamic = LegacyComponentDataFixUtils.createEmptyComponent(textDynamic.getOps());
 | |
| 			List<Dynamic<T>> list = ((Stream)textDynamic.get("messages").asStreamOpt().result().orElse(Stream.of())).toList();
 | |
| 			List<Dynamic<T>> list2 = Streams.<Dynamic, Dynamic<T>>mapWithIndex((Stream<Dynamic>)optional.get(), (dynamic2, l) -> {
 | |
| 				Dynamic<T> 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);
 | |
| 		}));
 | |
| 	}
 | |
| }
 |