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

Проблемы с TNT

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

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

    Rial Новичок

    Баллы:
    8
    Здравствуйте!
    Помогите, пожалуйста, разобраться.
    Хочу сделать такую последовательность:

    1. Собственный рецепт крафта TNT (с изменённым именем)
    2. Блок с модифицированным metaData, содержащим это имя.
    3. Особенный взрыв, если взорвался TNT с особым именем.

    Как делать рецепты - разобрался.
    При onBlockPlace блока задаю для блока MetaData.
    При onBlockBreak, если есть meta, то "выбрасываю" особенный TNT, примерно так:
    if (<TNT содержит особый meta>)
    event.setCancelled(true);
    block.setType(Material.AIR);
    block.getWorld().dropItemNaturally(block.getLocation(), <TNT с новым именем>);

    Осталась неразрешенная проблема.
    Нужно как-то понять, что подожгли / детонировал блок TNT с особенным metaData и для
    него модифицировать создать особенный TNT entity, со своим радиусом и т.п.
    Или как-то поймать, из какого именно block создался entity при отлове взрыва в onExplosionPrime.
    Или где-то еще. Вот это я не понял. :(

    Заранее спасибо. :)
     
  2. Хостинг MineCraft
    <
  3. GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Тебе легче сделать мод на свой ТНТ=) Это куда проще, чем плагином=)
     
  4. Автор темы
    Rial

    Rial Новичок

    Баллы:
    8
    Моды, затрагивающие клиент я "щупал" и мне они совсем не понравились.
    И мне не обязательно просто. Если есть сложная схема для решения
    этой проблемы в 500 строк кода - я всё равно буду благодарен. :)

    P.S.: этой мой первый плагин для bukkit. И вообще, первый в жизни код на Java.
    Я пока не вижу всей картины. :(
     
  5. kirill2011s

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

    Баллы:
    103

    По моему, у стоящего на земле блока нету metaData. Но, можно отлеживать каждый раз когда ставится блок и сверять его мета дату с нужным и если это тот, то запоминать его, а потом когда блок начинает детанировать, проверять, тот ли это блок.
     
  6. Автор темы
    Rial

    Rial Новичок

    Баллы:
    8
    У стоящего блока есть Metadata (я задаю).
    На случай перезапуска сервера я даже сохраняю данные в файл.

    Проблема в том, что я как раз таки не могу найти нужное событие.
    Есть только ExplosionPrimeEvent - но это не то. Тут уже остается 1 тик
    до взрыва. А мне нужно поймать моменть, когда TNT-entity только появился,
    чтобы узнать, из какого блока он. :(
     
  7. kirill2011s

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

    Баллы:
    103
    Поищи такое событие как спавн падающего блока, я точно не помню как называется, может его и нет, сейчас сам еще по ищу.[DOUBLEPOST=1399546007,1399545755][/DOUBLEPOST]Отдельно такого нет, но можно ловить событие спавна ентити и проверять динамит это или нет.
     
  8. Автор темы
    Rial

    Rial Новичок

    Баллы:
    8
    TNTPrimed не ловится этим событием. :(
     
  9. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Нет.

    На тему реализации:
    Хранение информации - как ты и сказал.
    При ПКМ на блок TNT с зажигалкой в руке - отменяем event, сохраняем дату, убираем блок TNT, спавним наш TNT, запускаем Scheduler на выполнение через время (Сколько динамит шипит) в который передаем нашу Entity динамита и его тип.
    При выполнении Scheduler делает то что тебе надо в tntEntity.getLocation()
    При желании отменяешь обычный взрыв, но с этим думаю проблем не будет.
    Обработать остальные типы активации динамита, я думаю, будет не сложно.
     
  10. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ещё стоит учесть, что активированный динамит исчезнет через 4 секунды(особенность в клиенте), но на сервере он будет существовать.
     
    Hilgert и ql_Nik_lp нравится это.
  11. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Правильно сказано.
    Но при желании можно создать не динамит, а FallingBlock и спавнить из него красивые партиклы, но это уже идеи посыпались ;D
     

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