Войти или зарегистрироваться

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

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Добрый день, уважаемые форумчане.

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

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

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

Код:
Java:
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;
    }
  }
}

Проблема в том, что мой метод не работает.

Вопрос:
Что мне нужно добавить/убрать чтобы мой метод работал?
Или есть более продуктивное решение моей проблемы?
 
Последнее редактирование:
Я может быть скажу чушь, потому что никогда этим вопросом не задавался, но:
— А у песка разве есть метадата?!?

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

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

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

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

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

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

Код:
Java:
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;
    }
  }
}

Проблема в том, что мой метод не работает.

Вопрос:
Что мне нужно добавить/убрать чтобы мой метод работал?
Или есть более продуктивное решение моей проблемы?
NBT к блоку надо делать
 
Херня какая-то:
Java:
hitBlock.setMetadata("number", new FixedMetadataValue(plugin, +1));
Меняем на:
Java:
hitBlock.setMetadata("number", new FixedMetadataValue(plugin, hitBlock.hasMetadata("number") ? hitBlock.getMetadata("number").get(0).asInt() + 1 : 0));
 
Херня какая-то:
Java:
hitBlock.setMetadata("number", new FixedMetadataValue(plugin, +1));
Меняем на:
Java:
hitBlock.setMetadata("number", new FixedMetadataValue(plugin, hitBlock.hasMetadata("number") ? hitBlock.getMetadata("number").get(0).asInt() + 1 : 0));
Огромное тебе спасибо. Выручил ;)
А я фигнёй страдал, просматривая сурцы PowerNBT =)

Решено. Закрыто.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх