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)));
}
}