minecraft-src/net/minecraft/util/datafix/fixes/WorldGenSettingsHeightAndBiomeFix.java
2025-07-04 01:41:11 +03:00

100 lines
3.8 KiB
Java

package net.minecraft.util.datafix.fixes;
import com.google.common.collect.ImmutableMap;
import com.mojang.datafixers.DSL;
import com.mojang.datafixers.DataFix;
import com.mojang.datafixers.OpticFinder;
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.stream.Stream;
import net.minecraft.Util;
import org.apache.commons.lang3.mutable.MutableBoolean;
public class WorldGenSettingsHeightAndBiomeFix extends DataFix {
private static final String NAME = "WorldGenSettingsHeightAndBiomeFix";
public static final String WAS_PREVIOUSLY_INCREASED_KEY = "has_increased_height_already";
public WorldGenSettingsHeightAndBiomeFix(Schema outputSchema) {
super(outputSchema, true);
}
@Override
protected TypeRewriteRule makeRule() {
Type<?> type = this.getInputSchema().getType(References.WORLD_GEN_SETTINGS);
OpticFinder<?> opticFinder = type.findField("dimensions");
Type<?> type2 = this.getOutputSchema().getType(References.WORLD_GEN_SETTINGS);
Type<?> type3 = type2.findFieldType("dimensions");
return this.fixTypeEverywhereTyped(
"WorldGenSettingsHeightAndBiomeFix",
type,
type2,
typed -> {
OptionalDynamic<?> optionalDynamic = typed.get(DSL.remainderFinder()).get("has_increased_height_already");
boolean bl = optionalDynamic.result().isEmpty();
boolean bl2 = optionalDynamic.asBoolean(true);
return typed.update(DSL.remainderFinder(), dynamic -> dynamic.remove("has_increased_height_already"))
.updateTyped(
opticFinder,
type3,
typedx -> Util.writeAndReadTypedOrThrow(
typedx,
type3,
dynamic -> dynamic.update(
"minecraft:overworld",
dynamicx -> dynamicx.update(
"generator",
dynamicxx -> {
String string = dynamicxx.get("type").asString("");
if ("minecraft:noise".equals(string)) {
MutableBoolean mutableBoolean = new MutableBoolean();
dynamicxx = dynamicxx.update(
"biome_source",
dynamicxxx -> {
String stringx = dynamicxxx.get("type").asString("");
if ("minecraft:vanilla_layered".equals(stringx) || bl && "minecraft:multi_noise".equals(stringx)) {
if (dynamicxxx.get("large_biomes").asBoolean(false)) {
mutableBoolean.setTrue();
}
return dynamicxxx.createMap(
ImmutableMap.of(
dynamicxxx.createString("preset"),
dynamicxxx.createString("minecraft:overworld"),
dynamicxxx.createString("type"),
dynamicxxx.createString("minecraft:multi_noise")
)
);
} else {
return dynamicxxx;
}
}
);
return mutableBoolean.booleanValue()
? dynamicxx.update(
"settings", dynamicxxx -> "minecraft:overworld".equals(dynamicxxx.asString("")) ? dynamicxxx.createString("minecraft:large_biomes") : dynamicxxx
)
: dynamicxx;
} else if ("minecraft:flat".equals(string)) {
return bl2 ? dynamicxx : dynamicxx.update("settings", dynamicxxx -> dynamicxxx.update("layers", WorldGenSettingsHeightAndBiomeFix::updateLayers));
} else {
return dynamicxx;
}
}
)
)
)
);
}
);
}
private static Dynamic<?> updateLayers(Dynamic<?> dynamic) {
Dynamic<?> dynamic2 = dynamic.createMap(
ImmutableMap.of(dynamic.createString("height"), dynamic.createInt(64), dynamic.createString("block"), dynamic.createString("minecraft:air"))
);
return dynamic.createList(Stream.concat(Stream.of(dynamic2), dynamic.asStream()));
}
}