EntitySpawnerItemVariantComponentFix.java

net.minecraft.util.datafix.fixes.EntitySpawnerItemVariantComponentFix

信息

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

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.util.datafix.fixes.EntitySpawnerItemVariantComponentFix.Fixer
    • 类型: interface
    • 修饰符: private
    • 源码定位: L135
    • 说明:

      TODO

构造器

public EntitySpawnerItemVariantComponentFix(Schema outputSchema) @ L19

  • 构造器名:EntitySpawnerItemVariantComponentFix
  • 源码定位:L19
  • 修饰符:public

参数:

  • outputSchema: Schema

说明:

TODO

方法

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

public final TypeRewriteRule makeRule() @ L23

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

参数:

说明:

TODO

private static String getBaseColor(int packedVariant) @ L48

  • 方法名:getBaseColor
  • 源码定位:L48
  • 返回类型:String
  • 修饰符:private static

参数:

  • packedVariant: int

说明:

TODO

private static String getPatternColor(int packedVariant) @ L52

  • 方法名:getPatternColor
  • 源码定位:L52
  • 返回类型:String
  • 修饰符:private static

参数:

  • packedVariant: int

说明:

TODO

private static String getPattern(int packedVariant) @ L56

  • 方法名:getPattern
  • 源码定位:L56
  • 返回类型:String
  • 修饰符:private static

参数:

  • packedVariant: int

说明:

TODO

private static <T> Dynamic<T> fixTropicalFishBucket(Dynamic<T> remainder, Dynamic<T> bucketData) @ L73

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

参数:

  • remainder: Dynamic
  • bucketData: Dynamic

说明:

TODO

private static <T> Dynamic<T> fixAxolotlBucket(Dynamic<T> remainder, Dynamic<T> bucketData) @ L89

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

参数:

  • remainder: Dynamic
  • bucketData: Dynamic

说明:

TODO

private static <T> Dynamic<T> fixSalmonBucket(Dynamic<T> remainder, Dynamic<T> bucketData) @ L106

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

参数:

  • remainder: Dynamic
  • bucketData: Dynamic

说明:

TODO

private static <T> Dynamic<T> fixPainting(Dynamic<T> components) @ L111

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

参数:

  • components: Dynamic

说明:

TODO

代码

public class EntitySpawnerItemVariantComponentFix extends DataFix {
    public EntitySpawnerItemVariantComponentFix(Schema outputSchema) {
        super(outputSchema, false);
    }
 
    @Override
    public final TypeRewriteRule makeRule() {
        Type<?> itemStackType = this.getInputSchema().getType(References.ITEM_STACK);
        OpticFinder<Pair<String, String>> idFinder = DSL.fieldFinder("id", DSL.named(References.ITEM_NAME.typeName(), NamespacedSchema.namespacedString()));
        OpticFinder<?> componentsFinder = itemStackType.findField("components");
        return this.fixTypeEverywhereTyped(
            "ItemStack bucket_entity_data variants to separate components",
            itemStackType,
            input -> {
                String id = input.getOptional(idFinder).map(Pair::getSecond).orElse("");
 
                return switch (id) {
                    case "minecraft:salmon_bucket" -> input.updateTyped(componentsFinder, (Fixer)EntitySpawnerItemVariantComponentFix::fixSalmonBucket);
                    case "minecraft:axolotl_bucket" -> input.updateTyped(componentsFinder, (Fixer)EntitySpawnerItemVariantComponentFix::fixAxolotlBucket);
                    case "minecraft:tropical_fish_bucket" -> input.updateTyped(componentsFinder, (Fixer)EntitySpawnerItemVariantComponentFix::fixTropicalFishBucket);
                    case "minecraft:painting" -> input.updateTyped(
                        componentsFinder,
                        components -> Util.writeAndReadTypedOrThrow(components, components.getType(), EntitySpawnerItemVariantComponentFix::fixPainting)
                    );
                    default -> input;
                };
            }
        );
    }
 
    private static String getBaseColor(int packedVariant) {
        return ExtraDataFixUtils.dyeColorIdToName(packedVariant >> 16 & 0xFF);
    }
 
    private static String getPatternColor(int packedVariant) {
        return ExtraDataFixUtils.dyeColorIdToName(packedVariant >> 24 & 0xFF);
    }
 
    private static String getPattern(int packedVariant) {
        return switch (packedVariant & 65535) {
            case 1 -> "flopper";
            case 256 -> "sunstreak";
            case 257 -> "stripey";
            case 512 -> "snooper";
            case 513 -> "glitter";
            case 768 -> "dasher";
            case 769 -> "blockfish";
            case 1024 -> "brinely";
            case 1025 -> "betty";
            case 1280 -> "spotty";
            case 1281 -> "clayfish";
            default -> "kob";
        };
    }
 
    private static <T> Dynamic<T> fixTropicalFishBucket(Dynamic<T> remainder, Dynamic<T> bucketData) {
        Optional<Number> oldVariant = bucketData.get("BucketVariantTag").asNumber().result();
        if (oldVariant.isEmpty()) {
            return remainder;
        } else {
            int packedVariant = oldVariant.get().intValue();
            String pattern = getPattern(packedVariant);
            String baseColor = getBaseColor(packedVariant);
            String patternColor = getPatternColor(packedVariant);
            return remainder.update("minecraft:bucket_entity_data", b -> b.remove("BucketVariantTag"))
                .set("minecraft:tropical_fish/pattern", remainder.createString(pattern))
                .set("minecraft:tropical_fish/base_color", remainder.createString(baseColor))
                .set("minecraft:tropical_fish/pattern_color", remainder.createString(patternColor));
        }
    }
 
    private static <T> Dynamic<T> fixAxolotlBucket(Dynamic<T> remainder, Dynamic<T> bucketData) {
        Optional<Number> oldVariant = bucketData.get("Variant").asNumber().result();
        if (oldVariant.isEmpty()) {
            return remainder;
        } else {
            String newVariant = switch (oldVariant.get().intValue()) {
                case 1 -> "wild";
                case 2 -> "gold";
                case 3 -> "cyan";
                case 4 -> "blue";
                default -> "lucy";
            };
            return remainder.update("minecraft:bucket_entity_data", b -> b.remove("Variant"))
                .set("minecraft:axolotl/variant", remainder.createString(newVariant));
        }
    }
 
    private static <T> Dynamic<T> fixSalmonBucket(Dynamic<T> remainder, Dynamic<T> bucketData) {
        Optional<Dynamic<T>> type = bucketData.get("type").result();
        return type.isEmpty() ? remainder : remainder.update("minecraft:bucket_entity_data", b -> b.remove("type")).set("minecraft:salmon/size", type.get());
    }
 
    private static <T> Dynamic<T> fixPainting(Dynamic<T> components) {
        Optional<Dynamic<T>> entityData = components.get("minecraft:entity_data").result();
        if (entityData.isEmpty()) {
            return components;
        } else if (entityData.get().get("id").asString().result().filter(id -> id.equals("minecraft:painting")).isEmpty()) {
            return components;
        } else {
            Optional<Dynamic<T>> result = entityData.get().get("variant").result();
            Dynamic<T> entityDataRemainder = entityData.get().remove("variant");
            if (entityDataRemainder.remove("id").equals(entityDataRemainder.emptyMap())) {
                components = components.remove("minecraft:entity_data");
            } else {
                components = components.set("minecraft:entity_data", entityDataRemainder);
            }
 
            if (result.isPresent()) {
                components = components.set("minecraft:painting/variant", result.get());
            }
 
            return components;
        }
    }
 
    @FunctionalInterface
    private interface Fixer extends Function<Typed<?>, Typed<?>> {
        default Typed<?> apply(Typed<?> components) {
            return components.update(DSL.remainderFinder(), this::fixRemainder);
        }
 
        default <T> Dynamic<T> fixRemainder(Dynamic<T> remainder) {
            return remainder.get("minecraft:bucket_entity_data")
                .result()
                .map(bucketData -> this.fixRemainder(remainder, (Dynamic<T>)bucketData))
                .orElse(remainder);
        }
 
        <T> Dynamic<T> fixRemainder(Dynamic<T> remainder, Dynamic<T> bucketData);
    }
}

引用的其他类

  • Schema

    • 引用位置: 参数
  • Util

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

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

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

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