Не всегда срабатывает триггер, или вообще отказывается работать в определенном месте
Код
вспомогательные функции. если есть аналоги - заменить
function IsUnitDead takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction
function IsAlly takes unit u, unit d returns boolean
return not IsUnitType(u,UNIT_TYPE_ANCIENT) and not IsUnitDead(u)  and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and IsUnitAlly(u, GetOwningPlayer(d))
endfunction
//
//код спелла
function Trig_Heal_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A0DK' //сюда засунуть равкод
endfunction

function HealPeriodic takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer hid = GetHandleId(t)
local unit u =LoadUnitHandle(udg_SP_Hashtable,hid,0)
local unit ut
local group g = LoadGroupHandle(udg_SP_Hashtable,hid,1)
local integer stages = LoadInteger(udg_SP_Hashtable,hid,2)
local real hps = LoadReal(udg_SP_Hashtable,hid,3)
if stages <= 0 then
call DestroyGroup(g)
call FlushChildHashtable(udg_SP_Hashtable,hid)
call DestroyTimer(t)
else
call GroupClear(udg_druid_group)
set bj_groupAddGroupDest = udg_druid_group
call ForGroup(g, function GroupAddGroupEnum)
loop
set ut=FirstOfGroup(udg_druid_group)
if not IsUnitDead(ut) then
if GetWidgetLife(ut)<=GetUnitState(ut,UNIT_STATE_MAX_LIFE)*0.3 then
call CreateTextTagUnit("+"+I2S(R2I(hps+hps*0.5))+"!",ut, 20.00, 100.00, 20, 255, 20, 255, 20, 0.00, 2.00, false, true) // период
call SetWidgetLife(ut, GetWidgetLife(ut)+hps+hps*0.5)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl",ut,"origin"))//эффект
else
call CreateTextTagUnit("+"+I2S(R2I(hps)),ut, 20.00, 100.00, 20, 255, 20, 255, 20, 0.00, 2.00, false, true) // период
call SetWidgetLife(ut, GetWidgetLife(ut)+hps)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl",ut,"origin"))//эффект
endif
endif
call GroupRemoveUnit(udg_druid_group,ut)
exitwhen ut==null
endloop
call SaveInteger(udg_SP_Hashtable,hid,2,stages-1)
endif
set t=null
set u=null
set ut=null
set g=null
endfunction

function Trig_Heal_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local unit ut
local group g = CreateGroup()
local timer t = CreateTimer()
local integer hid = GetHandleId(t)
local integer lvl = GetUnitAbilityLevel(u, 'A0DK')//здесь тоже равкод абилки
local real range = 400+lvl*30//радиус
local real hps = udg_SP_CurrentValue + GetHeroInt(u, true) * 0.70 * lvl//хил в стадию
local integer maxt = lvl//кол-во целей
local integer stages = 7//количество стадий
local integer i = 0
local real r = 0.
local real hp= 1.
local unit array ta
local integer n = 10
local integer j = 0
local integer ii=0
local integer jj=0
//перебор группы и внесение в список
call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl", u,"origin"))//эффект на герое
call GroupAddUnit(g,u)
//call CreateTextTagUnit(I2S(R2I(hps)),u, 20.00, 100.00, 20, 255, 20, 255, 20, 0.00, 2.00, false, true)
//call SetWidgetLife(u, GetWidgetLife(u)+hps)
//call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl",u,"origin"))
call GroupEnumUnitsInRange(udg_druid_group, GetUnitX(u), GetUnitY(u), range, null)
loop
set ut = FirstOfGroup(udg_druid_group)
exitwhen ut==null
if IsAlly(ut, u) and ut!=u then
set i = i+1
set ta[i]=ut
endif
call GroupRemoveUnit(udg_druid_group,ut)
endloop

if i >0 then
set j = 1
loop
exitwhen j>i or maxt<=0 or ta[j]==null
if GetWidgetLife(ta[j])<GetUnitState(ta[j],UNIT_STATE_MAX_LIFE)*0.3 then
call GroupAddUnit(g,ta[j])
set ta[j]=null
//set jj=j
//loop
//exitwhen jj>i
//call BJDebugMsg("FH="+I2S(GetHandleId(ta[jj])))
//call BJDebugMsg("SH="+I2S(GetHandleId(ta[jj+1])))
//set ta[jj]=ta[jj+1]
//set jj=jj+1
//endloop
set i = i-1
set maxt= maxt-1
endif
set j=j+1
endloop
set j = 0
loop
exitwhen i<=0 or maxt<=0
loop
set n = GetRandomInt(1,i)
exitwhen n!=j and ta[n]!=null
endloop
if ta[n]!=u then
//если не надо хилить сразу - убрать 3 строчки, до след коммента
//call CreateTextTagUnit(I2S(R2I(hps)),ta[n], 20.00, 100.00, 20, 255, 20, 255, 20, 0.00, 2.00, false, true)
//call SetWidgetLife(ta[n], GetWidgetLife(ta[n])+hps)
//call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl",ta[n],"origin"))
//
set j=n
call GroupAddUnit(g,ta[n])
set ta[n]=null
set i = i-1
set maxt= maxt-1
endif
endloop
endif
//
call SaveUnitHandle(udg_SP_Hashtable,hid,0,u)
call SaveGroupHandle(udg_SP_Hashtable,hid,1,g)
call SaveInteger(udg_SP_Hashtable,hid,2,stages)
call SaveReal(udg_SP_Hashtable,hid,3,hps)
call TimerStart(t, 1., true, function HealPeriodic)//можно менять переодичность стадий
set t =null
set u=null
set ut=null
set g=null
endfunction

//===========================================================================
function InitTrig_Heal takes nothing returns nothing
    set gg_trg_Heal = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Heal, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Heal, Condition( function Trig_Heal_Conditions ) )
    call TriggerAddAction( gg_trg_Heal, function Trig_Heal_Actions )
endfunction
Видео

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

quq_CCCP:
Какой то странный спелл, локальные массивы...
Я вообще не понимаю, почему там так много циклов.
Если тебе нужен просто АОЕ хил, ну ты пикай всех вокруг каждые Х секунд, и переменную интовую на кол-во раз.
Если надо кол-во ограничить добавить условие на выход из цикла при пике Y >= ЧИСЛО
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
15
4 года назад
0
8gabriel8, Ну даже если выбор брать по 1 классу, загружают же героев и они могут быть одинаковые, это ограничение стоит что для 1 игрока 1 герой, ограничение на одинаковых героев нету
1
26
4 года назад
1
Desgul, мы так подробно обсудили, что чётко представил в голове триггер и сделал)
Но только без баффа, так как поленился возиться с ним, только оставил заготовку под них на будущее. По идее бафф надо делать вручением ауры торнадо при нажатии на способность, через секунду в момент хила триггер проверит наличие юнитов с этим баффом в зоне действия, если нет, то забирает ауру и добавляет другим, потом лечит, при последнем лечении снимает. Вот только надо проверить и может что-то придумать при наложении баффов от двух кастеров, вдруг первый закончит свой Буйный рост и снимет бафф с юнита, а тот находится под действием второго кастера, который только начал хилять.
Загруженные файлы
0
15
4 года назад
Отредактирован Desgul
0
8gabriel8, у тебя почти получилось, только он не должен при каждом тике искать новую цель, такой вариант то же хороший
1
26
4 года назад
1
В ближайшее время всё равно не буду заниматься этой способностью, так что жди вариант quq_CCCP с учётом всех нюансов.
1
32
4 года назад
1
Ну вот склепл на скорую руку, все по минимуму, абилка учитывает смерть кастера и кол-во хп, лечит ближайших юнитов, хотел добавить проверку на фулл хп, чтобы исключить лечение фулл-хп юнитов, но пока не сделал, это уже автору виднее.
Загруженные файлы
0
15
4 года назад
Отредактирован Desgul
0
quq_CCCP, цели не должны меняться, при каждом тике должен лечить тех что попали под хил
0
32
4 года назад
0
Desgul, а ну ок, я думал что случайных.

Тогда нужно выбирать всех кто подошел к кастеру и заносить их в отдельную группу, если они отошли или умерли - удалять и выбирать новых
0
15
4 года назад
0
quq_CCCP, Не совсем, если юнит попал в группу хила то он может убежать хоть куда, тики на нем должны оставаться до конца или до смерти, то что я скинул код и видео мне кажется вы не смотрели совсем, если посмотреть или хотя бы код в карту вставить то можно увидеть как должно работать
0
32
4 года назад
0
Desgul, я не совсем понял что там, по видео задумку скилла понять сложно, поэтому и опрашиваю че да как.

Юниты берутся в группу только при касте или и во время работы скилла, вот так всегда, попробуй пойти что хочет заказчик?
0
15
4 года назад
0
quq_CCCP, при нажатие мы создаём группу выбираем случайных 5 юнитов + сам кастер, сам кастер должен всегда получать лечения при нажатие, вот мы случайно выбрали 5 юнитов и лечим их всё время действия способности не меняем цели, приоритет лечить тех у кого меньше 30% здоровья
0
32
4 года назад
0
5 на всех уровнях или как ты выше писал что 1+ уровень способности
0
15
4 года назад
Отредактирован Desgul
0
quq_CCCP, сам касте + 1 юнит, на 2 уровне сам кастер +2 юнита и так далее 5 уровней, есть дискорд? что бы я тебе объяснил как всё должно работать
0
32
4 года назад
0
Ну самого кастера я заношу в отдльную переменную и исключаю его из группы, ищем только ближайших союзников не фулл хп, случайных.
На юнитах хил это своего рода бафф, он висит на них все время дейсвия или до их сметри.
Кстати запоминать кол-во статов героя на момент каста или опрашивать каждый тик?
0
15
4 года назад
0
quq_CCCP, Лучше опрашивать каждый тик, так как есть способности у героев которые увеличивают статы на некоторое время
0
32
4 года назад
0
А версия 8gabriel8, тоже не устраивает?
0
15
4 года назад
0
quq_CCCP, у него сделано как у тебя, ищет новую цель при каждом тике
0
32
4 года назад
0
Desgul, ну вот, надо было писать подробнее, то ваши пожелания можно трактовать по разному...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.