OverreachingTickFix.java

net.minecraft.util.datafix.fixes.OverreachingTickFix

信息

  • 全限定名:net.minecraft.util.datafix.fixes.OverreachingTickFix
  • 类型:public class
  • 包:net.minecraft.util.datafix.fixes
  • 源码路径:src/main/java/net/minecraft/util/datafix/fixes/OverreachingTickFix.java
  • 起始行号:L14
  • 继承:DataFix
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

构造器

public OverreachingTickFix(Schema outputSchema) @ L15

  • 构造器名:OverreachingTickFix
  • 源码定位:L15
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

下面的方法块按源码顺序生成。

protected TypeRewriteRule makeRule() @ L19

  • 方法名:makeRule
  • 源码定位:L19
  • 返回类型:TypeRewriteRule
  • 修饰符:protected

参数:

说明:

TODO

private static Dynamic<?> extractOverreachingTicks(Dynamic<?> remainder, int chunkX, int chunkZ, Optional<?extends Dynamic<?>> ticks, String nameInUpgradeData) @ L36

  • 方法名:extractOverreachingTicks
  • 源码定位:L36
  • 返回类型:Dynamic<?>
  • 修饰符:private static

参数:

  • remainder: Dynamic<?>
  • chunkX: int
  • chunkZ: int
  • ticks: Optional>
  • nameInUpgradeData: String

说明:

TODO

代码

public class OverreachingTickFix extends DataFix {
    public OverreachingTickFix(Schema outputSchema) {
        super(outputSchema, false);
    }
 
    @Override
    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<? extends Typed<?>> blockTicksOpt = chunk.getOptionalTyped(blockTicksFinder);
            Optional<? extends Dynamic<?>> blockTicks = blockTicksOpt.isPresent() ? 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<? extends Dynamic<?>> fluidTicks = remainder.get("fluid_ticks").get().result();
                remainder = extractOverreachingTicks(remainder, chunkX, chunkZ, blockTicks, "neighbor_block_ticks");
                return extractOverreachingTicks(remainder, chunkX, chunkZ, fluidTicks, "neighbor_fluid_ticks");
            });
        });
    }
 
    private static Dynamic<?> extractOverreachingTicks(
        Dynamic<?> remainder, int chunkX, int chunkZ, Optional<? extends Dynamic<?>> ticks, String nameInUpgradeData
    ) {
        if (ticks.isPresent()) {
            List<? extends Dynamic<?>> 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();
            if (!overreachingTicks.isEmpty()) {
                remainder = remainder.set(
                    "UpgradeData", remainder.get("UpgradeData").orElseEmptyMap().set(nameInUpgradeData, remainder.createList(overreachingTicks.stream()))
                );
            }
        }
 
        return remainder;
    }
}

引用的其他类