Не всегда срабатывает триггер, или вообще отказывается работать в определенном месте
Код
вспомогательные функции. если есть аналоги - заменить
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
я в некоторых способностях использую
Загруженные файлы
0
26
4 года назад
Отредактирован 8gabriel8
0
Desgul, так вот ты нажимаешь, проходит первая секунда, и происходит хил, потом вторая и хил, так далее до седьмой. При нажатии хила нет, а тиков семь.
0
15
4 года назад
0
8gabriel8, одинаковых брать можно не кто не запрещает брать допустим 8 паладинов, ну с тиками я разберусь это не сложно настроить, главное что бы не лечил сразу
0
32
4 года назад
0
ну я могу сделать плавное лечение, каждые 0.25 сек, но в 1 секунду герой будет поулчать твои 70% от разума хп (или как там у тебя).
0
15
4 года назад
Отредактирован Desgul
0
quq_CCCP, Не так не надо будет много текстага, а еще силу заклинания прикручивать, не хочу её делить на 4
0
26
4 года назад
0
Desgul, странно, что перепутал с выбором героев, ранее у тебя можно было одинаковых брать? Тогда MUI нужно)
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
Ну вот склепл на скорую руку, все по минимуму, абилка учитывает смерть кастера и кол-во хп, лечит ближайших юнитов, хотел добавить проверку на фулл хп, чтобы исключить лечение фулл-хп юнитов, но пока не сделал, это уже автору виднее.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.