minecraft-src/net/minecraft/util/datafix/fixes/ItemPotionFix.java
2025-07-04 01:41:11 +03:00

195 lines
7.5 KiB
Java

package net.minecraft.util.datafix.fixes;
import com.mojang.datafixers.DSL;
import com.mojang.datafixers.DataFix;
import com.mojang.datafixers.DataFixUtils;
import com.mojang.datafixers.OpticFinder;
import com.mojang.datafixers.TypeRewriteRule;
import com.mojang.datafixers.Typed;
import com.mojang.datafixers.schemas.Schema;
import com.mojang.datafixers.types.Type;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Dynamic;
import java.util.Objects;
import java.util.Optional;
import net.minecraft.util.datafix.schemas.NamespacedSchema;
public class ItemPotionFix extends DataFix {
private static final int SPLASH = 16384;
private static final String[] POTIONS = DataFixUtils.make(new String[128], strings -> {
strings[0] = "minecraft:water";
strings[1] = "minecraft:regeneration";
strings[2] = "minecraft:swiftness";
strings[3] = "minecraft:fire_resistance";
strings[4] = "minecraft:poison";
strings[5] = "minecraft:healing";
strings[6] = "minecraft:night_vision";
strings[7] = null;
strings[8] = "minecraft:weakness";
strings[9] = "minecraft:strength";
strings[10] = "minecraft:slowness";
strings[11] = "minecraft:leaping";
strings[12] = "minecraft:harming";
strings[13] = "minecraft:water_breathing";
strings[14] = "minecraft:invisibility";
strings[15] = null;
strings[16] = "minecraft:awkward";
strings[17] = "minecraft:regeneration";
strings[18] = "minecraft:swiftness";
strings[19] = "minecraft:fire_resistance";
strings[20] = "minecraft:poison";
strings[21] = "minecraft:healing";
strings[22] = "minecraft:night_vision";
strings[23] = null;
strings[24] = "minecraft:weakness";
strings[25] = "minecraft:strength";
strings[26] = "minecraft:slowness";
strings[27] = "minecraft:leaping";
strings[28] = "minecraft:harming";
strings[29] = "minecraft:water_breathing";
strings[30] = "minecraft:invisibility";
strings[31] = null;
strings[32] = "minecraft:thick";
strings[33] = "minecraft:strong_regeneration";
strings[34] = "minecraft:strong_swiftness";
strings[35] = "minecraft:fire_resistance";
strings[36] = "minecraft:strong_poison";
strings[37] = "minecraft:strong_healing";
strings[38] = "minecraft:night_vision";
strings[39] = null;
strings[40] = "minecraft:weakness";
strings[41] = "minecraft:strong_strength";
strings[42] = "minecraft:slowness";
strings[43] = "minecraft:strong_leaping";
strings[44] = "minecraft:strong_harming";
strings[45] = "minecraft:water_breathing";
strings[46] = "minecraft:invisibility";
strings[47] = null;
strings[48] = null;
strings[49] = "minecraft:strong_regeneration";
strings[50] = "minecraft:strong_swiftness";
strings[51] = "minecraft:fire_resistance";
strings[52] = "minecraft:strong_poison";
strings[53] = "minecraft:strong_healing";
strings[54] = "minecraft:night_vision";
strings[55] = null;
strings[56] = "minecraft:weakness";
strings[57] = "minecraft:strong_strength";
strings[58] = "minecraft:slowness";
strings[59] = "minecraft:strong_leaping";
strings[60] = "minecraft:strong_harming";
strings[61] = "minecraft:water_breathing";
strings[62] = "minecraft:invisibility";
strings[63] = null;
strings[64] = "minecraft:mundane";
strings[65] = "minecraft:long_regeneration";
strings[66] = "minecraft:long_swiftness";
strings[67] = "minecraft:long_fire_resistance";
strings[68] = "minecraft:long_poison";
strings[69] = "minecraft:healing";
strings[70] = "minecraft:long_night_vision";
strings[71] = null;
strings[72] = "minecraft:long_weakness";
strings[73] = "minecraft:long_strength";
strings[74] = "minecraft:long_slowness";
strings[75] = "minecraft:long_leaping";
strings[76] = "minecraft:harming";
strings[77] = "minecraft:long_water_breathing";
strings[78] = "minecraft:long_invisibility";
strings[79] = null;
strings[80] = "minecraft:awkward";
strings[81] = "minecraft:long_regeneration";
strings[82] = "minecraft:long_swiftness";
strings[83] = "minecraft:long_fire_resistance";
strings[84] = "minecraft:long_poison";
strings[85] = "minecraft:healing";
strings[86] = "minecraft:long_night_vision";
strings[87] = null;
strings[88] = "minecraft:long_weakness";
strings[89] = "minecraft:long_strength";
strings[90] = "minecraft:long_slowness";
strings[91] = "minecraft:long_leaping";
strings[92] = "minecraft:harming";
strings[93] = "minecraft:long_water_breathing";
strings[94] = "minecraft:long_invisibility";
strings[95] = null;
strings[96] = "minecraft:thick";
strings[97] = "minecraft:regeneration";
strings[98] = "minecraft:swiftness";
strings[99] = "minecraft:long_fire_resistance";
strings[100] = "minecraft:poison";
strings[101] = "minecraft:strong_healing";
strings[102] = "minecraft:long_night_vision";
strings[103] = null;
strings[104] = "minecraft:long_weakness";
strings[105] = "minecraft:strength";
strings[106] = "minecraft:long_slowness";
strings[107] = "minecraft:leaping";
strings[108] = "minecraft:strong_harming";
strings[109] = "minecraft:long_water_breathing";
strings[110] = "minecraft:long_invisibility";
strings[111] = null;
strings[112] = null;
strings[113] = "minecraft:regeneration";
strings[114] = "minecraft:swiftness";
strings[115] = "minecraft:long_fire_resistance";
strings[116] = "minecraft:poison";
strings[117] = "minecraft:strong_healing";
strings[118] = "minecraft:long_night_vision";
strings[119] = null;
strings[120] = "minecraft:long_weakness";
strings[121] = "minecraft:strength";
strings[122] = "minecraft:long_slowness";
strings[123] = "minecraft:leaping";
strings[124] = "minecraft:strong_harming";
strings[125] = "minecraft:long_water_breathing";
strings[126] = "minecraft:long_invisibility";
strings[127] = null;
});
public static final String DEFAULT = "minecraft:water";
public ItemPotionFix(Schema outputSchema, boolean changesType) {
super(outputSchema, changesType);
}
@Override
public TypeRewriteRule makeRule() {
Type<?> type = this.getInputSchema().getType(References.ITEM_STACK);
OpticFinder<Pair<String, String>> opticFinder = DSL.fieldFinder("id", DSL.named(References.ITEM_NAME.typeName(), NamespacedSchema.namespacedString()));
OpticFinder<?> opticFinder2 = type.findField("tag");
return this.fixTypeEverywhereTyped(
"ItemPotionFix",
type,
typed -> {
Optional<Pair<String, String>> optional = typed.getOptional(opticFinder);
if (optional.isPresent() && Objects.equals(((Pair)optional.get()).getSecond(), "minecraft:potion")) {
Dynamic<?> dynamic = typed.get(DSL.remainderFinder());
Optional<? extends Typed<?>> optional2 = typed.getOptionalTyped(opticFinder2);
short s = dynamic.get("Damage").asShort((short)0);
if (optional2.isPresent()) {
Typed<?> typed2 = typed;
Dynamic<?> dynamic2 = ((Typed)optional2.get()).get(DSL.remainderFinder());
Optional<String> optional3 = dynamic2.get("Potion").asString().result();
if (optional3.isEmpty()) {
String string = POTIONS[s & 127];
Typed<?> typed3 = ((Typed)optional2.get())
.set(DSL.remainderFinder(), dynamic2.set("Potion", dynamic2.createString(string == null ? "minecraft:water" : string)));
typed2 = typed.set(opticFinder2, typed3);
if ((s & 16384) == 16384) {
typed2 = typed2.set(opticFinder, Pair.of(References.ITEM_NAME.typeName(), "minecraft:splash_potion"));
}
}
if (s != 0) {
dynamic = dynamic.set("Damage", dynamic.createShort((short)0));
}
return typed2.set(DSL.remainderFinder(), dynamic);
}
}
return typed;
}
);
}
}