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