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 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,137Активность: |
ты сохранил не на тот хэндл, и извлек из пустого таймера, старые ошибки повторяешь.
Hatsume_Hate добавил:
и т.д. |
20.05.2012, 15:59 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
Hatsume_Hate, я не понимаю как можно на один и тот же таймер запустить разные функции в разный промежуток времени :{
P.S. эту строчку добавлял, не помогало ) |
20.05.2012, 16:00 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,137Активность: |
ну попробуй сделать второй таймер. Сохранить на него. И отладочные сообщения поставь. |
20.05.2012, 16:09 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
Вот код спела,написанного давно=З
До цели летит снаряд,наносит ей урон и замедляет,взрывается,разлетается на 5 осколков,когда осколки разлетаются в позиции цели снова наносится урон по области+замедление(по первоначальной цели 2 раз не наносится) Код мб не очень,но думаю принцип ясен будет
» Code
|
20.05.2012, 16:10 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
Nerevar, у меня в коде также таймеры юзаются, только не срабатывает -____- Ты запускаешь таймер в цикле оО, 4 раза запускать таймер :) |
20.05.2012, 21:39 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
Ну конечно можно переписать под хранение в хеше\группе\массиве,но тогда мне до этого не было дела |
20.05.2012, 21:53 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Vadik29
Choice Battle 1.6а
offline
Опыт:
15,845Активность: |
Зачем юзать 2 таймера, юзать booleanы вас не учили? Ставишь общее услове, сохраняешь булеан == false и когда снаряд долетает создаешь юнитов под своим углом сохраняешь и пишешь булеан = true и начинают лететь твои осколки... И ForGroup() - бред.... |
21.05.2012, 08:18 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,137Активность: |
Vadik29:
сначала въедь в тему. у него там стоят условия на расстояние.
и бред это использовать ForGroupBJ |
21.05.2012, 08:22 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
JugHead, интересно а нахер создавать массивы когда можно сразу всё сделать, извлекая из хеш таблицы в цикле... И походу ошибка у тебя где то там, в таких городушках несложно ошибиться... |
21.05.2012, 08:26 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
JugHead, i== 5? чё тока 4 действия нужно сделать? и почему i между циклами не приравниваеш 0? там 5 а ты exit когда равно 5... |
22.05.2012, 01:56 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
quq_CCCP, между циклами нет смысла приравнивать i = 0, т.к. циклы в разных ветвях условия, значит сработает только 1 цикл за 1 тик таймера, а в другой тик уже будет другая переменная. i == 5, да хоть 15 поставлю, если нужные значения не загружаются это не принципиально :( |
22.05.2012, 03:34 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
JugHead, ну сохранил то ты их правильно... |
22.05.2012, 03:51 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
quq_CCCP, он даже сообщения не выводит ;[ |
22.05.2012, 04:28 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
JugHead, какое именно?, как следует проверяй условия... Мб где то что то некогда несможет быть равно чему либо... Если у тебя первое сообщение call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "Cond++") то у тебя даже функция не запускается.... а если второе не срабатывает call DisplayTimedTextToPlayer(Player(0), 0, 0, 0, "NULL+") то у тебя D не равно null, следовательно ты чё то загрузил из хештаблицы... (проверь юнита ли ты сохранил по этому адресу...) Советую смотреть как я делал очень схожий скилл... Показать код? |
22.05.2012, 04:39 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
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 | #18
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
quq_CCCP, дистанцию менял на 1500, двигается либо 1 раз либо вообще не двигаются, следовательно если бы дистанция была больше или равна 1500, должно было сработать второе условие, в котором они удалятся, чего не происходит.
Спасиб, сейчас гляну. P.S. помню этот код, там в фильтре значение null возвращало :) Отредактировано JugHead, 22.05.2012 в 05:13. |
22.05.2012, 05:06 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
JugHead, там не в фильтре была беда... и не null а false... (Boolexpr же, болеан не хендл, не может быть null) Ибо меня волновало какого хрена снаряды летят как снежинки, в разные стороны и на разной высоте, а оказалась что это дело в даммиках... Отредактировано quq_CCCP, 22.05.2012 в 05:39. |
22.05.2012, 05:30 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|