XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
JugHead

offline
Опыт: 1,612
Активность:
Движение снаряда, вызов таймером двух функций.
Делаю абилку,
Описание: Создается дамми-снаряд в точке кастера и летит к указанной цели, после чего удаляется, наносится урон через пик юнитов в группу и дальнейшим ForGroup(),
И нужно сделать так, чтобы после этого появилось 5 осколков, в заданных точках и под нужным углом, которые будут двигаться по своей траектории, и при прохождении заданной дистанции удалятся и наносить урон.
Первый дамми-снаряд летит и удаляется как надо, но остальные которые создаются после него остаются в той точке где и были созданы, движения не происходит, после 2-ух применений появляются жуткие лаги.
Сделал вот что:
((код jass
globals
unit Arrow_Un
endglobals
function Arrow_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00S'
endfunction
function FilterUnit_Arrow takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(Arrow_Un),GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)
endfunction
function Arrow_damage takes nothing returns nothing
local unit u = GetEnumUnit()
call UnitDamageTarget(Arrow_Un, u, 250.00, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl",​ u, "overhead"))
set u = null
endfunction
function Arrow_multiply takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local real array a
local real array xd
local real array yd
local unit array d
local integer i = 0
local real dist
local real x0 = LoadReal(h, int, 11)
local real y0 = LoadReal(h, int, 12)
local boolexpr b = Condition(function FilterUnit_Arrow)
local group g = CreateGroup()
loop
exitwhen i == 5
set a[i] = LoadReal(h, int, 13+i)
set xd[i] = LoadReal(h, int, 18+i) + 60 * Cos(a[i]*bj_DEGTORAD)
set yd[i] = LoadReal(h, int, 23+i) + 60 * Sin(a[i]*bj_DEGTORAD)
set d[i] = LoadUnitHandle(h, int, 28+i)
endloop
set i = 0
set dist = SquareRoot((xd[0]-x0)*(xd[0]-x0)+(yd[0]-y0)*(yd[0]-y0))
if dist < 900 then
loop
exitwhen i == 5
call SetUnitPosition(d[i], xd[i], yd[i])
set i = i+1
endloop
elseif dist >= 900 then
call PauseTimer(t)
call FlushChildHashtable(h, int)
call DestroyTimer(t)
loop
exitwhen i == 5
call RemoveUnit(d[i])
call GroupEnumUnitsInRange(g, xd[i], yd[i], 150, b)
call ForGroup(g, function Arrow_damage)
set i = i+1
endloop
endif
set i = 0
loop
exitwhen i == 5
set d[i] = null
set i = i+1
endloop
set t = null
set b = null
set g = null
endfunction
function Arrow_timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local unit d = LoadUnitHandle(h, int, 7)
local unit u = LoadUnitHandle(h, int, 8)
local real a = LoadReal(h, int, 9)
local real x = GetUnitX(d) + 20 * Cos(a*bj_DEGTORAD)
local real y = GetUnitY(d) + 20 * Sin(a*bj_DEGTORAD)
local real x2 = GetUnitX(u)
local real y2 = GetUnitY(u)
local real dist = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))
local boolexpr b = Condition(function FilterUnit_Arrow)
local group g = CreateGroup()
local integer i = 0
set Arrow_Un = LoadUnitHandle(h, int, 10)
if dist > 100 then
call SetUnitPosition(d, x, y)
elseif dist <= 100 then
call PauseTimer(t)
call RemoveUnit(d)
call GroupEnumUnitsInRange(g, x, y, 300, b)
call ForGroup(g, function Arrow_damage)
call FlushChildHashtable(h, int)
call DestroyTimer(t)
set t = CreateTimer()
loop
exitwhen i == 5
call SaveReal(h, int, 11, x)
call SaveReal(h, int, 12, y)
set a = a + 72 * i
call SaveReal(h, int, 13+i, a)
set x = x + 300 * Cos(a*bj_DEGTORAD)
call SaveReal(h, int, 18+i, x)
set y = y + 300 * Sin(a*bj_DEGTORAD)
call SaveReal(h, int, 23+i, y)
call SaveUnitHandle(h, int, 28+i, CreateUnit(GetOwningPlayer(Arrow_Un), 'h00V', x, y, 0))
set i = i+1
endloop
call TimerStart(t, 0.04, true, function Arrow_multiply)
endif
call DestroyBoolExpr(b)
call DestroyGroup(g)
set b = null
set g = null
set d = null
set t = null
set u = null
endfunction
function Arrow_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer int = GetHandleId(t)
local unit tg = GetSpellTargetUnit()
local unit c = GetSpellAbilityUnit()
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local unit d = CreateUnit(GetOwningPlayer(c), 'h00V', x, y, 0)
call UnitApplyTimedLife(d, 'BTLF', 10.00)
call SaveUnitHandle(h, int, 7, d)
call SaveUnitHandle(h, int, 8, tg)
call SaveReal(h, int, 9, bj_RADTODEG*Atan2(GetUnitY(tg)-y,GetUnitX(tg)-x))
call SaveUnitHandle(h, int, 10, c)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl", x, y))
call TimerStart(t, 0.04, true, function Arrow_timer)
set d = null
set tg = null
set t = null
set c = null
endfunction
function InitTrig_Arrow takes nothing returns nothing
set gg_trg_Arrow = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(gg_trg_Arrow, Condition(function Arrow_Conditions))
call TriggerAddAction(gg_trg_Arrow, function Arrow_Actions)
endfunction
))
Старый 20.05.2012, 15:40
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
ты сохранил не на тот хэндл, и извлек из пустого таймера, старые ошибки повторяешь.
Hatsume_Hate добавил:
...
set t = CreateTimer()
set int = GetHandleId(t)
loop
            exitwhen i == 5
            call SaveReal(h, int, 11, x)
            call SaveReal(h, int, 12, y) 
            set a = a + 72 * i
            call SaveReal(h, int, 13+i, a)
            set x = x + 300 * Cos(a*bj_DEGTORAD)
            call SaveReal(h, int, 18+i, x)
            set y = y + 300 * Sin(a*bj_DEGTORAD)
            call SaveReal(h, int, 23+i, y)
            call SaveUnitHandle(h, int, 28+i, CreateUnit(GetOwningPlayer(Arrow_Un), 'h00V', x, y, 0))
            set i = i+1
        endloop
и т.д.
Старый 20.05.2012, 15:59
JugHead

offline
Опыт: 1,612
Активность:
Hatsume_Hate, я не понимаю как можно на один и тот же таймер запустить разные функции в разный промежуток времени :{
P.S. эту строчку добавлял, не помогало )
Старый 20.05.2012, 16:00
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
ну попробуй сделать второй таймер. Сохранить на него. И отладочные сообщения поставь.
Старый 20.05.2012, 16:09
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Вот код спела,написанного давно=З
До цели летит снаряд,наносит ей урон и замедляет,взрывается,разлетается на 5 осколков,когда осколки разлетаются в позиции цели снова наносится урон по области+замедление(по первоначальной цели 2 раз не наносится)
Код мб не очень,но думаю принцип ясен будет
» Code
function Parabola takes real h, real d, real x returns real
  return (4 * h / d) * (d - x) * (x / d)
endfunction

function Trig_FireShock_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A01F'
endfunction

function FireShock_e takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit caster=LoadUnitHandle(udg_Hash,id,0)
local integer level=LoadInteger(udg_Hash,id,1)
local real distance=LoadReal(udg_Hash,id,2)
local unit target=LoadUnitHandle(udg_Hash,id,3)
local real x=LoadReal(udg_Hash,id,4)
local real y=LoadReal(udg_Hash,id,5)
local group g
local unit f
local unit dammi
if distance<=15. then
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
    set g=CreateGroup()
    call GroupEnumUnitsInRange(g,x,y,250.,null)
    call GroupRemoveUnit(g,target)
loop
    set f=FirstOfGroup(g)
    exitwhen f==null
if  IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(f)) and (GetWidgetLife(f) > 0.405) and not IsUnitType(f, UNIT_TYPE_STRUCTURE) and not IsUnitType(f, UNIT_TYPE_MECHANICAL) and not IsUnitType(f, UNIT_TYPE_ANCIENT) and not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE) then
    call UnitDamageTarget(caster,f, 40., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    set dammi=CreateUnit(GetOwningPlayer(caster),'h002',x,y,0.)
    call UnitApplyTimedLife( dammi, 'BTLF', 2. )
    call UnitAddAbility(dammi,'A055')
    call IssueTargetOrder(dammi,"slow",f)
    call GroupRemoveUnit(g,f)
else
    call GroupRemoveUnit(g,f)
endif
endloop
    call DestroyGroup(g)
else
    call SaveReal(udg_Hash,id,2,distance-20.)
endif
set t=null
set f=null
set dammi=null
set g=null
set caster=null
set target=null
endfunction

function FireShock_c takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit dammi=LoadUnitHandle(udg_Hash,id,0)
local real angle=LoadReal(udg_Hash,id,1)
local real distance=LoadReal(udg_Hash,id,2)
local real rdistance=LoadReal(udg_Hash,id,3)
local real x=GetUnitX(dammi)
local real y=GetUnitY(dammi)
if distance<=15. or IsTerrainPathable(x+20.*Cos(angle),y+20.*Sin(angle),PATHING_TYPE_FLYABILITY) == true then
    call SetUnitFlyHeight(dammi,0.,600.)
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
    call KillUnit(dammi)
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoMissile.mdl",x,y​))
else
    call SetUnitX(dammi,x+20.*Cos(angle))
    call SetUnitY(dammi,y+20.*Sin(angle))
    call SetUnitFlyHeight(dammi,Parabola(225.,rdistance+distance,rdistance),999.)
    call SaveReal(udg_Hash,id,2,distance-20.)
    call SaveReal(udg_Hash,id,3,rdistance+20.)
endif
set t=null
set dammi=null
endfunction

function FireShock_m takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit caster=LoadUnitHandle(udg_Hash,id,0)
local unit target=LoadUnitHandle(udg_Hash,id,1)
local unit dammi=LoadUnitHandle(udg_Hash,id,3)
local real x=GetUnitX(dammi)
local real y=GetUnitY(dammi)
local real tx=GetUnitX(target)
local real ty=GetUnitY(target)
local real angle=Atan2(ty-y,tx-x)
local real distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y))
local integer i=0
if distance<20. and GetUnitState(target,UNIT_STATE_LIFE)>0.405 then
    call UnitDamageTarget(caster,target, 60., true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Volcano\\VolcanoMissile.mdl&quo​t;,target,"origin"))
    call KillUnit(dammi)
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
    set dammi=CreateUnit(GetOwningPlayer(caster),'h002',tx,ty,0.)
    call UnitApplyTimedLife( dammi, 'BTLF', 2. )
    call UnitAddAbility(dammi,'A055')
    call IssueTargetOrder(dammi,"slow",target)
    set x=GetUnitX(target)
    set y=GetUnitY(target)
loop
exitwhen i>4
    set dammi=CreateUnit(GetOwningPlayer(caster),'h01C',x,y,72.*i)
    call SetUnitScale(dammi,0.66,0.66,0.66)
    set t=CreateTimer()
    set id=GetHandleId(t)
    set angle=bj_DEGTORAD*72.*i
    set tx=x+155.*Cos(angle)
    set ty=y+155.*Sin(angle)
    set distance=SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y))
    call SaveUnitHandle(udg_Hash,id,0,dammi)
    call SaveReal(udg_Hash,id,1,angle)
    call SaveReal(udg_Hash,id,2,distance)
    call TimerStart(t,0.05,true,function FireShock_c)
    set i=i+1
endloop
    set t=CreateTimer()
    set id=GetHandleId(t)
    call SaveUnitHandle(udg_Hash,id,0,caster)
    call SaveReal(udg_Hash,id,2,distance)
    call SaveUnitHandle(udg_Hash,id,3,target)
    call SaveReal(udg_Hash,id,4,x)
    call SaveReal(udg_Hash,id,5,y)
    call TimerStart(t,0.05,true,function FireShock_e)
elseif GetUnitState(target,UNIT_STATE_LIFE)<0.405 then
    call KillUnit(dammi)
    call PauseTimer(t)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
else
    call SetUnitX(dammi,x+20.*Cos(angle))
    call SetUnitY(dammi,y+20.*Sin(angle))
    call SetUnitFacing(dammi,angle*bj_RADTODEG)
    call SetUnitFlyHeight(dammi,70.,999.)
endif
set t=null
set caster=null
set dammi=null
set target=null
endfunction

function Trig_FireShock_Actions takes nothing returns nothing
local unit caster=GetTriggerUnit()
local unit target=GetSpellTargetUnit()
local real x=GetUnitX(caster)
local real y=GetUnitY(caster)
local real tx=GetUnitX(target)
local real ty=GetUnitY(target)
local real angle=Atan2(ty-y,tx-x)
local unit dammi=CreateUnit(GetOwningPlayer(caster),'h01C',x,y,angle*bj_RADTODEG)
local timer t=CreateTimer()
local integer id=GetHandleId(t)
    call SetUnitPathing(dammi,false)
    call SaveUnitHandle(udg_Hash,id,0,caster)
    call SaveUnitHandle(udg_Hash,id,1,target)
    call SaveUnitHandle(udg_Hash,id,3,dammi)
    call TimerStart(t,0.035,true,function FireShock_m)
set caster=null
set dammi=null
set target=null
set t=null
endfunction

function InitTrig_FireShock takes nothing returns nothing
local unit d=CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE),'h01C',2700.,2700.,0.)
    set gg_trg_FireShock = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_FireShock, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_FireShock, Condition( function Trig_FireShock_Conditions ) )
    call TriggerAddAction( gg_trg_FireShock, function Trig_FireShock_Actions )
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoMissile.mdl",270​0.,2700.))
    call UnitAddAbility(d,'A055')
    call KillUnit(d)
set d=null 
endfunction
Старый 20.05.2012, 16:10
JugHead

offline
Опыт: 1,612
Активность:
Nerevar, у меня в коде также таймеры юзаются, только не срабатывает -____-
Ты запускаешь таймер в цикле оО, 4 раза запускать таймер :)
Старый 20.05.2012, 21:39
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Ну конечно можно переписать под хранение в хеше\группе\массиве,но тогда мне до этого не было дела
Старый 20.05.2012, 21:53
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Зачем юзать 2 таймера, юзать booleanы вас не учили?
Ставишь общее услове, сохраняешь булеан == false
и когда снаряд долетает создаешь юнитов под своим углом сохраняешь и пишешь булеан = true и начинают лететь твои осколки...
И ForGroup() - бред....
Старый 21.05.2012, 08:18
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Vadik29:
Зачем юзать 2 таймера, юзать booleanы вас не учили?
Ставишь общее услове, сохраняешь булеан == false
и когда снаряд долетает создаешь юнитов под своим углом сохраняешь и пишешь булеан = true и начинают лететь твои осколки...
И ForGroup() - бред....
сначала въедь в тему. у него там стоят условия на расстояние.
и бред это использовать ForGroupBJ
Старый 21.05.2012, 08:22
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, интересно а нахер создавать массивы когда можно сразу всё сделать, извлекая из хеш таблицы в цикле...
И походу ошибка у тебя где то там, в таких городушках несложно ошибиться...
Старый 21.05.2012, 08:26
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, убрал массивы:
((код jass
function Arrow_multiply takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local real x0 = LoadReal(h, int, 11)
local real y0 = LoadReal(h, int, 12)
local boolexpr b = Condition(function FilterUnit_Arrow)
local group g = CreateGroup()
local real a = LoadReal(h, int, 13)
local real xd = LoadReal(h, int, 18) + 60 * Cos(a*bj_DEGTORAD)
local real yd = LoadReal(h, int, 23) + 60 * Sin(a*bj_DEGTORAD)
local integer i = 0
local unit d
local real dist
set dist = SquareRoot((xd-x0)*(xd-x0)+(yd-y0)*(yd-y0))
call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "Cond++")
if dist < 900 then
loop
exitwhen i == 5
set a = LoadReal(h, int, 13+i)
set xd = LoadReal(h, int, 18+i) + 60 * Cos(a*bj_DEGTORAD)
set yd = LoadReal(h, int, 23+i) + 60 * Sin(a*bj_DEGTORAD)
set d = LoadUnitHandle(h, int, 28+i)
if d != null then
call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "NULL+")
endif
call SetUnitPosition(d, xd, yd)
set i = i+1
endloop
elseif dist >= 900 then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(h, int)
loop
exitwhen i == 5
call RemoveUnit(d)
call GroupEnumUnitsInRange(g, xd, yd, 150, b)
call ForGroup(g, function Arrow_damage)
set d = null
set i = i+1
endloop
endif
set t = null
set b = null
set g = null
endfunction
))
лагов нету больше, вот только не загружаются данные из хеша именно в этой функции ;[
Старый 22.05.2012, 01:50
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, i== 5? чё тока 4 действия нужно сделать? и почему i между циклами не приравниваеш 0? там 5 а ты exit когда равно 5...
Старый 22.05.2012, 01:56
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, между циклами нет смысла приравнивать i = 0, т.к. циклы в разных ветвях условия, значит сработает только 1 цикл за 1 тик таймера, а в другой тик уже будет другая переменная.
i == 5, да хоть 15 поставлю, если нужные значения не загружаются это не принципиально :(
Старый 22.05.2012, 03:34
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, ну сохранил то ты их правильно...
Старый 22.05.2012, 03:51
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, он даже сообщения не выводит ;[
Старый 22.05.2012, 04:28
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, какое именно?, как следует проверяй условия...
Мб где то что то некогда несможет быть равно чему либо...
Если у тебя первое сообщение call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "Cond++") то у тебя даже функция не запускается....
а если второе не срабатывает call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "NULL+") то у тебя D не равно null, следовательно ты чё то загрузил из хештаблицы... (проверь юнита ли ты сохранил по этому адресу...)
Советую смотреть как я делал очень схожий скилл...
Показать код?
Старый 22.05.2012, 04:39
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, не работает именно условие в цикле, как-будто обрывается.
уже поставил условие разветвленное:
((код jass
if d != null then
call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "d!=NULL")
elseif d == null then
call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "d==NULL")
endif
))
та же история, цикл будто не запускается либо обрывается.
код будет очень кстати.
Ошибку эту убрал, юниты двигаются только один раз, хотя должны двигаться до определенного расстояния -__-

Отредактировано JugHead, 22.05.2012 в 04:58.
Старый 22.05.2012, 04:52
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, точно dist меньше 900, ну про i вроде ясно, не может она быть равна 5 сразу...
Вот очень схожий скилл
» Ice Arrows
((код jass
function Trig_Ice_Arrows_Filter takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 and IsUnitEnemy(GetFilterUnit(),bj_groupEnumOwningPlayer) and not(IsUnitType(GetFilterUnit(), UNIT_TYPE_ETHEREAL)) and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE)!= 150001.00
endfunction
function Ise_Arrows_Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit uArrow = null
local unit uDummy = null
local integer nIndex = 0
local integer AbLevel = LoadInteger(udg_Hashtable,GetHandleId(t),19)
local integer ArrowsNum = 0
local real AX = 0
local real AY = 0
local real Angle = 0
local group grp = CreateGroup()
local boolexpr filter = Condition(function Trig_Ice_Arrows_Filter)

loop
exitwhen nIndex > 18
set uArrow = LoadUnitHandle( udg_Hashtable, GetHandleId(t), nIndex )

if( uArrow != null and GetUnitState(uArrow, UNIT_STATE_LIFE) > 0 ) then
set ArrowsNum = ArrowsNum + 1
set bj_groupEnumOwningPlayer = GetOwningPlayer(uArrow)
set Angle = GetUnitFacing(uArrow)
set AX = GetUnitX(uArrow) + 20.00 * Cos(Angle * 0.0174532)
set AY = GetUnitY(uArrow) + 20.00 * Sin(Angle * 0.0174532)
call SetUnitPosition( uArrow, AX, AY )
call GroupEnumUnitsInRange( grp, AX, AY, 90.00, Condition (function Trig_Ice_Arrows_Filter) )
set bj_groupEnumOwningPlayer = Player(PLAYER_NEUTRAL_PASSIVE)
if(FirstOfGroup(grp) != null) then
set uDummy = CreateUnit( GetOwningPlayer(uArrow), 'h00U', AX, AY, 0.00 )
call UnitApplyTimedLife(uDummy, 'BTLF',1.20)
call UnitAddAbility( uArrow, 'A04U' )
call UnitAddAbility( uDummy, 'A09F' )
call SetUnitAbilityLevel( uArrow, 'A04U', AbLevel )
call SetUnitAbilityLevel( uDummy, 'A09F', AbLevel )
call IssueTargetOrder( uArrow, "frostnova", FirstOfGroup(grp) )
call IssueTargetOrder( uDummy, "entanglingroots", FirstOfGroup(grp) )
call UnitDamageTargetBJ( uArrow, FirstOfGroup(grp), 80.00 * R2I(AbLevel), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_COLD )
call KillUnit(uArrow)
endif
call GroupClear(grp)
endif
set uArrow = null
set nIndex = nIndex + 1
endloop

if(ArrowsNum == 0)then
call FlushChildHashtable( udg_Hashtable, GetHandleId(t) )
call PauseTimer(t)
call DestroyTimer(t)
endif

call DestroyBoolExpr(filter)
call DestroyGroup(grp)
set grp = null
set t = null
set filter = null
set uArrow = null
set uDummy = null
endfunction
function Trig_Ice_Arrows_Actions takes nothing returns nothing
local unit uCast = GetSpellAbilityUnit()
local player pl = GetOwningPlayer(uCast)
local unit dummy
local real DX = GetUnitX(uCast)
local real DY = GetUnitY(uCast)
local integer nIndex = 0
local timer t = CreateTimer()

set udg_TempUnit = uCast
loop
exitwhen nIndex > 18
set dummy = CreateUnit( pl, 'n00Z', DX + 100 * Cos(20.00 * nIndex * 0.0174532) , DY + 100 * Sin(20.00 * nIndex * 0.0174532), 20.00 * nIndex )
call UnitApplyTimedLife( dummy, 'BTLF', 1.00 )
call SaveUnitHandle(udg_Hashtable, GetHandleId(t), nIndex, dummy )
set nIndex = nIndex + 1
endloop

call SaveInteger(udg_Hashtable,GetHandleId(t),19, GetUnitAbilityLevel( uCast, 'A01U' ))
call TimerStart( t, 0.04, true, function Ise_Arrows_Move )
set uCast = null
set dummy = null
set t = null
endfunction
===========================================================================
function InitTrig_Ice_Arrows takes nothing returns nothing
set gg_trg_Ice_Arrows = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ice_Arrows, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Ice_Arrows, Condition( function Trig_Ice_Arrows_Conditions ) )
call TriggerAddAction( gg_trg_Ice_Arrows, function Trig_Ice_Arrows_Actions )
endfunction
))
Это исправленная версия, вот темя где я решал вопросы по скиллу, там же есть скриншоты скилпа в деиствиии и подробное описание...
Старый 22.05.2012, 05:00
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, дистанцию менял на 1500, двигается либо 1 раз либо вообще не двигаются, следовательно если бы дистанция была больше или равна 1500, должно было сработать второе условие, в котором они удалятся, чего не происходит.
Спасиб, сейчас гляну.
P.S. помню этот код, там в фильтре значение null возвращало :)

Отредактировано JugHead, 22.05.2012 в 05:13.
Старый 22.05.2012, 05:06
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, там не в фильтре была беда... и не null а false... (Boolexpr же, болеан не хендл, не может быть null)
Ибо меня волновало какого хрена снаряды летят как снежинки, в разные стороны и на разной высоте, а оказалась что это дело в даммиках...

Отредактировано quq_CCCP, 22.05.2012 в 05:39.
Старый 22.05.2012, 05:30
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 02:51.