SpawnerDataFix.java

net.minecraft.util.datafix.fixes.SpawnerDataFix

信息

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

    TODO

字段/常量

内部类/嵌套类型

构造器

public SpawnerDataFix(Schema outputSchema) @ L15

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

参数:

  • outputSchema: Schema

说明:

TODO

方法

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

protected TypeRewriteRule makeRule() @ L19

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

参数:

说明:

TODO

private <T> Typed<T> wrapEntityToSpawnData(Type<T> newType, Typed<?> spawnData) @ L40

  • 方法名:wrapEntityToSpawnData
  • 源码定位:L40
  • 返回类型: Typed
  • 修饰符:private

参数:

  • newType: Type
  • spawnData: Typed<?>

说明:

TODO

private <T> Typed<T> wrapSpawnPotentialsToWeightedEntries(Type<T> newType, Typed<?> spawnPotentials) @ L45

  • 方法名:wrapSpawnPotentialsToWeightedEntries
  • 源码定位:L45
  • 返回类型: Typed
  • 修饰符:private

参数:

  • newType: Type
  • spawnPotentials: Typed<?>

说明:

TODO

代码

public class SpawnerDataFix extends DataFix {
    public SpawnerDataFix(Schema outputSchema) {
        super(outputSchema, true);
    }
 
    @Override
    protected TypeRewriteRule makeRule() {
        Type<?> oldType = this.getInputSchema().getType(References.UNTAGGED_SPAWNER);
        Type<?> newType = this.getOutputSchema().getType(References.UNTAGGED_SPAWNER);
        OpticFinder<?> spawnDataFinder = oldType.findField("SpawnData");
        Type<?> newSpawnDataType = newType.findField("SpawnData").type();
        OpticFinder<?> spawnPotentialsFinder = oldType.findField("SpawnPotentials");
        Type<?> newSpawnPotentialsType = newType.findField("SpawnPotentials").type();
        return this.fixTypeEverywhereTyped(
            "Fix mob spawner data structure",
            oldType,
            newType,
            spawner -> spawner.updateTyped(spawnDataFinder, newSpawnDataType, spawnData -> this.wrapEntityToSpawnData(newSpawnDataType, spawnData))
                .updateTyped(
                    spawnPotentialsFinder,
                    newSpawnPotentialsType,
                    spawnPotentials -> this.wrapSpawnPotentialsToWeightedEntries(newSpawnPotentialsType, spawnPotentials)
                )
        );
    }
 
    private <T> Typed<T> wrapEntityToSpawnData(Type<T> newType, Typed<?> spawnData) {
        DynamicOps<?> ops = spawnData.getOps();
        return new Typed<>(newType, ops, (T)Pair.<Object, Dynamic<?>>of(spawnData.getValue(), new Dynamic<>(ops)));
    }
 
    private <T> Typed<T> wrapSpawnPotentialsToWeightedEntries(Type<T> newType, Typed<?> spawnPotentials) {
        DynamicOps<?> ops = spawnPotentials.getOps();
        List<?> entries = (List<?>)spawnPotentials.getValue();
        List<?> wrappedEntries = entries.stream().map(o -> {
            Pair<Object, Dynamic<?>> entry = (Pair<Object, Dynamic<?>>)o;
            int weight = entry.getSecond().get("Weight").asNumber().result().orElse(1).intValue();
            Dynamic<?> newEntryRemainder = new Dynamic<>(ops);
            newEntryRemainder = newEntryRemainder.set("weight", newEntryRemainder.createInt(weight));
            Dynamic<?> newInnerRemainder = entry.getSecond().remove("Weight").remove("Entity");
            return Pair.of(Pair.of(entry.getFirst(), newInnerRemainder), newEntryRemainder);
        }).toList();
        return new Typed<>(newType, ops, (T)wrappedEntries);
    }
}

引用的其他类