diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftPotionUtilMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftPotionUtilMixin.java new file mode 100644 index 00000000..21983a87 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftPotionUtilMixin.java @@ -0,0 +1,43 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import org.bukkit.craftbukkit.v.potion.CraftPotionUtil; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionType; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = CraftPotionUtil.class, remap = false) +public class CraftPotionUtilMixin { + + @Shadow @Final private static BiMap upgradeable; + @Shadow @Final private static BiMap extendable; + @Shadow @Final @Mutable private static BiMap regular; + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static String fromBukkit(PotionData data) { + String type; + if (data.isUpgraded()) { + type = upgradeable.get(data.getType()); + } else if (data.isExtended()) { + type = extendable.get(data.getType()); + } else { + type = regular.get(data.getType()); + } + + Preconditions.checkNotNull(type, "Unknown potion type from data " + data); + if (type.indexOf(':') != -1) { + return type; + } else { + return "minecraft:" + type; + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index 4238ad08..709536fe 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -22,11 +22,13 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.stats.StatType; import net.minecraft.stats.Stats; import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.decoration.Motive; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.dimension.LevelStem; @@ -43,6 +45,7 @@ import org.bukkit.block.Biome; import org.bukkit.craftbukkit.v.CraftCrashReport; import org.bukkit.craftbukkit.v.CraftStatistic; import org.bukkit.craftbukkit.v.inventory.CraftCreativeCategory; +import org.bukkit.craftbukkit.v.potion.CraftPotionUtil; import org.bukkit.craftbukkit.v.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; @@ -51,6 +54,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; import org.bukkit.inventory.CreativeCategory; import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; import java.lang.reflect.Field; import java.util.ArrayList; @@ -319,6 +323,23 @@ public class BukkitRegistry { } PotionEffectType.stopAcceptingRegistrations(); ArclightMod.LOGGER.info("registry.potion", size - origin); + int typeId = PotionType.values().length; + List newTypes = new ArrayList<>(); + BiMap map = HashBiMap.create(Unsafe.getStatic(CraftPotionUtil.class, "regular")); + putStatic(CraftPotionUtil.class, "regular", map); + for (var potion : ForgeRegistries.POTIONS) { + if (CraftPotionUtil.toBukkit(potion.getRegistryName().toString()).getType() == PotionType.UNCRAFTABLE && potion != Potions.EMPTY) { + String name = ResourceLocationUtil.standardize(potion.getRegistryName()); + MobEffectInstance effectInstance = potion.getEffects().isEmpty() ? null : potion.getEffects().get(0); + PotionType potionType = EnumHelper.makeEnum(PotionType.class, name, typeId++, + Arrays.asList(PotionEffectType.class, boolean.class, boolean.class), + Arrays.asList(effectInstance == null ? null : PotionEffectType.getById(MobEffect.getId(effectInstance.getEffect())), false, false)); + newTypes.add(potionType); + map.put(potionType, potion.getRegistryName().toString()); + ArclightMod.LOGGER.debug("Registered {} as potion type {}", potion.getRegistryName(), potionType); + } + } + EnumHelper.addEnums(PotionType.class, newTypes); } private static void loadMaterials() { diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index f6eb446d..0cc19038 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -30,6 +30,7 @@ "CraftMagicNumbersMixin", "CraftMetaItemMixin", "CraftPlayerMixin", + "CraftPotionUtilMixin", "CraftRegionAccessorMixin", "CraftSchedulerMixin", "CraftServerMixin",