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);
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.writeAndReadTypedOrThrow()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ExtraDataFixUtils.dyeColorIdToName()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
NamespacedSchema.namespacedString()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置: