Code/net/minecraft/util/datafix/fixes/EntityRidingToPassengersFix...

97 lines
5.2 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
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 com.mojang.serialization.DynamicOps;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public class EntityRidingToPassengersFix extends DataFix {
public EntityRidingToPassengersFix(Schema p_15638_, boolean p_15639_) {
super(p_15638_, p_15639_);
}
@Override
public TypeRewriteRule makeRule() {
Schema schema = this.getInputSchema();
Schema schema1 = this.getOutputSchema();
Type<?> type = schema.getTypeRaw(References.ENTITY_TREE);
Type<?> type1 = schema1.getTypeRaw(References.ENTITY_TREE);
Type<?> type2 = schema.getTypeRaw(References.ENTITY);
return this.cap(schema, schema1, type, type1, type2);
}
private <OldEntityTree, NewEntityTree, Entity> TypeRewriteRule cap(
Schema p_15642_, Schema p_15643_, Type<OldEntityTree> p_15644_, Type<NewEntityTree> p_15645_, Type<Entity> p_15646_
) {
Type<Pair<String, Pair<Either<OldEntityTree, Unit>, Entity>>> type = DSL.named(
References.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Riding", p_15644_)), p_15646_)
);
Type<Pair<String, Pair<Either<List<NewEntityTree>, Unit>, Entity>>> type1 = DSL.named(
References.ENTITY_TREE.typeName(), DSL.and(DSL.optional(DSL.field("Passengers", DSL.list(p_15645_))), p_15646_)
);
Type<?> type2 = p_15642_.getType(References.ENTITY_TREE);
Type<?> type3 = p_15643_.getType(References.ENTITY_TREE);
if (!Objects.equals(type2, type)) {
throw new IllegalStateException("Old entity type is not what was expected.");
} else if (!type3.equals(type1, true, true)) {
throw new IllegalStateException("New entity type is not what was expected.");
} else {
OpticFinder<Pair<String, Pair<Either<OldEntityTree, Unit>, Entity>>> opticfinder = DSL.typeFinder(type);
OpticFinder<Pair<String, Pair<Either<List<NewEntityTree>, Unit>, Entity>>> opticfinder1 = DSL.typeFinder(type1);
OpticFinder<NewEntityTree> opticfinder2 = DSL.typeFinder(p_15645_);
Type<?> type4 = p_15642_.getType(References.PLAYER);
Type<?> type5 = p_15643_.getType(References.PLAYER);
return TypeRewriteRule.seq(
this.fixTypeEverywhere(
"EntityRidingToPassengerFix",
type,
type1,
p_15653_ -> p_145320_ -> {
Optional<Pair<String, Pair<Either<List<NewEntityTree>, Unit>, Entity>>> optional = Optional.empty();
Pair<String, Pair<Either<OldEntityTree, Unit>, Entity>> pair = p_145320_;
while (true) {
Either<List<NewEntityTree>, Unit> either = DataFixUtils.orElse(
optional.map(
p_145326_ -> {
Typed<NewEntityTree> typed = p_15645_.pointTyped(p_15653_)
.orElseThrow(() -> new IllegalStateException("Could not create new entity tree"));
NewEntityTree newentitytree = typed.set(
opticfinder1, (Pair<String, Pair<Either<List<NewEntityTree>, Unit>, Entity>>)p_145326_
)
.getOptional(opticfinder2)
.orElseThrow(() -> new IllegalStateException("Should always have an entity tree here"));
return Either.left(ImmutableList.of(newentitytree));
}
),
Either.right(DSL.unit())
);
optional = Optional.of(Pair.of(References.ENTITY_TREE.typeName(), Pair.of(either, pair.getSecond().getSecond())));
Optional<OldEntityTree> optional1 = pair.getSecond().getFirst().left();
if (optional1.isEmpty()) {
return optional.orElseThrow(() -> new IllegalStateException("Should always have an entity tree here"));
}
pair = new Typed<>(p_15644_, p_15653_, optional1.get())
.getOptional(opticfinder)
.orElseThrow(() -> new IllegalStateException("Should always have an entity here"));
}
}
),
this.writeAndRead("player RootVehicle injecter", type4, type5)
);
}
}
}