100 lines
3.8 KiB
Java
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()));
|
|
}
|
|
}
|