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

ответ
не если дерево меньше 1, а если текущее дерево - 1 == 0
ответ
Подробнее, что и как делалои?
Иногда бывает что канал мешает даммикам кастануть спелл, но это бывает если:
  1. У канала указан базовый ид приказа от другого, существующего и применяющегося дамми юнитом скилла.
  2. Тип цели у канала отличается от того скилла чье ид указано в настройках канала.
  3. Игрок должен кастануть канал до того как кто либо кастанет скилл оригинал.
    Этот баг связан с кешированием приказа абилок как описывал DracoLich, варкравт записывает типы целей для всех абилок с этим ид, а когда скилл кастуют проверяет.
Допустим у тебя 2 скилла, первый натуральная волна силы с приказом ShockWave а второй канал с тем же ид приказа ShockWave но типом цели мгновенное (без указания цели), стоит тебе кастануть канал как дамми юниты которые кастуют первый скилл (волну силы) откажутся её кастовать, ибо движек вара будет считать что это селф каст абилка (абилки без указания цели на самом деле кастуются в самого кастера).
Дебаг типа

if not IssueTargetOrder( u, некий приказ, target ) then
 
	call BJDebugMsg( "Ошибка невозможно выполнить приказ такойто на цель" +GetUniTName(targ))
	
	if IssueTargetOrder( u, некий приказ, u ) then
			call BJDebugMsg( "Баг канала - измени ид приказа на несуществующий в предалах твоей карты!"))
	endif
	
endif

1
26
4 года назад
1
Это случайно не Буйный рост? Если да, то чего не обратишься к автору Tobi123?
0
15
4 года назад
Отредактирован Desgul
0
8gabriel8, Так вот он её делал, делал но так и не сделал, возможно не себе и сделано на .... Ну он долго делал пытался сделать что бы работало, оно работает то правильно, но не всегда лечит
0
32
4 года назад
0
Какой то странный спелл, локальные массивы...
0
10
4 года назад
0
quq_CCCP:
Какой то странный спелл, локальные массивы...
Я вообще не понимаю, почему там так много циклов.
Если тебе нужен просто АОЕ хил, ну ты пикай всех вокруг каждые Х секунд, и переменную интовую на кол-во раз.
Если надо кол-во ограничить добавить условие на выход из цикла при пике Y >= ЧИСЛО
Принятый ответ
0
15
4 года назад
0
noyl, Если бы я в этом шарил, то я бы не обращался к вам
1
10
4 года назад
1
Desgul:
noyl, Если бы я в этом шарил, то я бы не обращался к вам
Ну тогда тебе не сюда, а в заказ заклинаний
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.