VillagerRebuildLevelAndXpFix.java

net.minecraft.util.datafix.fixes.VillagerRebuildLevelAndXpFix

信息

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

    TODO

字段/常量

  • TRADES_PER_LEVEL

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L16
    • 说明:

      TODO

  • LEVEL_XP_THRESHOLDS

    • 类型: int[]
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

构造器

public VillagerRebuildLevelAndXpFix(Schema outputSchema, boolean changesType) @ L23

  • 构造器名:VillagerRebuildLevelAndXpFix
  • 源码定位:L23
  • 修饰符:public

参数:

  • outputSchema: Schema
  • changesType: boolean

说明:

TODO

方法

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

public static int getMinXpPerLevel(int level) @ L19

  • 方法名:getMinXpPerLevel
  • 源码定位:L19
  • 返回类型:int
  • 修饰符:public static

参数:

  • level: int

说明:

TODO

public TypeRewriteRule makeRule() @ L27

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

参数:

说明:

TODO

private static Typed<?> addLevel(Typed<?> villager, int level) @ L68

  • 方法名:addLevel
  • 源码定位:L68
  • 返回类型:Typed<?>
  • 修饰符:private static

参数:

  • villager: Typed<?>
  • level: int

说明:

TODO

private static Typed<?> addXpFromLevel(Typed<?> villager, int level) @ L74

  • 方法名:addXpFromLevel
  • 源码定位:L74
  • 返回类型:Typed<?>
  • 修饰符:private static

参数:

  • villager: Typed<?>
  • level: int

说明:

TODO

代码

public class VillagerRebuildLevelAndXpFix extends DataFix {
    private static final int TRADES_PER_LEVEL = 2;
    private static final int[] LEVEL_XP_THRESHOLDS = new int[]{0, 10, 50, 100, 150};
 
    public static int getMinXpPerLevel(int level) {
        return LEVEL_XP_THRESHOLDS[Mth.clamp(level - 1, 0, LEVEL_XP_THRESHOLDS.length - 1)];
    }
 
    public VillagerRebuildLevelAndXpFix(Schema outputSchema, boolean changesType) {
        super(outputSchema, changesType);
    }
 
    @Override
    public TypeRewriteRule makeRule() {
        Type<?> villagerType = this.getInputSchema().getChoiceType(References.ENTITY, "minecraft:villager");
        OpticFinder<?> entityF = DSL.namedChoice("minecraft:villager", villagerType);
        OpticFinder<?> offersF = villagerType.findField("Offers");
        Type<?> offersType = offersF.type();
        OpticFinder<?> recipeListF = offersType.findField("Recipes");
        ListType<?> recipeListType = (ListType<?>)recipeListF.type();
        OpticFinder<?> recipeF = recipeListType.getElement().finder();
        return this.fixTypeEverywhereTyped(
            "Villager level and xp rebuild",
            this.getInputSchema().getType(References.ENTITY),
            input -> input.updateTyped(
                entityF,
                villagerType,
                villager -> {
                    Dynamic<?> remainder = villager.get(DSL.remainderFinder());
                    int level = remainder.get("VillagerData").get("level").asInt(0);
                    Typed<?> modifiedVillager = villager;
                    if (level == 0 || level == 1) {
                        int offerCount = villager.getOptionalTyped(offersF)
                            .flatMap(o -> o.getOptionalTyped(recipeListF))
                            .map(recipeList -> recipeList.getAllTyped(recipeF).size())
                            .orElse(0);
                        level = Mth.clamp(offerCount / 2, 1, 5);
                        if (level > 1) {
                            modifiedVillager = addLevel(villager, level);
                        }
                    }
 
                    Optional<Number> xp = remainder.get("Xp").asNumber().result();
                    if (xp.isEmpty()) {
                        modifiedVillager = addXpFromLevel(modifiedVillager, level);
                    }
 
                    return modifiedVillager;
                }
            )
        );
    }
 
    private static Typed<?> addLevel(Typed<?> villager, int level) {
        return villager.update(
            DSL.remainderFinder(), remainder -> remainder.update("VillagerData", villagerData -> villagerData.set("level", villagerData.createInt(level)))
        );
    }
 
    private static Typed<?> addXpFromLevel(Typed<?> villager, int level) {
        int xp = getMinXpPerLevel(level);
        return villager.update(DSL.remainderFinder(), remainder -> remainder.set("Xp", remainder.createInt(xp)));
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.clamp()