Не всегда срабатывает триггер, или вообще отказывается работать в определенном месте
Код
вспомогательные функции. если есть аналоги - заменить
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
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, ну вот, надо было писать подробнее, то ваши пожелания можно трактовать по разному...
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.