Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Урон предмета

Тема в разделе "Разработка плагинов для новичков", создана пользователем kompozitor, 8 ноя 2016.

  1. Автор темы
    kompozitor

    kompozitor Ньюби

    Баллы:
    1
    Имя в Minecraft:
    Kompozitor
    Итак. Мне нужно узнать какой урон наносит предмет в ведущей руке при взаимодействии с блоком на лкм.
    Собственно сам процесс взаимодействия уже реализован при помощи interact'a.
    Но интересует механизм получения урона от данного предмета с учетом зачарки. Возможно ли получить без каких-либо костылей, типа записи урона каждого предмета в конфиг? (Пока только такой вариант придумал)
    Или же стоит использовать другой ивент? Или я просто слепой и за несколько часов не нашел нужный метод/ответ...
     
  2. Хостинг MineCraft
    <
  3. _MediaNik_

    _MediaNik_ Активный участник Пользователь

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    EntityDamageEvent?
     
  4. Автор темы
    kompozitor

    kompozitor Ньюби

    Баллы:
    1
    Имя в Minecraft:
    Kompozitor
    Прекрасно работает на мобах. Но при ударе по блоку - ноль реакции.[DOUBLEPOST=1478614797,1478614171][/DOUBLEPOST]Как я уже понял, с ItemStack не возможно вытащить урон. Другое дело может с Player, но тогда возникает вопрос как?
     
  5. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Нужно получить урон, который наносит эта экипировка монстру или блоку?
     
  6. Автор темы
    kompozitor

    kompozitor Ньюби

    Баллы:
    1
    Имя в Minecraft:
    Kompozitor
    Блоку. Именно блоку... в получении урона, наносимого монстру нет ничего сверхъестественного
     
  7. Lilian_solo

    Lilian_solo Новичок Пользователь Заблокирован

    Баллы:
    21
    Имя в Minecraft:
    CoreKolas
    Есть 1 способ, если найду, скину. Проверяем предмет в руке, если алмазный меч, то в переменную число 7 записываем, если зачарование острота, то еще урон, потом переменную в чат например[DOUBLEPOST=1478690329,1478690202][/DOUBLEPOST]А ивент PlayerInteractEvent
     
  8. Автор темы
    kompozitor

    kompozitor Ньюби

    Баллы:
    1
    Имя в Minecraft:
    Kompozitor
    Да, так можно, достаточно простой способ, но... Хотелось бы достать из атрибутов айтема цифру (при наведении на предмет под Lore есть "+7 Attack damage").
    Уже пробовал создать CraftItemStack.asNMSCopy(player.getItemInHand()) и достать Tag, но ничерта не получилось, так как выдает null для всех ванильных предметов.
     
  9. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Там вроде в 1.8, либо в 1.9 добавили Attribute api для LivingEntity. Попробуй через него получать урон игрока, когда у него меч в руке.[DOUBLEPOST=1478717107,1478716978][/DOUBLEPOST]https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/Attribute.html

    Гдето на Spigotmc вроде есть плагин от md5, который показывает как использовать это.
     
  10. Автор темы
    kompozitor

    kompozitor Ньюби

    Баллы:
    1
    Имя в Minecraft:
    Kompozitor
    В 1.8 нет, сейчас попробую в 1.9 и отпишусь[DOUBLEPOST=1478718174,1478717110][/DOUBLEPOST]
    Уже разбираюсь. Закину код, как только закончу. Большое спасибо
     
  11. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Ещё раз задам вопрос:
    Нужно получить урон, который наносит эта экипировка монстру или блоку?
    "+7 Attack damage" -- это урон монстру и ничего общего с уроном по блоку не имеет.
    Урон блоку зависит от блока и инструмента, выражается дробным числом, вытащить весьма проблемотично, но реально.
    Урон монстру зависит от базовых атрибутов предмета, дополнительных атрибутов носимых вещей и предмета, зачарования предмета, крита, брони монстра.
    Так какой из уронов вам нужен?
     
  12. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    По-моему урон это ошибочное название. Из предмета вроде берется только его скорость "копания" для вычисления прочности блока с тем или иным предметом перед игроком.

    Код:
    // Из MCP: EntityPlayer.java
        public float getDigSpeed(IBlockState state)
        {
            float f = this.inventory.getStrVsBlock(state);
    
            if (f > 1.0F)
            {
                int i = EnchantmentHelper.getEfficiencyModifier(this);
                ItemStack itemstack = this.getHeldItemMainhand();
    
                if (i > 0 && itemstack != null)
                {
                    f += (float)(i * i + 1);
                }
            }
    
            if (this.isPotionActive(MobEffects.HASTE))
            {
                f *= 1.0F + (float)(this.getActivePotionEffect(MobEffects.HASTE).getAmplifier() + 1) * 0.2F;
            }
    
            if (this.isPotionActive(MobEffects.MINING_FATIGUE))
            {
                float f1;
    
                switch (this.getActivePotionEffect(MobEffects.MINING_FATIGUE).getAmplifier())
                {
                    case 0:
                        f1 = 0.3F;
                        break;
    
                    case 1:
                        f1 = 0.09F;
                        break;
    
                    case 2:
                        f1 = 0.0027F;
                        break;
    
                    case 3:
                    default:
                        f1 = 8.1E-4F;
                }
    
                f *= f1;
            }
    
            if (this.isInsideOfMaterial(Material.WATER) && !EnchantmentHelper.getAquaAffinityModifier(this))
            {
                f /= 5.0F;
            }
    
            if (!this.onGround)
            {
                f /= 5.0F;
            }
    
            return f;
        }
    Код:
    // Из MCP: Block.java
        @Deprecated
    
        /**
         * Get the hardness of this Block relative to the ability of the given player
         */
        public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos)
        {
            float f = state.getBlockHardness(worldIn, pos);
            return f < 0.0F ? 0.0F : (!player.canHarvestBlock(state) ? player.getDigSpeed(state) / f / 100.0F : player.getDigSpeed(state) / f / 30.0F);
        }
     

Поделиться этой страницей