package net.minecraft.util.datafix.fixes; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.DSL; import com.mojang.datafixers.DataFix; import com.mojang.datafixers.DataFixUtils; 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 java.util.List; import java.util.Objects; import java.util.Optional; public class EntityRidingToPassengersFix extends DataFix { public EntityRidingToPassengersFix(Schema outputSchema, boolean changesType) { super(outputSchema, changesType); } @Override public TypeRewriteRule makeRule() { Schema schema = this.getInputSchema(); Schema schema2 = this.getOutputSchema(); Type type = schema.getTypeRaw(References.ENTITY_TREE); Type type2 = schema2.getTypeRaw(References.ENTITY_TREE); Type type3 = schema.getTypeRaw(References.ENTITY); return this.cap(schema, schema2, type, type2, type3); } private TypeRewriteRule cap( Schema inputSchema, Schema outputSchema, Type oldEntityTreeType, Type newEntityTreeType, Type entityType ) { Type, Entity>>> type = DSL.named( References.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Riding", oldEntityTreeType)), entityType) ); Type, Unit>, Entity>>> type2 = DSL.named( References.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Passengers", DSL.list(newEntityTreeType))), entityType) ); Type type3 = inputSchema.getType(References.ENTITY_TREE); Type type4 = outputSchema.getType(References.ENTITY_TREE); if (!Objects.equals(type3, type)) { throw new IllegalStateException("Old entity type is not what was expected."); } else if (!type4.equals(type2, true, true)) { throw new IllegalStateException("New entity type is not what was expected."); } else { OpticFinder, Entity>>> opticFinder = DSL.typeFinder(type); OpticFinder, Unit>, Entity>>> opticFinder2 = DSL.typeFinder(type2); OpticFinder opticFinder3 = DSL.typeFinder(newEntityTreeType); Type type5 = inputSchema.getType(References.PLAYER); Type type6 = outputSchema.getType(References.PLAYER); return TypeRewriteRule.seq( this.fixTypeEverywhere( "EntityRidingToPassengerFix", type, type2, dynamicOps -> pair -> { Optional, Unit>, Entity>>> optional = Optional.empty(); Pair, Entity>> pair2 = pair; while (true) { Either, Unit> either = DataFixUtils.orElse( optional.map( pairx -> { Typed typed = (Typed)newEntityTreeType.pointTyped(dynamicOps) .orElseThrow(() -> new IllegalStateException("Could not create new entity tree")); NewEntityTree object = (NewEntityTree)typed.set(opticFinder2, pairx) .getOptional(opticFinder3) .orElseThrow(() -> new IllegalStateException("Should always have an entity tree here")); return Either.left(ImmutableList.of(object)); } ), Either.right(DSL.unit()) ); optional = Optional.of(Pair.of(References.ENTITY_TREE.typeName(), Pair.of(either, pair2.getSecond().getSecond()))); Optional optional2 = pair2.getSecond().getFirst().left(); if (optional2.isEmpty()) { return (Pair)optional.orElseThrow(() -> new IllegalStateException("Should always have an entity tree here")); } pair2 = (Pair, Entity>>)new Typed<>(oldEntityTreeType, dynamicOps, (OldEntityTree)optional2.get()) .getOptional(opticFinder) .orElseThrow(() -> new IllegalStateException("Should always have an entity here")); } } ), this.writeAndRead("player RootVehicle injecter", type5, type6) ); } } }