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.DataResult;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.MapLike;
import java.util.function.Function;
public class ChunkRenamesFix extends DataFix {
public ChunkRenamesFix(Schema p_185100_) {
super(p_185100_, true);
}
@Override
protected TypeRewriteRule makeRule() {
Type> type = this.getInputSchema().getType(References.CHUNK);
OpticFinder> opticfinder = type.findField("Level");
OpticFinder> opticfinder1 = opticfinder.type().findField("Structures");
Type> type1 = this.getOutputSchema().getType(References.CHUNK);
Type> type2 = type1.findFieldType("structures");
return this.fixTypeEverywhereTyped("Chunk Renames; purge Level-tag", type, type1, p_199427_ -> {
Typed> typed = p_199427_.getTyped(opticfinder);
Typed> typed1 = appendChunkName(typed);
typed1 = typed1.set(DSL.remainderFinder(), mergeRemainders(p_199427_, typed.get(DSL.remainderFinder())));
typed1 = renameField(typed1, "TileEntities", "block_entities");
typed1 = renameField(typed1, "TileTicks", "block_ticks");
typed1 = renameField(typed1, "Entities", "entities");
typed1 = renameField(typed1, "Sections", "sections");
typed1 = typed1.updateTyped(opticfinder1, type2, p_185128_ -> renameField(p_185128_, "Starts", "starts"));
typed1 = renameField(typed1, "Structures", "structures");
return typed1.update(DSL.remainderFinder(), p_199429_ -> p_199429_.remove("Level"));
});
}
private static Typed> renameField(Typed> p_185112_, String p_185113_, String p_185114_) {
return renameFieldHelper(p_185112_, p_185113_, p_185114_, p_185112_.getType().findFieldType(p_185113_))
.update(DSL.remainderFinder(), p_199439_ -> p_199439_.remove(p_185113_));
}
private static Typed> renameFieldHelper(Typed> p_185116_, String p_185117_, String p_185118_, Type p_185119_) {
Type> type = DSL.optional(DSL.field(p_185117_, p_185119_));
Type> type1 = DSL.optional(DSL.field(p_185118_, p_185119_));
return p_185116_.update(type.finder(), type1, Function.identity());
}
private static Typed> appendChunkName(Typed p_185107_) {
return new Typed<>(DSL.named("chunk", p_185107_.getType()), p_185107_.getOps(), Pair.of("chunk", p_185107_.getValue()));
}
private static Dynamic mergeRemainders(Typed> p_185109_, Dynamic p_185110_) {
DynamicOps dynamicops = p_185110_.getOps();
Dynamic dynamic = p_185109_.get(DSL.remainderFinder()).convert(dynamicops);
DataResult dataresult = dynamicops.getMap(p_185110_.getValue())
.flatMap(p_199433_ -> dynamicops.mergeToMap(dynamic.getValue(), (MapLike)p_199433_));
return dataresult.result().map(p_199436_ -> new Dynamic<>(dynamicops, (T)p_199436_)).orElse(p_185110_);
}
}