MobEffectIdFix.java

net.minecraft.util.datafix.fixes.MobEffectIdFix

信息

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

    TODO

字段/常量

  • ID_MAP

    • 类型: Int2ObjectMap<String>
    • 修饰符: private static final
    • 源码定位: L23
    • 说明:

      TODO

  • MOB_EFFECT_INSTANCE_CARRIER_ITEMS

    • 类型: Set<String>
    • 修饰符: private static final
    • 源码定位: L58
    • 说明:

      TODO

内部类/嵌套类型

构造器

public MobEffectIdFix(Schema outputSchema) @ L62

  • 构造器名:MobEffectIdFix
  • 源码定位:L62
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

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

private static <T> Optional<Dynamic<T>> getAndConvertMobEffectId(Dynamic<T> obj, String fieldName) @ L66

  • 方法名:getAndConvertMobEffectId
  • 源码定位:L66
  • 返回类型: Optional<Dynamic>
  • 修饰符:private static

参数:

  • obj: Dynamic
  • fieldName: String

说明:

TODO

private static <T> Dynamic<T> updateMobEffectIdField(Dynamic<T> input, String oldFieldName, Dynamic<T> output, String newFieldName) @ L70

  • 方法名:updateMobEffectIdField
  • 源码定位:L70
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic
  • oldFieldName: String
  • output: Dynamic
  • newFieldName: String

说明:

TODO

private static <T> Dynamic<T> updateMobEffectIdField(Dynamic<T> input, String oldFieldName, String newFieldName) @ L75

  • 方法名:updateMobEffectIdField
  • 源码定位:L75
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic
  • oldFieldName: String
  • newFieldName: String

说明:

TODO

private static <T> Dynamic<T> updateMobEffectInstance(Dynamic<T> input) @ L79

  • 方法名:updateMobEffectInstance
  • 源码定位:L79
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic

说明:

TODO

private static <T> Dynamic<T> updateMobEffectInstanceList(Dynamic<T> input, String oldField, String newField) @ L90

  • 方法名:updateMobEffectInstanceList
  • 源码定位:L90
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic
  • oldField: String
  • newField: String

说明:

TODO

private static <T> Dynamic<T> updateSuspiciousStewEntry(Dynamic<T> input, Dynamic<T> output) @ L98

  • 方法名:updateSuspiciousStewEntry
  • 源码定位:L98
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic
  • output: Dynamic

说明:

TODO

private static <T> Dynamic<T> updateSuspiciousStewEntry(Dynamic<T> input) @ L104

  • 方法名:updateSuspiciousStewEntry
  • 源码定位:L104
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • input: Dynamic

说明:

TODO

private Typed<?> updateNamedChoice(Typed<?> input, TypeReference typeReference, String name, Function<Dynamic<?>,Dynamic<?>> function) @ L108

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

参数:

  • input: Typed<?>
  • typeReference: TypeReference
  • name: String
  • function: Function<Dynamic,Dynamic>

说明:

TODO

private TypeRewriteRule blockEntityFixer() @ L114

  • 方法名:blockEntityFixer
  • 源码定位:L114
  • 返回类型:TypeRewriteRule
  • 修饰符:private

参数:

说明:

TODO

private static <T> Dynamic<T> fixMooshroomTag(Dynamic<T> entityTag) @ L124

  • 方法名:fixMooshroomTag
  • 源码定位:L124
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • entityTag: Dynamic

说明:

TODO

private static <T> Dynamic<T> fixArrowTag(Dynamic<T> data) @ L134

  • 方法名:fixArrowTag
  • 源码定位:L134
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • data: Dynamic

说明:

TODO

private static <T> Dynamic<T> fixAreaEffectCloudTag(Dynamic<T> data) @ L138

  • 方法名:fixAreaEffectCloudTag
  • 源码定位:L138
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • data: Dynamic

说明:

TODO

private static Dynamic<?> updateLivingEntityTag(Dynamic<?> data) @ L142

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

参数:

  • data: Dynamic<?>

说明:

TODO

private TypeRewriteRule entityFixer() @ L146

  • 方法名:entityFixer
  • 源码定位:L146
  • 返回类型:TypeRewriteRule
  • 修饰符:private

参数:

说明:

TODO

private TypeRewriteRule playerFixer() @ L156

  • 方法名:playerFixer
  • 源码定位:L156
  • 返回类型:TypeRewriteRule
  • 修饰符:private

参数:

说明:

TODO

private static <T> Dynamic<T> fixSuspiciousStewTag(Dynamic<T> tag) @ L163

  • 方法名:fixSuspiciousStewTag
  • 源码定位:L163
  • 返回类型: Dynamic
  • 修饰符:private static

参数:

  • tag: Dynamic

说明:

TODO

private TypeRewriteRule itemStackFixer() @ L171

  • 方法名:itemStackFixer
  • 源码定位:L171
  • 返回类型:TypeRewriteRule
  • 修饰符:private

参数:

说明:

TODO

protected TypeRewriteRule makeRule() @ L201

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

参数:

说明:

TODO

代码

public class MobEffectIdFix extends DataFix {
    private static final Int2ObjectMap<String> ID_MAP = Util.make(new Int2ObjectOpenHashMap<>(), m -> {
        m.put(1, "minecraft:speed");
        m.put(2, "minecraft:slowness");
        m.put(3, "minecraft:haste");
        m.put(4, "minecraft:mining_fatigue");
        m.put(5, "minecraft:strength");
        m.put(6, "minecraft:instant_health");
        m.put(7, "minecraft:instant_damage");
        m.put(8, "minecraft:jump_boost");
        m.put(9, "minecraft:nausea");
        m.put(10, "minecraft:regeneration");
        m.put(11, "minecraft:resistance");
        m.put(12, "minecraft:fire_resistance");
        m.put(13, "minecraft:water_breathing");
        m.put(14, "minecraft:invisibility");
        m.put(15, "minecraft:blindness");
        m.put(16, "minecraft:night_vision");
        m.put(17, "minecraft:hunger");
        m.put(18, "minecraft:weakness");
        m.put(19, "minecraft:poison");
        m.put(20, "minecraft:wither");
        m.put(21, "minecraft:health_boost");
        m.put(22, "minecraft:absorption");
        m.put(23, "minecraft:saturation");
        m.put(24, "minecraft:glowing");
        m.put(25, "minecraft:levitation");
        m.put(26, "minecraft:luck");
        m.put(27, "minecraft:unluck");
        m.put(28, "minecraft:slow_falling");
        m.put(29, "minecraft:conduit_power");
        m.put(30, "minecraft:dolphins_grace");
        m.put(31, "minecraft:bad_omen");
        m.put(32, "minecraft:hero_of_the_village");
        m.put(33, "minecraft:darkness");
    });
    private static final Set<String> MOB_EFFECT_INSTANCE_CARRIER_ITEMS = Set.of(
        "minecraft:potion", "minecraft:splash_potion", "minecraft:lingering_potion", "minecraft:tipped_arrow"
    );
 
    public MobEffectIdFix(Schema outputSchema) {
        super(outputSchema, false);
    }
 
    private static <T> Optional<Dynamic<T>> getAndConvertMobEffectId(Dynamic<T> obj, String fieldName) {
        return obj.get(fieldName).asNumber().result().map(id -> ID_MAP.get(id.intValue())).map(obj::createString);
    }
 
    private static <T> Dynamic<T> updateMobEffectIdField(Dynamic<T> input, String oldFieldName, Dynamic<T> output, String newFieldName) {
        Optional<Dynamic<T>> mappedId = getAndConvertMobEffectId(input, oldFieldName);
        return output.replaceField(oldFieldName, newFieldName, mappedId);
    }
 
    private static <T> Dynamic<T> updateMobEffectIdField(Dynamic<T> input, String oldFieldName, String newFieldName) {
        return updateMobEffectIdField(input, oldFieldName, input, newFieldName);
    }
 
    private static <T> Dynamic<T> updateMobEffectInstance(Dynamic<T> input) {
        input = updateMobEffectIdField(input, "Id", "id");
        input = input.renameField("Ambient", "ambient");
        input = input.renameField("Amplifier", "amplifier");
        input = input.renameField("Duration", "duration");
        input = input.renameField("ShowParticles", "show_particles");
        input = input.renameField("ShowIcon", "show_icon");
        Optional<Dynamic<T>> hiddenEffect = input.get("HiddenEffect").result().map(MobEffectIdFix::updateMobEffectInstance);
        return input.replaceField("HiddenEffect", "hidden_effect", hiddenEffect);
    }
 
    private static <T> Dynamic<T> updateMobEffectInstanceList(Dynamic<T> input, String oldField, String newField) {
        Optional<Dynamic<T>> newValue = input.get(oldField)
            .asStreamOpt()
            .result()
            .map(effects -> input.createList(effects.map(MobEffectIdFix::updateMobEffectInstance)));
        return input.replaceField(oldField, newField, newValue);
    }
 
    private static <T> Dynamic<T> updateSuspiciousStewEntry(Dynamic<T> input, Dynamic<T> output) {
        output = updateMobEffectIdField(input, "EffectId", output, "id");
        Optional<Dynamic<T>> duration = input.get("EffectDuration").result();
        return output.replaceField("EffectDuration", "duration", duration);
    }
 
    private static <T> Dynamic<T> updateSuspiciousStewEntry(Dynamic<T> input) {
        return updateSuspiciousStewEntry(input, input);
    }
 
    private Typed<?> updateNamedChoice(Typed<?> input, TypeReference typeReference, String name, Function<Dynamic<?>, Dynamic<?>> function) {
        Type<?> oldType = this.getInputSchema().getChoiceType(typeReference, name);
        Type<?> newType = this.getOutputSchema().getChoiceType(typeReference, name);
        return input.updateTyped(DSL.namedChoice(name, oldType), newType, typedTag -> typedTag.update(DSL.remainderFinder(), function));
    }
 
    private TypeRewriteRule blockEntityFixer() {
        Type<?> blockEntityType = this.getInputSchema().getType(References.BLOCK_ENTITY);
        return this.fixTypeEverywhereTyped(
            "BlockEntityMobEffectIdFix", blockEntityType, input -> this.updateNamedChoice(input, References.BLOCK_ENTITY, "minecraft:beacon", tag -> {
                tag = updateMobEffectIdField(tag, "Primary", "primary_effect");
                return updateMobEffectIdField(tag, "Secondary", "secondary_effect");
            })
        );
    }
 
    private static <T> Dynamic<T> fixMooshroomTag(Dynamic<T> entityTag) {
        Dynamic<T> initialEntry = entityTag.emptyMap();
        Dynamic<T> entry = updateSuspiciousStewEntry(entityTag, initialEntry);
        if (!entry.equals(initialEntry)) {
            entityTag = entityTag.set("stew_effects", entityTag.createList(Stream.of(entry)));
        }
 
        return entityTag.remove("EffectId").remove("EffectDuration");
    }
 
    private static <T> Dynamic<T> fixArrowTag(Dynamic<T> data) {
        return updateMobEffectInstanceList(data, "CustomPotionEffects", "custom_potion_effects");
    }
 
    private static <T> Dynamic<T> fixAreaEffectCloudTag(Dynamic<T> data) {
        return updateMobEffectInstanceList(data, "Effects", "effects");
    }
 
    private static Dynamic<?> updateLivingEntityTag(Dynamic<?> data) {
        return updateMobEffectInstanceList(data, "ActiveEffects", "active_effects");
    }
 
    private TypeRewriteRule entityFixer() {
        Type<?> entityType = this.getInputSchema().getType(References.ENTITY);
        return this.fixTypeEverywhereTyped("EntityMobEffectIdFix", entityType, input -> {
            input = this.updateNamedChoice(input, References.ENTITY, "minecraft:mooshroom", MobEffectIdFix::fixMooshroomTag);
            input = this.updateNamedChoice(input, References.ENTITY, "minecraft:arrow", MobEffectIdFix::fixArrowTag);
            input = this.updateNamedChoice(input, References.ENTITY, "minecraft:area_effect_cloud", MobEffectIdFix::fixAreaEffectCloudTag);
            return input.update(DSL.remainderFinder(), MobEffectIdFix::updateLivingEntityTag);
        });
    }
 
    private TypeRewriteRule playerFixer() {
        Type<?> playerType = this.getInputSchema().getType(References.PLAYER);
        return this.fixTypeEverywhereTyped(
            "PlayerMobEffectIdFix", playerType, input -> input.update(DSL.remainderFinder(), MobEffectIdFix::updateLivingEntityTag)
        );
    }
 
    private static <T> Dynamic<T> fixSuspiciousStewTag(Dynamic<T> tag) {
        Optional<Dynamic<T>> effectsList = tag.get("Effects")
            .asStreamOpt()
            .result()
            .map(list -> tag.createList(list.map(MobEffectIdFix::updateSuspiciousStewEntry)));
        return tag.replaceField("Effects", "effects", effectsList);
    }
 
    private TypeRewriteRule itemStackFixer() {
        OpticFinder<Pair<String, String>> idF = DSL.fieldFinder("id", DSL.named(References.ITEM_NAME.typeName(), NamespacedSchema.namespacedString()));
        Type<?> itemStackType = this.getInputSchema().getType(References.ITEM_STACK);
        OpticFinder<?> tagF = itemStackType.findField("tag");
        return this.fixTypeEverywhereTyped(
            "ItemStackMobEffectIdFix",
            itemStackType,
            input -> {
                Optional<Pair<String, String>> idOpt = input.getOptional(idF);
                if (idOpt.isPresent()) {
                    String id = idOpt.get().getSecond();
                    if (id.equals("minecraft:suspicious_stew")) {
                        return input.updateTyped(tagF, itemTag -> itemTag.update(DSL.remainderFinder(), MobEffectIdFix::fixSuspiciousStewTag));
                    }
 
                    if (MOB_EFFECT_INSTANCE_CARRIER_ITEMS.contains(id)) {
                        return input.updateTyped(
                            tagF,
                            itemTag -> itemTag.update(
                                DSL.remainderFinder(), tag -> updateMobEffectInstanceList(tag, "CustomPotionEffects", "custom_potion_effects")
                            )
                        );
                    }
                }
 
                return input;
            }
        );
    }
 
    @Override
    protected TypeRewriteRule makeRule() {
        return TypeRewriteRule.seq(this.blockEntityFixer(), this.entityFixer(), this.playerFixer(), this.itemStackFixer());
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.make()
  • NamespacedSchema

    • 引用位置: 方法调用
    • 关联成员: NamespacedSchema.namespacedString()
  • ResolvableProfile

    • 引用位置: 参数/返回值