JugHead
offline
Опыт:
1,612Активность: |
Вопрос по таймеру, не удаляются юниты.
В общем столкнулся с проблемой, делал скилл, при касте которого создаются 2 круга юнитов, связываются между собой созданными молниями, наносят урон и тд.
Проблема состоит в том что не удаляются молнии и объекты. Собственно код: ((код jass
globals
unit uc endglobals function Trig_penta_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00G' endfunction function Destroy_penta takes nothing returns nothing
local integer i = 1 local integer int = GetHandleId(GetExpiredTimer()) local unit array u local lightning array l loop exitwhen i > 16 set u[i] = LoadUnitHandle(udg_h, int, 15+i) set l[i] = LoadLightningHandle(udg_h, int, 31+i) endloop loop exitwhen i>16 call RemoveUnit(u[i]) call DestroyLightning(l[i]) set u[i] = null set l[i] = null set i = i+1 endloop endfunction function Filter_g takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(uc) ,GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING) endfunction function Damage_penta takes nothing returns nothing
local integer lvl = GetUnitAbilityLevel(uc, 'A00G') call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Demon\\DarkConversion\\ZombifyTarget.mdl" , GetEnumUnit(), "overhead")) call UnitDamageTargetBJ( uc, GetEnumUnit(), (20*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_ACID ) endfunction function Timer_penta takes nothing returns nothing
local integer int = GetHandleId(GetExpiredTimer()) local real x = LoadReal(udg_h, int, 14) local real y = LoadReal(udg_h, int, 15) local group gb = CreateGroup() local group gs = CreateGroup() call GroupEnumUnitsInRange(gb, x, y, 480, Condition(function Filter_g)) call GroupEnumUnitsInRange(gs, x, y, 240, Condition(function Filter_g)) call ForGroup(gs, function Damage_penta) call ForGroup(gb, function Damage_penta) endfunction function Trig_penta_Actions takes nothing returns nothing
local real array x local real array y local unit u = GetSpellAbilityUnit() local integer i = 1 local timer t = CreateTimer() local integer int = GetHandleId(t) set x[0] = GetUnitX(u) set y[0] = GetUnitY(u) loop exitwhen i>8 set x[i] = x[0]+480*Cos(45*i*bj_DEGTORAD) set y[i] = y[0]+480*Sin(45*i*bj_DEGTORAD) call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i], 0)) set i = i+1 endloop loop exitwhen i>16 set x[i] = x[0]+240*Cos(45*i*bj_DEGTORAD) set y[i] = y[0]+240*Sin(45*i*bj_DEGTORAD) call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i], 0)) set i = i+1 endloop set i = 2 loop exitwhen i>8 call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1])) set i = i+1 endloop call SaveLightningHandle(udg_h, int, 32, AddLightning("DRAB" , false, x[1], y[1], x[8], y[8])) set i = 10 loop exitwhen i>16 call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1])) set i = i+1 endloop call SaveLightningHandle(udg_h, int, 40, AddLightning("DRAB" , false, x[9], y[9], x[16], y[16])) call SaveReal(udg_h, int , 14, x[0]) call SaveReal(udg_h, int , 15, y[0]) set uc = u call TimerStart(t, 0.03125, true, function Timer_penta) set u = null endfunction function InitTrig_penta takes nothing returns nothing
local timer t = CreateTimer() set gg_trg_penta = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_penta, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_penta, Condition( function Trig_penta_Conditions ) ) call TriggerAddAction( gg_trg_penta, function Trig_penta_Actions ) call TimerStart(t, 10.00, true, function Destroy_penta) endfunction )) |
09.05.2012, 18:51 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,117Активность: |
» где экспайред таймер?
Hatsume_Hate добавил:
» и тут должно быть так
Hatsume_Hate добавил:
да я вообще не увидел где ты запускаешь таймер на уничтожение Hatsume_Hate добавил:
и вообще сообщения пробовал ставить? Hatsume_Hate добавил:
вопсчем. ты делаешь так.
создаешь таймер 1, запускаешь его на 10 секунд, для убиения юнитов и молний. создаешь таймер 2, сохраняешь на его хэндл молнии и юнитов при завершении 10 секунд таймера 1, ты извлекаешь молнии и юнитов из его хэндла на который ты ничего не сохранял Hatsume_Hate добавил:
таймеры надо удалять по истечению, хеш таблицу надо тоже очищать после использования, например
|
09.05.2012, 19:36 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
Hatsume_Hate:
а может создадим отдельно для молнии и отдельно для юнитов?
((кат Код
))
сделан криво
((кат Попробуй так
)) |
09.05.2012, 19:37 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,117Активность: |
у него проблема в том что он извлекает данные из таймера на который ничего не вешал, все что он вешал ушло в другом направлении |
09.05.2012, 19:39 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Klop
Папа римский
offline
Опыт:
13,006Активность: |
Hatsume_Hate, именно поэтому надо всё делать на 1 таймер
запускаем таймер с периодом 0.04 и делаем целочисленную на количество секунд
1.00 / 0.04 = 25 это 1 секунда
когда переменная будет равна 250 удаляем)) ((кат Код
))
пробуй от руки исправлял |
09.05.2012, 19:47 | #5
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
Всем спасибо:) тему можно закрыть Отредактировано JugHead, 12.05.2012 в 16:27. |
09.05.2012, 20:42 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|