Создайте желтое не мерцающее зелье

В моде Minecraft Forge я хочу создать часть, которая выглядит желтой и не мерцает (как желтая версия зелья "Бутылка с водой").

В настоящее время я делаю что-то вроде этого (нерелевантные биты опущены):

@Mod(modid=modId, name="Lemonade Mod", version="1.0")
public class LemonadeMod {
    ...
    private static final Potion POTION_LEMONADE = new PotionHealth(false, 0xFF_FF_FF_55);
    private static final PotionType POTION_TYPE_LEMONADE = new PotionType("lemonade", new PotionEffect(POTION_LEMONADE));
    ...    
    @Mod.EventBusSubscriber
    public static class RegistrationHandler {    
        @SubscribeEvent
        public static void registerPotionTypes(RegistryEvent.Register<PotionType> event) {
            event.getRegistry().register(POTION_TYPE_LEMONADE.setRegistryName("lemonade"));
        }
    }
}

Это создает желтое зелье, но оно мерцает. Есть ли способ убрать мерцающий эффект?

2 ответа

Решение

Основываясь на ответах из сообщения на форуме Minecraft Forge, этот класс определяет Предмет, который при щелчке правой кнопкой мыши ведет себя как зелье:

import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import javax.annotation.Nullable;
import java.util.List;

public class ItemLemonade extends Item {

    /**
     * This method needs to be overridden because otherwise the duration is too short,
     * the potion consumption won't animate correctly, and there won't be any sound
     */
    @Override
    public int getMaxItemUseDuration(ItemStack stack)
    {
        return 32;
    }

    @Override
    public EnumAction getItemUseAction(ItemStack stack) {
        return EnumAction.DRINK;
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
        playerIn.setActiveHand(handIn);
        return new ActionResult<>(EnumActionResult.SUCCESS, playerIn.getHeldItem(handIn));
    }

    @SideOnly(Side.CLIENT)
    @Override
    public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
        tooltip.add("Delicious, refreshing lemonade");
    }
}

Вместо того, чтобы использовать системы ванили для приготовления зелий:

Diesieben07 сказал:
PotionType это зелье, которое можно заваривать, Potion это просто "тип эффекта".

Используя информацию из этого потока, просто создайте нормальный класс элементов и переопределите этот метод, например так:

@Override
public EnumAction getItemUseAction(ItemStack stack)
{
    return EnumAction.DRINK;
}

Это касается мерцания, как ItemPotion Переопределение public boolean hasEffect(ItemStack stack) возвращать истину, когда зелье имеет какие-либо эффекты (а вы этого не хотите).

Тогда все, что вам нужно сделать, это дать PotionEffect игроку, когда они пьют ваш предмет путем переопределения onItemUseFinish, Вы можете посмотреть на ItemPotion для примера того, как это сделать (хотя будут большие разделы кода, которые вам не понадобятся).

Другие вопросы по тегам