package net.minecraft.server;
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.DynamicOps;
import com.mojang.datafixers.types.Type;
import com.mojang.datafixers.util.Either;
import com.mojang.datafixers.util.Pair;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public class DataConverterRiding extends DataFix {
public DataConverterRiding(Schema schema, boolean flag) {
super(schema, flag);
}
public TypeRewriteRule makeRule() {
Schema schema = this.getInputSchema();
Schema schema1 = this.getOutputSchema();
Type<?> type = schema.getTypeRaw(DataConverterTypes.ENTITY_TREE);
Type<?> type1 = schema1.getTypeRaw(DataConverterTypes.ENTITY_TREE);
Type<?> type2 = schema.getTypeRaw(DataConverterTypes.ENTITY);
return this.a(schema, schema1, type, type1, type2);
}
private <OldEntityTree, NewEntityTree, Entity> TypeRewriteRule a(Schema schema, Schema schema1, Type<OldEntityTree> type, Type<NewEntityTree> type1, Type<Entity> type2) {
Type<Pair<String, Pair<Either<OldEntityTree, com.mojang.datafixers.util.Unit>, Entity>>> type3 = DSL.named(DataConverterTypes.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Riding", type)), type2));
Type<Pair<String, Pair<Either<List<NewEntityTree>, com.mojang.datafixers.util.Unit>, Entity>>> type4 = DSL.named(DataConverterTypes.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Passengers", DSL.list(type1))), type2));
Type<?> type5 = schema.getType(DataConverterTypes.ENTITY_TREE);
Type<?> type6 = schema1.getType(DataConverterTypes.ENTITY_TREE);
if (!Objects.equals(type5, type3)) {
throw new IllegalStateException("Old entity type is not what was expected.");
} else if (!type6.equals(type4, true, true)) {
throw new IllegalStateException("New entity type is not what was expected.");
} else {
OpticFinder<Pair<String, Pair<Either<OldEntityTree, com.mojang.datafixers.util.Unit>, Entity>>> opticfinder = DSL.typeFinder(type3);
OpticFinder<Pair<String, Pair<Either<List<NewEntityTree>, com.mojang.datafixers.util.Unit>, Entity>>> opticfinder1 = DSL.typeFinder(type4);
OpticFinder<NewEntityTree> opticfinder2 = DSL.typeFinder(type1);
Type<?> type7 = schema.getType(DataConverterTypes.PLAYER);
Type<?> type8 = schema1.getType(DataConverterTypes.PLAYER);
return TypeRewriteRule.seq(this.fixTypeEverywhere("EntityRidingToPassengerFix", type3, type4, (dynamicops) -> {
return (pair) -> {
Optional<Pair<String, Pair<Either<List<NewEntityTree>, com.mojang.datafixers.util.Unit>, Entity>>> optional = Optional.empty();
Pair pair1 = pair;
while (true) {
Either<List<NewEntityTree>, com.mojang.datafixers.util.Unit> either = (Either) DataFixUtils.orElse(optional.map((pair2) -> {
Typed<NewEntityTree> typed = (Typed) type1.pointTyped(dynamicops).orElseThrow(() -> {
return new IllegalStateException("Could not create new entity tree");
});
NewEntityTree newentitytree = typed.set(opticfinder1, pair2).getOptional(opticfinder2).orElseThrow(() -> {
return new IllegalStateException("Should always have an entity tree here");
});
return Either.left(ImmutableList.of(newentitytree));
}), Either.right(DSL.unit()));
optional = Optional.of(Pair.of(DataConverterTypes.ENTITY_TREE.typeName(), Pair.of(either, ((Pair) pair1.getSecond()).getSecond())));
Optional<OldEntityTree> optional1 = ((Either) ((Pair) pair1.getSecond()).getFirst()).left();
if (!optional1.isPresent()) {
return (Pair) optional.orElseThrow(() -> {
return new IllegalStateException("Should always have an entity tree here");
});
}
pair1 = (Pair) (new Typed(type, dynamicops, optional1.get())).getOptional(opticfinder).orElseThrow(() -> {
return new IllegalStateException("Should always have an entity here");
});
}
};
}), this.writeAndRead("player RootVehicle injecter", type7, type8));
}
}
}