Метод, который активируется, когда я надеваю броню - PullRequest
0 голосов
/ 09 мая 2020

Я делаю мод для Майнкрафт, и прямо сейчас я работаю над созданием чар, которые дают вам особые эффекты зелья. Я работал над зачарованием «Повышение здоровья» и начинал с активации эффекта при каждом обновлении. Когда вы это делаете, при каждом обновлении создается эффект вредной камеры, поэтому я переключался на каждую смену оборудования. Это сработало лучше, но каждый раз, когда у меня было больше, чем лишняя половина сердца, и я переключал / ронял предмет, это снова приводило к повреждению камеры. Я хотел использовать какое-то событие onArmorEquip, но не нашел варианта для него. Я работаю над Eclipse для Minecraft 1.12.2, у кого-нибудь есть предложения? Это мой код:

@SubscribeEvent
public static void enchantTankFunction(LivingEquipmentChangeEvent event)
{
    Object player = event.getEntityLiving();
    if(player instanceof EntityLivingBase)
    {
        EntityLivingBase entityPlayer = (EntityLivingBase)player;
        int levelFeet = EnchantmentHelper.getEnchantmentLevel(ENCHANT_TANK, entityPlayer.getItemStackFromSlot(EntityEquipmentSlot.FEET));
        int levelLegs = EnchantmentHelper.getEnchantmentLevel(ENCHANT_TANK, entityPlayer.getItemStackFromSlot(EntityEquipmentSlot.LEGS));
        int levelChest = EnchantmentHelper.getEnchantmentLevel(ENCHANT_TANK, entityPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST));
        int levelHead = EnchantmentHelper.getEnchantmentLevel(ENCHANT_TANK, entityPlayer.getItemStackFromSlot(EntityEquipmentSlot.HEAD));
        if(!entityPlayer.getEntityWorld().isRemote && (levelFeet > 0 || levelLegs > 0 || levelChest > 0 || levelHead > 0))
        {
            entityPlayer.removePotionEffect(MobEffects.HEALTH_BOOST);
            entityPlayer.addPotionEffect(new PotionEffect(MobEffects.HEALTH_BOOST, (24 * 60 * 60 * 20), (levelFeet) + (levelLegs) + (levelChest) + (levelHead) - 1, false, false));
        }
        else
        {
            entityPlayer.removePotionEffect(MobEffects.HEALTH_BOOST);
        }
    }
}

1 Ответ

0 голосов
/ 10 мая 2020

Вот что бы я сделал. Вы можете узнать, какой слот оборудования был изменен, а затем - предмет, который был изменен. Это не проверено, но что-то похожее на это должно работать.

Это проверяет, является ли сущность игроком и что смена оборудования происходит в слоте для брони (вам, вероятно, понадобится помощь только с этой частью).

@SubscribeEvent
public static void enchantSaturationFunction(LivingEquipmentChangeEvent event)
{
    if (event.getEntityLiving() instanceof EntityPlayer) // Remove this if you want other mobs to get the benefits
    {
        EntityEquipmentSlot slotChanged = event.getSlot();
        if (slotChanged.getSlotIndex() > 0 && slotChanged.getSlotIndex() < 5) // Check out the class EntityEquipmentSlot
        {

А затем, чтобы завершить sh его, он получает ItemStack новой брони и проверяет чары. Я украл код из ItemStack::getTooltip.

            ItemStack previousArmorPiece = event.getFrom();
            ItemStack newArmorPiece = event.getTo();

            NBTTagList nbtTagList = newArmorPiece.getEnchantmentTagList();

            for (int k1 = 0; k1 < nbtTagList.tagCount(); ++k1)
            {
                NBTTagCompound nbttagcompound = nbtTagList.getCompoundTagAt(k1);
                int enchantmentID = nbttagcompound.getShort("id");
                int enchantmentLevel = nbttagcompound.getShort("lvl");
                Enchantment enchantment = Enchantment.getEnchantmentByID(enchantmentID);
                if (enchantment instanceof MY_ENCHANTMENT)
                {
                    // They equipped armor with the necessary enchantment, so do what you want.
                }
            }

        }
    }
}
...