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

51 lines
1.5 KiB
Java

package net.minecraft.util.datafix.fixes;
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 java.util.Arrays;
import java.util.Optional;
import java.util.stream.IntStream;
public class ChunkBiomeFix extends DataFix {
public ChunkBiomeFix(Schema outputSchema, boolean changesType) {
super(outputSchema, changesType);
}
@Override
protected TypeRewriteRule makeRule() {
Type<?> type = this.getInputSchema().getType(References.CHUNK);
OpticFinder<?> opticFinder = type.findField("Level");
return this.fixTypeEverywhereTyped("Leaves fix", type, typed -> typed.updateTyped(opticFinder, typedx -> typedx.update(DSL.remainderFinder(), dynamic -> {
Optional<IntStream> optional = dynamic.get("Biomes").asIntStreamOpt().result();
if (optional.isEmpty()) {
return dynamic;
} else {
int[] is = ((IntStream)optional.get()).toArray();
if (is.length != 256) {
return dynamic;
} else {
int[] js = new int[1024];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int k = (j << 2) + 2;
int l = (i << 2) + 2;
int m = l << 4 | k;
js[i << 2 | j] = is[m];
}
}
for (int i = 1; i < 64; i++) {
System.arraycopy(js, 0, js, i * 16, 16);
}
return dynamic.set("Biomes", dynamic.createIntList(Arrays.stream(js)));
}
}
})));
}
}