2025-11-24 22:52:51 +03:00

66 lines
2.9 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.mojang.datafixers.DSL
* com.mojang.datafixers.DataFix
* com.mojang.datafixers.OpticFinder
* com.mojang.datafixers.TypeRewriteRule
* com.mojang.datafixers.Typed
* com.mojang.datafixers.schemas.Schema
* com.mojang.datafixers.types.Type
* com.mojang.serialization.Dynamic
*/
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.Typed;
import com.mojang.datafixers.schemas.Schema;
import com.mojang.datafixers.types.Type;
import com.mojang.serialization.Dynamic;
import java.util.List;
import java.util.Optional;
import net.minecraft.util.datafix.fixes.References;
public class OverreachingTickFix
extends DataFix {
public OverreachingTickFix(Schema outputSchema) {
super(outputSchema, false);
}
protected TypeRewriteRule makeRule() {
Type chunkType = this.getInputSchema().getType(References.CHUNK);
OpticFinder blockTicksFinder = chunkType.findField("block_ticks");
return this.fixTypeEverywhereTyped("Handle ticks saved in the wrong chunk", chunkType, chunk -> {
Optional blockTicksOpt = chunk.getOptionalTyped(blockTicksFinder);
Optional blockTicks = blockTicksOpt.isPresent() ? ((Typed)blockTicksOpt.get()).write().result() : Optional.empty();
return chunk.update(DSL.remainderFinder(), remainder -> {
int chunkX = remainder.get("xPos").asInt(0);
int chunkZ = remainder.get("zPos").asInt(0);
Optional fluidTicks = remainder.get("fluid_ticks").get().result();
remainder = OverreachingTickFix.extractOverreachingTicks(remainder, chunkX, chunkZ, blockTicks, "neighbor_block_ticks");
remainder = OverreachingTickFix.extractOverreachingTicks(remainder, chunkX, chunkZ, fluidTicks, "neighbor_fluid_ticks");
return remainder;
});
});
}
private static Dynamic<?> extractOverreachingTicks(Dynamic<?> remainder, int chunkX, int chunkZ, Optional<? extends Dynamic<?>> ticks, String nameInUpgradeData) {
List<Dynamic> overreachingTicks;
if (ticks.isPresent() && !(overreachingTicks = ticks.get().asStream().filter(tick -> {
int x = tick.get("x").asInt(0);
int z = tick.get("z").asInt(0);
int distX = Math.abs(chunkX - (x >> 4));
int distZ = Math.abs(chunkZ - (z >> 4));
return (distX != 0 || distZ != 0) && distX <= 1 && distZ <= 1;
}).toList()).isEmpty()) {
remainder = remainder.set("UpgradeData", remainder.get("UpgradeData").orElseEmptyMap().set(nameInUpgradeData, remainder.createList(overreachingTicks.stream())));
}
return remainder;
}
}