123 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util.datafix.fixes;
 | |
| 
 | |
| import com.mojang.datafixers.DSL;
 | |
| import com.mojang.datafixers.DataFix;
 | |
| import com.mojang.datafixers.OpticFinder;
 | |
| import com.mojang.datafixers.TypeRewriteRule;
 | |
| import com.mojang.datafixers.Typed;
 | |
| import com.mojang.datafixers.schemas.Schema;
 | |
| import com.mojang.datafixers.types.Type;
 | |
| import com.mojang.datafixers.util.Either;
 | |
| import com.mojang.datafixers.util.Pair;
 | |
| import com.mojang.datafixers.util.Unit;
 | |
| import com.mojang.serialization.Dynamic;
 | |
| import java.util.List;
 | |
| import java.util.function.Function;
 | |
| import java.util.function.Predicate;
 | |
| 
 | |
| public class EquipmentFormatFix extends DataFix {
 | |
| 	public EquipmentFormatFix(Schema outputSchema) {
 | |
| 		super(outputSchema, true);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected TypeRewriteRule makeRule() {
 | |
| 		Type<?> type = this.getInputSchema().getTypeRaw(References.ITEM_STACK);
 | |
| 		Type<?> type2 = this.getOutputSchema().getTypeRaw(References.ITEM_STACK);
 | |
| 		OpticFinder<?> opticFinder = type.findField("id");
 | |
| 		return this.fix(type, type2, opticFinder);
 | |
| 	}
 | |
| 
 | |
| 	private <ItemStackOld, ItemStackNew> TypeRewriteRule fix(Type<ItemStackOld> oldItemStackType, Type<ItemStackNew> newItemStackType, OpticFinder<?> optic) {
 | |
| 		Type<Pair<String, Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<ItemStackOld, Unit>, Either<ItemStackOld, Unit>>>>>> type = DSL.named(
 | |
| 			References.ENTITY_EQUIPMENT.typeName(),
 | |
| 			DSL.and(
 | |
| 				DSL.optional(DSL.field("ArmorItems", DSL.list(oldItemStackType))),
 | |
| 				DSL.optional(DSL.field("HandItems", DSL.list(oldItemStackType))),
 | |
| 				DSL.optional(DSL.field("body_armor_item", oldItemStackType)),
 | |
| 				DSL.optional(DSL.field("saddle", oldItemStackType))
 | |
| 			)
 | |
| 		);
 | |
| 		Type<Pair<String, Either<Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Pair<Either<ItemStackNew, Unit>, Dynamic<?>>>>>>>>>, Unit>>> type2 = DSL.named(
 | |
| 			References.ENTITY_EQUIPMENT.typeName(),
 | |
| 			DSL.optional(
 | |
| 				DSL.field(
 | |
| 					"equipment",
 | |
| 					DSL.and(
 | |
| 						DSL.optional(DSL.field("mainhand", newItemStackType)),
 | |
| 						DSL.optional(DSL.field("offhand", newItemStackType)),
 | |
| 						DSL.optional(DSL.field("feet", newItemStackType)),
 | |
| 						DSL.and(
 | |
| 							DSL.optional(DSL.field("legs", newItemStackType)),
 | |
| 							DSL.optional(DSL.field("chest", newItemStackType)),
 | |
| 							DSL.optional(DSL.field("head", newItemStackType)),
 | |
| 							DSL.and(DSL.optional(DSL.field("body", newItemStackType)), DSL.optional(DSL.field("saddle", newItemStackType)), DSL.remainderType())
 | |
| 						)
 | |
| 					)
 | |
| 				)
 | |
| 			)
 | |
| 		);
 | |
| 		if (!type.equals(this.getInputSchema().getType(References.ENTITY_EQUIPMENT))) {
 | |
| 			throw new IllegalStateException("Input entity_equipment type does not match expected");
 | |
| 		} else if (!type2.equals(this.getOutputSchema().getType(References.ENTITY_EQUIPMENT))) {
 | |
| 			throw new IllegalStateException("Output entity_equipment type does not match expected");
 | |
| 		} else {
 | |
| 			return this.fixTypeEverywhere(
 | |
| 				"EquipmentFormatFix",
 | |
| 				type,
 | |
| 				type2,
 | |
| 				dynamicOps -> {
 | |
| 					Predicate<ItemStackOld> predicate = object -> {
 | |
| 						Typed<ItemStackOld> typed = new Typed<>(oldItemStackType, dynamicOps, (ItemStackOld)object);
 | |
| 						return typed.getOptional(optic).isEmpty();
 | |
| 					};
 | |
| 					return pair -> {
 | |
| 						String string = (String)pair.getFirst();
 | |
| 						Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<ItemStackOld, Unit>, Either<ItemStackOld, Unit>>>> pair2 = (Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<List<ItemStackOld>, Unit>, Pair<Either<ItemStackOld, Unit>, Either<ItemStackOld, Unit>>>>)pair.getSecond();
 | |
| 						List<ItemStackOld> list = pair2.getFirst().map(Function.identity(), unit -> List.of());
 | |
| 						List<ItemStackOld> list2 = pair2.getSecond().getFirst().map(Function.identity(), unit -> List.of());
 | |
| 						Either<ItemStackOld, Unit> either = pair2.getSecond().getSecond().getFirst();
 | |
| 						Either<ItemStackOld, Unit> either2 = pair2.getSecond().getSecond().getSecond();
 | |
| 						Either<ItemStackOld, Unit> either3 = getItemFromList(0, list, predicate);
 | |
| 						Either<ItemStackOld, Unit> either4 = getItemFromList(1, list, predicate);
 | |
| 						Either<ItemStackOld, Unit> either5 = getItemFromList(2, list, predicate);
 | |
| 						Either<ItemStackOld, Unit> either6 = getItemFromList(3, list, predicate);
 | |
| 						Either<ItemStackOld, Unit> either7 = getItemFromList(0, list2, predicate);
 | |
| 						Either<ItemStackOld, Unit> either8 = getItemFromList(1, list2, predicate);
 | |
| 						return areAllEmpty(either, either2, either3, either4, either5, either6, either7, either8)
 | |
| 							? Pair.of(string, Either.right(Unit.INSTANCE))
 | |
| 							: Pair.of(
 | |
| 								string,
 | |
| 								Either.left(
 | |
| 									Pair.of(
 | |
| 										either7,
 | |
| 										Pair.of(either8, Pair.of(either3, Pair.of(either4, Pair.of(either5, Pair.of(either6, Pair.of(either, Pair.of(either2, new Dynamic(dynamicOps))))))))
 | |
| 									)
 | |
| 								)
 | |
| 							);
 | |
| 					};
 | |
| 				}
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@SafeVarargs
 | |
| 	private static boolean areAllEmpty(Either<?, Unit>... items) {
 | |
| 		for (Either<?, Unit> either : items) {
 | |
| 			if (either.right().isEmpty()) {
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	private static <ItemStack> Either<ItemStack, Unit> getItemFromList(int index, List<ItemStack> list, Predicate<ItemStack> predicate) {
 | |
| 		if (index >= list.size()) {
 | |
| 			return Either.right(Unit.INSTANCE);
 | |
| 		} else {
 | |
| 			ItemStack object = (ItemStack)list.get(index);
 | |
| 			return predicate.test(object) ? Either.right(Unit.INSTANCE) : Either.left(object);
 | |
| 		}
 | |
| 	}
 | |
| }
 |