69 lines
2.5 KiB
Java
69 lines
2.5 KiB
Java
package net.minecraft.util.datafix.fixes;
|
|
|
|
import com.mojang.datafixers.DSL;
|
|
import com.mojang.datafixers.DataFix;
|
|
import com.mojang.datafixers.TypeRewriteRule;
|
|
import com.mojang.datafixers.schemas.Schema;
|
|
import com.mojang.datafixers.types.Type;
|
|
import com.mojang.serialization.Dynamic;
|
|
import com.mojang.serialization.OptionalDynamic;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.Set;
|
|
import net.minecraft.core.SectionPos;
|
|
import net.minecraft.util.datafix.schemas.NamespacedSchema;
|
|
|
|
public class BlendingDataFix extends DataFix {
|
|
private final String name;
|
|
private static final Set<String> STATUSES_TO_SKIP_BLENDING = Set.of(
|
|
"minecraft:empty", "minecraft:structure_starts", "minecraft:structure_references", "minecraft:biomes"
|
|
);
|
|
|
|
public BlendingDataFix(Schema outputSchema) {
|
|
super(outputSchema, false);
|
|
this.name = "Blending Data Fix v" + outputSchema.getVersionKey();
|
|
}
|
|
|
|
@Override
|
|
protected TypeRewriteRule makeRule() {
|
|
Type<?> type = this.getOutputSchema().getType(References.CHUNK);
|
|
return this.fixTypeEverywhereTyped(
|
|
this.name, type, typed -> typed.update(DSL.remainderFinder(), dynamic -> updateChunkTag(dynamic, dynamic.get("__context")))
|
|
);
|
|
}
|
|
|
|
private static Dynamic<?> updateChunkTag(Dynamic<?> chunkTag, OptionalDynamic<?> context) {
|
|
chunkTag = chunkTag.remove("blending_data");
|
|
boolean bl = "minecraft:overworld".equals(context.get("dimension").asString().result().orElse(""));
|
|
Optional<? extends Dynamic<?>> optional = chunkTag.get("Status").result();
|
|
if (bl && optional.isPresent()) {
|
|
String string = NamespacedSchema.ensureNamespaced(((Dynamic)optional.get()).asString("empty"));
|
|
Optional<? extends Dynamic<?>> optional2 = chunkTag.get("below_zero_retrogen").result();
|
|
if (!STATUSES_TO_SKIP_BLENDING.contains(string)) {
|
|
chunkTag = updateBlendingData(chunkTag, 384, -64);
|
|
} else if (optional2.isPresent()) {
|
|
Dynamic<?> dynamic = (Dynamic<?>)optional2.get();
|
|
String string2 = NamespacedSchema.ensureNamespaced(dynamic.get("target_status").asString("empty"));
|
|
if (!STATUSES_TO_SKIP_BLENDING.contains(string2)) {
|
|
chunkTag = updateBlendingData(chunkTag, 256, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
return chunkTag;
|
|
}
|
|
|
|
private static Dynamic<?> updateBlendingData(Dynamic<?> chunkTag, int maxY, int minY) {
|
|
return chunkTag.set(
|
|
"blending_data",
|
|
chunkTag.createMap(
|
|
Map.of(
|
|
chunkTag.createString("min_section"),
|
|
chunkTag.createInt(SectionPos.blockToSectionCoord(minY)),
|
|
chunkTag.createString("max_section"),
|
|
chunkTag.createInt(SectionPos.blockToSectionCoord(minY + maxY))
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|