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

108 lines
6.0 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.Typed;
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 p_185174_) {
super(p_185174_, true);
}
@Override
protected TypeRewriteRule makeRule() {
Type<?> type = this.getInputSchema().getType(References.WORLD_GEN_SETTINGS);
OpticFinder<?> opticfinder = type.findField("dimensions");
Type<?> type1 = this.getOutputSchema().getType(References.WORLD_GEN_SETTINGS);
Type<?> type2 = type1.findFieldType("dimensions");
return this.fixTypeEverywhereTyped(
"WorldGenSettingsHeightAndBiomeFix",
type,
type1,
p_309007_ -> {
OptionalDynamic<?> optionaldynamic = p_309007_.get(DSL.remainderFinder()).get("has_increased_height_already");
boolean flag = optionaldynamic.result().isEmpty();
boolean flag1 = optionaldynamic.asBoolean(true);
return p_309007_.update(DSL.remainderFinder(), p_185205_ -> p_185205_.remove("has_increased_height_already"))
.updateTyped(
opticfinder,
type2,
p_309004_ -> Util.writeAndReadTypedOrThrow(
p_309004_,
type2,
p_309010_ -> p_309010_.update(
"minecraft:overworld",
p_185194_ -> p_185194_.update(
"generator",
p_185201_ -> {
String s = p_185201_.get("type").asString("");
if ("minecraft:noise".equals(s)) {
MutableBoolean mutableboolean = new MutableBoolean();
p_185201_ = p_185201_.update(
"biome_source",
p_185185_ -> {
String s1 = p_185185_.get("type").asString("");
if ("minecraft:vanilla_layered".equals(s1) || flag && "minecraft:multi_noise".equals(s1)) {
if (p_185185_.get("large_biomes").asBoolean(false)) {
mutableboolean.setTrue();
}
return p_185185_.createMap(
ImmutableMap.of(
p_185185_.createString("preset"),
p_185185_.createString("minecraft:overworld"),
p_185185_.createString("type"),
p_185185_.createString("minecraft:multi_noise")
)
);
} else {
return p_185185_;
}
}
);
return mutableboolean.booleanValue()
? p_185201_.update(
"settings",
p_185203_ -> "minecraft:overworld".equals(p_185203_.asString(""))
? p_185203_.createString("minecraft:large_biomes")
: p_185203_
)
: p_185201_;
} else if ("minecraft:flat".equals(s)) {
return flag1
? p_185201_
: p_185201_.update(
"settings", p_185197_ -> p_185197_.update("layers", WorldGenSettingsHeightAndBiomeFix::updateLayers)
);
} else {
return p_185201_;
}
}
)
)
)
);
}
);
}
private static Dynamic<?> updateLayers(Dynamic<?> p_185181_) {
Dynamic<?> dynamic = p_185181_.createMap(
ImmutableMap.of(p_185181_.createString("height"), p_185181_.createInt(64), p_185181_.createString("block"), p_185181_.createString("minecraft:air"))
);
return p_185181_.createList(Stream.concat(Stream.of(dynamic), p_185181_.asStream()));
}
}