Проблемы с TNT

  • Автор темы Автор темы 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.
Или где-то еще. Вот это я не понял. :(

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

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

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


По моему, у стоящего на земле блока нету metaData. Но, можно отлеживать каждый раз когда ставится блок и сверять его мета дату с нужным и если это тот, то запоминать его, а потом когда блок начинает детанировать, проверять, тот ли это блок.
 
По моему, у стоящего на земле блока нету metaData. Но, можно отлеживать каждый раз когда ставится блок и сверять его мета дату с нужным и если это тот, то запоминать его, а потом когда блок начинает детанировать, проверять, тот ли это блок.
У стоящего блока есть Metadata (я задаю).
На случай перезапуска сервера я даже сохраняю данные в файл.

Проблема в том, что я как раз таки не могу найти нужное событие.
Есть только ExplosionPrimeEvent - но это не то. Тут уже остается 1 тик
до взрыва. А мне нужно поймать моменть, когда TNT-entity только появился,
чтобы узнать, из какого блока он. :(
 
У стоящего блока есть Metadata (я задаю).
На случай перезапуска сервера я даже сохраняю данные в файл.

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

Поищи такое событие как спавн падающего блока, я точно не помню как называется, может его и нет, сейчас сам еще по ищу.
Отдельно такого нет, но можно ловить событие спавна ентити и проверять динамит это или нет.
 
Поищи такое событие как спавн падающего блока, я точно не помню как называется, может его и нет, сейчас сам еще по ищу.
Отдельно такого нет, но можно ловить событие спавна ентити и проверять динамит это или нет.
TNTPrimed не ловится этим событием. :(
 
Тебе легче сделать мод на свой ТНТ=) Это куда проще, чем плагином=)
Нет.

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

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