указал в скобках +фильтр, тебе не кажется, что это что-то должно значить?
В фильтре можно только прочекать GetFilterUnit(), а для события получения урона GetFilterUnit() возвращает наносителя.
Да и как ты проверишь, что для этого юнита уже зарегистрировано событие без создания доп. костылей?
Само событие UNIT_ATTACKED сильно нагружает игру, потому что срабатывает каждый раз при замахе. У меня из-за частого срабатывания этого события сильно глючила игра. А событие на вход во всю карту срабатывает 1 раз за игру.
Решение Extremator требует сохранения boolean, которое будет отвечать за регистрацию такого события и будет уникально для каждого юнита. И оно также может вызывать лаги. Потому с точки зрения оптимизации и с точки зрения простоты способ ниже самый лучший, если получить урон может любой юнит. Если не любой, то просто в условии или в фильтре отсеиваем ненужных.
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
И каждый раз, когда юнит будет атакован юнитом со способностью X, будет добавляться событие, из-за чего триггер будет срабатывать кучу раз для атакованного юнита. PT153:
UNIT АТАКУЕТ
Его просто сделать, если добавить фильтр в событие UNIT_ATTACKED. Фильт отлавливает только того, кто атакует, как ни странно.
constant native IsUnitEnemy takes unit whichUnit, player whichPlayer returns boolean
Используй её.
А куда условие добавил? В той формуле не передаются юниты или игроки.
В boolexpr точно работает GetFilterUnit(), насчёт остальных таких нативок сказать не могу, но они точно не работают в boolexpr у событий.
А стенка - здание?
При попадании можно стенку сразу удалять RemoveUnit, а для проигрывания анимации нужно в позиции стенки создавать и сразу удалять эффект, который использует модель стенки. Atesla:
у меня из-за двух условий булэкспр "сдувался"
Что это значит? Распиши поподробнее, можешь код кинуть.
Есть для определённого юнита. Если есть юниты на карте, регистрируем для них. Для юнитов, что создаются во время игры, надо сделать такой триггер.
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
То есть если нет таймера, то он создаст его, а если таймер есть, то он увеличит уровень способности? (я немного запутался просто)
Да, ведь так должен спел работать? Я из описания вопроса так понял.
И такой способ для события Получает урон?
Событие "Юнит атакован" срабатывает во время замаха. Это можно абузить. Для каждого юнита на карте нужно зарегистрировать событие по получению урона. Для каждого, потому что общей такой функции нет.
Потеря очереди приказов (у юнита) из-за такого стана не играет для вас вообще никакой роли?!
Это к кому обращение? У меня не играет, потому что. PT153:
у меня это делается на юнитов, которых никто не контролирует
Да и у способа UrsaBoss не должно быть прерываний текущей очереди приказов.
Делается очень просто.
На каждого юнита приходится 1 число. Как только он получается стан, это число увеличивается на 1. Как только какой-то стан истекает, число уменьшается на 1. По истечению стана проверяем, чему равно число. Если 0, то снимаем бафф. Если больше 0, то ничего не делаем.
Чтобы было всё нативно, используем такое наложение стана. UrsaBoss:
Один дамми молот бурь с 0 времени стана (или -1)
Далее хештаблица и таймер, сохраняешь юнита по хендлу таймера и запускаешь его на нужное время
Всё. Кастомная система баффов готова.
Но в таком случае придётся отказаться от других станящих способностей.
крутил-крутил-вертел код, сделал так, вроде, работает, но мне кажется, что можно лучше
У тебя всё равно плодятся таймеры при каждом замахе. Через несколько минут игры будут лаги. Лучше глянь сообщение над своим.
Они бы не плодились, если бы была проверка на наличие способности, которую добавляешь (если уровень способности больше нуля, ничего не делаем). Но такой проверки нет.
Во-первых, измени событие на получение урона, а не на срабатывание атаки.
А во-вторых, у тебя при каждой атаке плодятся таймеры.
Вот нормальная реализация.
index -- любое удобное для тебя число.
// Эта функции вообще не нужна
function Trig_Aura_Strenght_Conditions takes nothing returns boolean
return true
endfunction
function Aura_Strenght_Lost takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer tid = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hash,tid,47)
local integer cid = GetHandleId(caster)
call FlushChildHashtable(udg_Hash, tid)
call RemoveSavedHandle(udg_Hash, cid)
call UnitRemoveAbility(caster,'S001')
call DestroyTimer(t)
set t = null
endfunction
function Trig_Aura_Strenght_Actions takes nothing returns nothing
local unit caster = GetAttacker()
local integer cid = GetHandleId(caster)
local timer t = LoadTimerHandle(udg_Hash, cid, index)
local integer level
local integer tid
if t == null then
set t = CreateTimer()
call SaveTimerHandle(udg_Hash, cid, index, t)
set tid = GetHandleId(t)
call SaveUnitHandle(udg_Hash, tid, 47, caster)
call SaveInteger(udg_Hash, tid, 47, 1) // НЕ перезапишет юнита
call UnitAddAbility(caster, 'S001')
else
set tid = GetHandleId(t)
set level = LoadTimerHandle(udg_Hash, cid, index) + 1
call SetUnitAbilityLevel(caster, 'S001', level)
call SaveInteger(udg_Hash, tid, 47, level)
endif
call TimerStart(t, 5., false, function Aura_Strenght_Lost)
set t = null
set caster = null
endfunction
учитывают наличия других источников оглашения и их взаимодействия.
Если в карте используется только такой стан, то все взаимодействия учитываются, иначе это плохая система.
И почему "ваши"?) Способ UrsaBoss вполне нативный же.
ты не отдашь любой другой приказ
Я так понимаю, что это касается только управления от игроков.
при этом триггер "Юнит завершает применение способности" не срабатывает
Только проверил, на эту способность срабатывает. После применений ты сразу же отдаёшь новый приказ, и текущий прерывается, а событие срабатывает только по успешном завершении применения способности. Используй событие "Прекращает применение способности". Да что уж говорить, это событие срабатывает на все способности, которые могут быть отловлены событиями для способностей.
В моей карте сделан кастомный стан наряду с другими баффами. Я просто отдаю приказ стана юнитам на то время, что нужно. После истечения отдаётся приказ идти. Но стоит отметить, что у меня это делается на юнитов, которых никто не контролирует, так что стоит проверить, может ли игрок контролировать юнитов, пока они в таком стане. Полагаю, что не может, ибо даже нативный стан можно обойти триггерным приказом во время получения стана.
Способ UrsaBoss самый лучший, если не нужно делать систему кастомных баффов.
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Само событие UNIT_ATTACKED сильно нагружает игру, потому что срабатывает каждый раз при замахе. У меня из-за частого срабатывания этого события сильно глючила игра. А событие на вход во всю карту срабатывает 1 раз за игру.
Решение Extremator требует сохранения boolean, которое будет отвечать за регистрацию такого события и будет уникально для каждого юнита. И оно также может вызывать лаги. Потому с точки зрения оптимизации и с точки зрения простоты способ ниже самый лучший, если получить урон может любой юнит. Если не любой, то просто в условии или в фильтре отсеиваем ненужных.
» WarCraft 3 / Дамми
» WarCraft 3 / Дамми
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Extremator:
PT153:
» WarCraft 3 / Дамми
А куда условие добавил? В той формуле не передаются юниты или игроки.
В boolexpr точно работает GetFilterUnit(), насчёт остальных таких нативок сказать не могу, но они точно не работают в boolexpr у событий.
» WarCraft 3 / Дамми
При попадании можно стенку сразу удалять RemoveUnit, а для проигрывания анимации нужно в позиции стенки создавать и сразу удалять эффект, который использует модель стенки.
Atesla:
» WarCraft 3 / Как скрыть характеристики врагов ?
» WarCraft 3 / Дамми
Стенка же юнит? Во время смерти убери поставь в SetUnitPathing на false.
» WarCraft 3 / Какую версию jasshelper лучше использовать?
» WarCraft 3 / Как копировать данные ландшфат?
» WarCraft 3 / Система стана
Ред. PT153
» WarCraft 3 / Система стана
PT153:
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Ред. PT153
» WarCraft 3 / Система стана
PT153:
На каждого юнита приходится 1 число. Как только он получается стан, это число увеличивается на 1. Как только какой-то стан истекает, число уменьшается на 1. По истечению стана проверяем, чему равно число. Если 0, то снимаем бафф. Если больше 0, то ничего не делаем.
Чтобы было всё нативно, используем такое наложение стана.
UrsaBoss:
» WarCraft 3 / Почему нельзя вызвать через code переменная?
» WarCraft 3 / Копирование триггеров в war3map.j
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
Они бы не плодились, если бы была проверка на наличие способности, которую добавляешь (если уровень способности больше нуля, ничего не делаем). Но такой проверки нет.
Ред. PT153
» WarCraft 3 / Способность: повышение атаки при каждом ударе
А во-вторых, у тебя при каждой атаке плодятся таймеры.
» WarCraft 3 / Способность: повышение атаки при каждом ударе
» WarCraft 3 / Система стана
И почему "ваши"?) Способ UrsaBoss вполне нативный же.
Ред. PT153
» WarCraft 3 / Отслеживание срабатывания способности
Да что уж говорить, это событие срабатывает на все способности, которые могут быть отловлены событиями для способностей.
» WarCraft 3 / Проблема с JNGP
» WarCraft 3 / Система стана