Добавление нескольких зелий с одним эффектом, но разными параметрами

Версия Minecraft
1.7.10
API
Forge
Всем привет!
Прямо сейчас создаю мод, который добавит в игру все неиспользуемые эффекты в виде зелий. Сделал класс ItemPotion2, в основном копию ItemPotion.
Добился того, что смог добавить зелья всех возможных эффектов (включая те, что уже есть) и дать им нужный цвет. Меня интересует следующее:
как в оригинальном майнкрафте реализовано, что у зелья силы, например, 3 аналога разного времени и силы действия, у зелья скорости тоже 3 и всё в таком духе. Где это хранится и как настраивается? У меня у самого есть идея создать список из PotionEffect, но прежде, чем делать это, хочу узнать, есть ли способ оптимальнее этого.

Если кому-то понадобится, вот код ItemPotion2. PotionType это просто enum с двумя полями: Drinkable и Splash
ItemPotion2:
public class ItemPotion2 extends ItemFood
{
    @SideOnly(Side.CLIENT)
    private static IIcon
                  potionBottleDrinkable,
                  potionBottleSplash,
                  potionOverlay;


    private PotionType potionType;
    public ItemPotion2(PotionType potionType)
    {
        super(0, 0F, false);
        setUnlocalizedName("potion");
        setMaxStackSize(1);
        setMaxDamage(0);
        setAlwaysEdible();
        setHasSubtypes(true);
        setCreativeTab(CreativeTabs.tabBrewing);

        this.potionType = potionType;
    }

    @Override
    public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
    {
        --stack.stackSize;

        if (!player.capabilities.isCreativeMode)
        {
            if (stack.stackSize <= 0)
            {
                return new ItemStack(Items.glass_bottle);
            }

            player.inventory.addItemStackToInventory(new ItemStack(Items.glass_bottle));
        }


        //player.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 100));
        return stack;
    }

    @Override
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
        if (potionType == PotionType.DRINKABLE)
        {
            player.setItemInUse(stack, getMaxItemUseDuration(stack));
            return stack;
        }
        else if(potionType == PotionType.SPLASH)
        {
            return stack;
        }
        return stack;
    }

    public int getMaxItemUseDuration(ItemStack p_77626_1_)
    {
        return 32;
    }

    public EnumAction getItemUseAction(ItemStack p_77661_1_)
    {
        return EnumAction.drink;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public boolean requiresMultipleRenderPasses() {
        return true;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public IIcon getIconFromDamageForRenderPass(int meta, int renderPass) {
        return renderPass == 0 ? potionOverlay : super.getIconFromDamageForRenderPass(meta, renderPass);
    }

    @SideOnly(Side.CLIENT)
    public IIcon getIconFromDamage(int damage)
    {
        return getIconFromPotionType(potionType);
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerIcons(IIconRegister register) {
        super.registerIcons(register);
        potionOverlay = register.registerIcon("minecraft:potion_overlay");
        potionBottleDrinkable = register.registerIcon("minecraft:potion_bottle_drinkable");
        potionBottleSplash = register.registerIcon("minecraft:potion_bottle_splash");
    }

    @Override
    @SideOnly(Side.CLIENT)
    public int getColorFromItemStack(ItemStack stack, int renderPass) {
        return renderPass > 0 ? 0xFFFFFF : getColorFromDamage(stack.getItemDamage());
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void getSubItems(Item item, CreativeTabs tab, List items) {
        for (int damage = 0, size = Potion.potionTypes.length; damage < size; damage++) {
            if(Potion.potionTypes[damage] != null)
                items.add(new ItemStack(item, 1, damage));
        }
    }

    @SideOnly(Side.CLIENT)
    public int getColorFromDamage(int damage)
    {
        //Potion potion = Potion.potionTypes[damage];
        //return potion != null? potion.getLiquidColor() : 0xFFFFFF;
        return Potion.potionTypes[damage].getLiquidColor();
    }

    @Override
    public boolean hasEffect(ItemStack par1ItemStack, int pass) {
        return true;
    }

    @SideOnly(Side.CLIENT)
    public IIcon getIconFromPotionType(PotionType type)
    {
        switch (type)
        {
            case DRINKABLE:
                return potionBottleDrinkable;
            case SPLASH:
                return potionBottleSplash;
        }
        return null;
    }
}
 

TheAndrey

Редактор учебника
1,067
71
372
В майне всё поддерживает из коробки, даже не нужен отдельный мод. NBT-тегом CustomPotionEffects можно какие-хочешь эффекты зелью прописать.
 
Сверху