108 lines
6.0 KiB
Java
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()));
|
||
|
}
|
||
|
}
|