Рендер текста на определённое время

Версия Minecraft
1.7.10

Sainthozier

Стрелочник
623
11
369
Всем привет.

Пытаюсь отрендерить текст при нанесении дамага мобу. В ивенте LivingAttackEntity отсылаю пакет с нужной мне инфой, в хендлере сетаю значения static переменных класса рендера на значения из пакета. С этим проблем нет, но проблема возникла в таймере. Я хочу отрендерить текст с полученной инфой, например, на 3 секунды. Создал boolean переменную isDraw, обернул весь рендер в if(isDraw), в том же классе рендера, но в ивенте PlayerTickEvent чекаю, что event.player.ticksExisted % 60 == 0 и сетаю переменную isDraw на false.

Происходит следующее:
1) бью моба, отсылается пакет, isDraw сетится на true, рендерится текст;
2) через секунду бью моба ещё раз, отсылается пакет, но isDraw уже true, а таймер тикает, собственно второй текст рендерится уже не 3 секунды, а оставшиеся 2.

Делал в 4 утра, но уже сейчас понял, что у меня неправильная логика. Как лучше поступить в моём случае? Я нашёл несколько примеров, но это не то, в них полученная инфа добавляется в лист и всё рендерится по очереди, а я хочу рендерить на 3 секунды всегда новую инфу.

P.S. Рендерю текст в ивенте RenderGameOverlayEvent.Post. Код могу скинуть позже, сейчас нет доступа к ide. Но я вроде бы понятно всё расписал )
 
3,005
192
592
Время в таймере изменяй на 3 секунды, т.е. сбрасывай время таймера.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
В ивенте LivingAttackEntity
Лучше это делать в LivingHurtEvent и указать самый низкий приоритет, ибо LivingAttackEntity вызывается когда игрок пытается нанести урон по энтити, но не факт что он пройдет.
Как сказали выше, тебе нужно завести интовую переменную с таймером, в пакете приравнивать к нужному времени, в апдейте его уменьшать, а в рендере проверять что timer > 0.
 

Sainthozier

Стрелочник
623
11
369
Да-да, ребят, спасибо, уже понял )
У меня изначально так и было, только я не каждый тик уменьшал таймер, а сходу сетал на 0 при event.player.ticksExisted % 60 == 0. Сейчас поменял, всё работает, как и должно )

Лучше это делать в LivingHurtEvent
Разве этот ивент не срабатывает до нанесения урона? Моя задача заключается именно в том, чтобы отрендерить текст при нанесении урона, т.е. если я ударю моба и по каким-то причинам урон не пройдёт, то мне и рендерить нечего )

P.S. Есть ещё какой-то AttackEntityEvent, но я о нём ничего не знаю вообще. Судя по исходникам, срабатывает при нанесении урона, экипировав при этом какой-нибудь предмет.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Разве этот ивент не срабатывает до нанесения урона?
Он срабатывает как раз в момент нанесения урона.
Можешь проверить, выводить в чат что-то в LivingAttackEvent и увидишь что если тупо закликивать, то в чат будет выводиться постоянно сообщение, но урон наноситься только раз в 10 тиков.
 

Sainthozier

Стрелочник
623
11
369
если тупо закликивать, то в чат будет выводиться постоянно сообщение, но урон наноситься только раз в 10 тиков
Да, действительно. Спасибо, поменял на LivingHurtEvent )
 
Сверху