InlineBlockPosFormatFix.java

net.minecraft.util.datafix.fixes.InlineBlockPosFormatFix

信息

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

    TODO

字段/常量

内部类/嵌套类型

构造器

public InlineBlockPosFormatFix(Schema outputSchema) @ L16

  • 构造器名:InlineBlockPosFormatFix
  • 源码定位:L16
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

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

public TypeRewriteRule makeRule() @ L20

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

参数:

说明:

TODO

private OpticFinder<?> entityFinder(String choiceName) @ L56

  • 方法名:entityFinder
  • 源码定位:L56
  • 返回类型:OpticFinder<?>
  • 修饰符:private

参数:

  • choiceName: String

说明:

TODO

private Dynamic<?> fixPlayer(Dynamic<?> tag) @ L60

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

参数:

  • tag: Dynamic<?>

说明:

TODO

private Dynamic<?> fixLivingEntity(Dynamic<?> tag) @ L96

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

参数:

  • tag: Dynamic<?>

说明:

TODO

private Dynamic<?> fixVex(Dynamic<?> tag) @ L100

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

参数:

  • tag: Dynamic<?>

说明:

TODO

private Dynamic<?> fixPhantom(Dynamic<?> tag) @ L104

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

参数:

  • tag: Dynamic<?>

说明:

TODO

private Dynamic<?> fixTurtle(Dynamic<?> tag) @ L108

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

参数:

  • tag: Dynamic<?>

说明:

TODO

private Dynamic<?> fixBlockAttached(Dynamic<?> tag) @ L114

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

参数:

  • tag: Dynamic<?>

说明:

TODO

代码

public class InlineBlockPosFormatFix extends DataFix {
    public InlineBlockPosFormatFix(Schema outputSchema) {
        super(outputSchema, false);
    }
 
    @Override
    public TypeRewriteRule makeRule() {
        OpticFinder<?> vexFinder = this.entityFinder("minecraft:vex");
        OpticFinder<?> phantomFinder = this.entityFinder("minecraft:phantom");
        OpticFinder<?> turtleFinder = this.entityFinder("minecraft:turtle");
        List<OpticFinder<?>> blockAttachedFinders = List.of(
            this.entityFinder("minecraft:item_frame"),
            this.entityFinder("minecraft:glow_item_frame"),
            this.entityFinder("minecraft:painting"),
            this.entityFinder("minecraft:leash_knot")
        );
        return TypeRewriteRule.seq(
            this.fixTypeEverywhereTyped(
                "InlineBlockPosFormatFix - player",
                this.getInputSchema().getType(References.PLAYER),
                player -> player.update(DSL.remainderFinder(), this::fixPlayer)
            ),
            this.fixTypeEverywhereTyped(
                "InlineBlockPosFormatFix - entity",
                this.getInputSchema().getType(References.ENTITY),
                entity -> {
                    entity = entity.update(DSL.remainderFinder(), this::fixLivingEntity)
                        .updateTyped(vexFinder, vex -> vex.update(DSL.remainderFinder(), this::fixVex))
                        .updateTyped(phantomFinder, phantom -> phantom.update(DSL.remainderFinder(), this::fixPhantom))
                        .updateTyped(turtleFinder, turtle -> turtle.update(DSL.remainderFinder(), this::fixTurtle));
 
                    for (OpticFinder<?> blockAttachedFinder : blockAttachedFinders) {
                        entity = entity.updateTyped(blockAttachedFinder, blockAttached -> blockAttached.update(DSL.remainderFinder(), this::fixBlockAttached));
                    }
 
                    return entity;
                }
            )
        );
    }
 
    private OpticFinder<?> entityFinder(String choiceName) {
        return DSL.namedChoice(choiceName, this.getInputSchema().getChoiceType(References.ENTITY, choiceName));
    }
 
    private Dynamic<?> fixPlayer(Dynamic<?> tag) {
        tag = this.fixLivingEntity(tag);
        Optional<Number> spawnX = tag.get("SpawnX").asNumber().result();
        Optional<Number> spawnY = tag.get("SpawnY").asNumber().result();
        Optional<Number> spawnZ = tag.get("SpawnZ").asNumber().result();
        if (spawnX.isPresent() && spawnY.isPresent() && spawnZ.isPresent()) {
            Dynamic<?> respawn = tag.createMap(
                Map.of(
                    tag.createString("pos"), ExtraDataFixUtils.createBlockPos(tag, spawnX.get().intValue(), spawnY.get().intValue(), spawnZ.get().intValue())
                )
            );
            respawn = Dynamic.copyField(tag, "SpawnAngle", respawn, "angle");
            respawn = Dynamic.copyField(tag, "SpawnDimension", respawn, "dimension");
            respawn = Dynamic.copyField(tag, "SpawnForced", respawn, "forced");
            tag = tag.remove("SpawnX").remove("SpawnY").remove("SpawnZ").remove("SpawnAngle").remove("SpawnDimension").remove("SpawnForced");
            tag = tag.set("respawn", respawn);
        }
 
        Optional<? extends Dynamic<?>> enteredNetherPos = tag.get("enteredNetherPosition").result();
        if (enteredNetherPos.isPresent()) {
            tag = tag.remove("enteredNetherPosition")
                .set(
                    "entered_nether_pos",
                    tag.createList(
                        Stream.of(
                            tag.createDouble(enteredNetherPos.get().get("x").asDouble(0.0)),
                            tag.createDouble(enteredNetherPos.get().get("y").asDouble(0.0)),
                            tag.createDouble(enteredNetherPos.get().get("z").asDouble(0.0))
                        )
                    )
                );
        }
 
        return tag;
    }
 
    private Dynamic<?> fixLivingEntity(Dynamic<?> tag) {
        return ExtraDataFixUtils.fixInlineBlockPos(tag, "SleepingX", "SleepingY", "SleepingZ", "sleeping_pos");
    }
 
    private Dynamic<?> fixVex(Dynamic<?> tag) {
        return ExtraDataFixUtils.fixInlineBlockPos(tag.renameField("LifeTicks", "life_ticks"), "BoundX", "BoundY", "BoundZ", "bound_pos");
    }
 
    private Dynamic<?> fixPhantom(Dynamic<?> tag) {
        return ExtraDataFixUtils.fixInlineBlockPos(tag.renameField("Size", "size"), "AX", "AY", "AZ", "anchor_pos");
    }
 
    private Dynamic<?> fixTurtle(Dynamic<?> tag) {
        tag = tag.remove("TravelPosX").remove("TravelPosY").remove("TravelPosZ");
        tag = ExtraDataFixUtils.fixInlineBlockPos(tag, "HomePosX", "HomePosY", "HomePosZ", "home_pos");
        return tag.renameField("HasEgg", "has_egg");
    }
 
    private Dynamic<?> fixBlockAttached(Dynamic<?> tag) {
        return ExtraDataFixUtils.fixInlineBlockPos(tag, "TileX", "TileY", "TileZ", "block_pos");
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • ExtraDataFixUtils

    • 引用位置: 方法调用
    • 关联成员: ExtraDataFixUtils.createBlockPos(), ExtraDataFixUtils.fixInlineBlockPos()
  • ResolvableProfile

    • 引用位置: 参数/方法调用/返回值
    • 关联成员: Dynamic.copyField()