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

[Решено] .setMetadata()

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

Статус темы:
Закрыта.
  1. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Добрый день, уважаемые форумчане.

    Пишу свой плагин и натолкнулся на непростую ситуацию.

    Цель: после 5 попаданий стрелой по блоку - ломать его.
    (breakNaturally)

    Для решения этой задачи я решил использовать setMetadata для блоков по которым попал.

    Код:
    Код:
    public void onHit(ProjectileHitEvent event)
    {
        Projectile projectile = event.getEntity();
        Player player = (Player) projectile.getShooter();
    
      /*Собственно, тут метод, возвращающий блок, по которому попала стрела. Возвращает - hitBlock.
       */Дальше имею:
    
        if (projectile instanceof Arrow && hitBlock.getType == Material.SANDSTONE)
        {
            hitBlock.setMetadata("number", new FixedMetadataValue(plugin, +1));
        }
        if (projectile instanceof Arrow && hitBlock.getMetadata("number").get(0).asInt() > 5)
        {
            hitBlock.breakNaturally;
        }
      }
    }
    
    Проблема в том, что мой метод не работает.

    Вопрос:
    Что мне нужно добавить/убрать чтобы мой метод работал?
    Или есть более продуктивное решение моей проблемы?
     
    Последнее редактирование: 30 мар 2016
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я может быть скажу чушь, потому что никогда этим вопросом не задавался, но:
    — А у песка разве есть метадата?!?

    Как вариант, можно держать в памяти HashMap блоков, по которым попал (в качестве ключа либо сам блок, либо его Location), где значением хранить число попаданий.
    Ну и не сохранять его никуда, при рестарте терять.
    Попала стрела? += 1 к попаданиям, если >= 5, убрать из карты и breakNaturally().

    Но если у тебя сервер где принципиально много стреляют из стрел, и рестартится он очень-очень редко, то будет подкушивать память. Могу предложить раз в N часов эту карту .clear(), тут погрешность в геймплее никакая.
     
  4. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Ну, как бы там не песок, а песчаник)
    И метадату я ему сам выставляю. Как я понял, я не могу прибавлять числа к метадате. Тоесть, если вместо "+1" поставить "6" - то блок сломается сразу после попадания по нему стрелой.
    На счёт HashMap - продуктивно? Боюсь, это очень скажется на оперативной памяти.
     
  5. GoldenApple

    GoldenApple Ньюби Пользователь

    Баллы:
    1
    Имя в Minecraft:
    o_0_Gold
    Могу я поинтересоваться какой метод мне это сейчас пригодится
     
  6. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Нет - litecraft. За твинки, кстати, бан выдают.
     
  7. GoldenApple

    GoldenApple Ньюби Пользователь

    Баллы:
    1
    Имя в Minecraft:
    o_0_Gold
    Ты что-то перепутал.
     
  8. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Не устраивай концерт в моей теме, я тебя умоляю. Вопрос в шапке, если не знаешь ответа - не пиши.
     
  9. Lite-craft

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

    Баллы:
    46
    Имя в Minecraft:
    shiroihana
    А как в моих темах то можно а?
     
  10. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Я попросил, как-никак.
     
  11. Sonicxd2

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

    Баллы:
    76
    NBT к блоку надо делать
     
  12. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Интересно. Можно наводку, куда мне нужно копать?
     
  13. Sonicxd2

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

    Баллы:
    76
    В плагине PowerNBT оно реализовано можно подсмотреть.
     
  14. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Спасибо.
     
  15. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Херня какая-то:
    Код:
    hitBlock.setMetadata("number", new FixedMetadataValue(plugin, +1));
    Меняем на:
    Код:
    hitBlock.setMetadata("number", new FixedMetadataValue(plugin, hitBlock.hasMetadata("number") ? hitBlock.getMetadata("number").get(0).asInt() + 1 : 0));
     
  16. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Огромное тебе спасибо. Выручил ;)
    А я фигнёй страдал, просматривая сурцы PowerNBT =)

    Решено. Закрыто.
     
    Последнее редактирование: 24 апр 2016
Статус темы:
Закрыта.

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