Ситуация такая, есть пассивка которая по умолчанию у юнита. (не учится)
Пассивка переодически по умолчанию раз в 5 секунд ресает герою здоровье в размере 50% от силы.
Периодичность отхила зависит от текущего здоровья. Если хп фул то таймер 5 секунд. каждые 10% потеряного хп уменьшает таймер на 0.5 сек.
Всё бы легко, но как сделать красиво это на jass я чё то запутался. Допустим если этого юнита нет на карте что бы таймер просто так не тикал. Естественно mui нужно, без всякого мусора короче. Тут кода по сути должно быть образно 10 строчек, но я реально чё то завис. Может кто накидать как правильно инициировать для каждого юнита с пассивкой на карте этот код.

Принятый ответ

EviLInside, ну я бы вообще мог сделать отдельный счёт периодичности для каждого юнита, и выдавать дополнительное ХП в зависимости от того, когда это необходимо.
При каждом срабатывании таймера проверить что время периодика меньше такта таймера.
И увеличивать периодик на значение из расчётов, т.е. от 0.5 до 5.0 в зависимости от % ХП.
И каждый раз при этом хилить на 50% от Силы. Вот и всё.
Т.е. тут глобальная группа заменится на массив из связки юнит/время.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
делаю в таких способностях таким таймерам малый период, время остановки определяю через перезаписываемую целочисленную
^ метод Фрога
в MyAbility проверяй есть ли уже абилка 'A06B' у этого юнита
и если есть - ищи таймер и меняй ему время на новое (опять 25 сек - обновление)
ответ
юзай событие юнит получает урон навешанное на каждого юнита
а это ресурсозатратно
ерунду не неси
если хочешь сделать всё очень оптимально то узнай для начала как работает система событий
или вообще юзай екзекют
Diaboliko:
событие получения урона сразу для всех юнитов
это было и до мемхака
вообще бесит когда люди которые не шарят в работе вара начинают выдумывать проблемы а потом искать их решение
ответ
дочерние потоки наследуют свойства основных
то же касается и екзекута

0
15
4 года назад
0
xgm.guru/p/wc3/needspells тебе сюда
3
26
4 года назад
3
Тут на много проще будет изменить саму формулу подсчёт регена в зависимости от потеряного % здоровья.
для наглядности
При 100% ХП это 50% от Силы раз в 5 сек = 10% от Силы в секунду.
При 90% ХП это 50% от Силы раз в 4,5 сек = 11,(1)% от Силы в секунду.
При 80% ХП это 50% от Силы раз в 4 сек = 12,5% от Силы в секунду.
При 70% ХП это 50% от Силы раз в 3,5 сек = 14,23% от Силы в секунду.
При 60% ХП это 50% от Силы раз в 3 сек = 16,(6)% от Силы в секунду.
При 50% ХП это 50% от Силы раз в 2,5 сек = 20% от Силы в секунду.
При 40% ХП это 50% от Силы раз в 2 сек = 25% от Силы в секунду.
При 30% ХП это 50% от Силы раз в 1,5 сек = 33,(3)% от Силы в секунду.
При 20% ХП это 50% от Силы раз в 1 сек = 50% от Силы в секунду.
При 10% ХП это 50% от Силы раз в 0,5 сек = 100% от Силы в секунду.
И всё это выливается просто в формулу
STR*0.5 / ( cH/mH * mT )
где cH = current HP / текущее здоровье
mH = maxHP / максимально здоровье
mT = maxTIME / максимальное время (5 секунд)
STR * 0.5 = Мощность регена от Силы героя
Тогда всех юнитов с пассивно можно закинуть в глобальную группу и запустить один таймер, который будет с этой группой работать. Вот и всё.
+ стопить таймер, если вдруг все юниты из группы будут дропнуты
+ запускать таймер, если друг в пустую группу будут добавляться ещё юниты
0
10
4 года назад
Отредактирован EviLInside
0
Extremator:
Тут на много проще будет изменить саму формулу подсчёт регена в зависимости от потеряного % здоровья.
Спасибо что откликнулся, но это было бы слишком просто (хотя то что я хочу наверное тоже не слишком проблемно ), но я не корректно задавал вопрос видимо. мне просто хочется для себя узнать как можно реализовать именно таймеры. Что бы и на будущее в других ситуациях уже знать как это выглядит.
По сути смысл ясен, чекаем героев которые входят на игровую карту
потом запускаем для каждого таймер №1
таймер №1 чекает хп и в зависимости от хп задаёт периодичность таймеру №2
Но типо как влезть в таймер №2 что бы его значение менялось на текущее актуальное
в этом моменте я и заступорился . Но это моё видение, может есть какие то другие решения попроще или т.п
3
26
4 года назад
3
EviLInside, ну я бы вообще мог сделать отдельный счёт периодичности для каждого юнита, и выдавать дополнительное ХП в зависимости от того, когда это необходимо.
При каждом срабатывании таймера проверить что время периодика меньше такта таймера.
И увеличивать периодик на значение из расчётов, т.е. от 0.5 до 5.0 в зависимости от % ХП.
И каждый раз при этом хилить на 50% от Силы. Вот и всё.
Т.е. тут глобальная группа заменится на массив из связки юнит/время.
Принятый ответ
0
27
4 года назад
0
Если пассивка только у одного героя, то создай один таймер. И работай с этим. И проверяй живой ваш герой еще.
Если пассивка у нескольких героев, можно создать один таймер и группу. Периодически таймер чекает группу. В эту группу заноси своих героев, у которых есть эта пассивка. И можно включать таймер, если в группе появляется герой, и выключать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.