NIKZ
Изучаю Jass
offline
Опыт:
6,036Активность: |
Почему юниты не энумятся?
Враги не енумятся и урон не наносится. В чем проблема??
((код jass
globals
hashtable hash=InitHashtable() endglobals #define m(s)=DisplayTextToPlayer(Player(0),0.,0.,s)
function Trig_Cast_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AOwk' endfunction function Filterr takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetTriggerUnit())) endfunction function DamageUnits takes nothing returns nothing
local unit c=GetEnumUnit() local unit u=LoadUnitHandle(hash,GetHandleId(c),1) call UnitDamageTarget(u,c,100.,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL,null) set c=null set u=null endfunction function Move takes nothing returns nothing
local timer t=GetExpiredTimer() local integer h=GetHandleId(t) local unit u=LoadUnitHandle(hash,h,1) local unit c=GetEnumUnit() local group g=CreateGroup() local integer y=LoadInteger(hash,h,1) m("cr locals") call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),250.,Filter(function Filterr)) call ForGroup(g,function DamageUnits) m("for gr") if y==3 then call DestroyTimer(t) call DestroyGroup(g) call FlushChildHashtable(hasha,1) endif set g=null set c=null set u=null set t=null endfunction function Trig_Cast_Actions takes nothing returns nothing
local unit u=GetSpellAbilityUnit() local timer t=CreateTimer() local integer yi=0 call SaveInteger(hash,GetHandleId(t),1,yi) call SaveUnitHandle(hash,GetHandleId(t),1,u) call TimerStart(t,1.,true,function Move) call MoveIni(u, GetUnitFacing(u),-0, 100., 1 , 1, false, false) Это уже к моей системке. Там ничего баженного нету 100% set u=null set t=null endfunction ===========================================================================
function InitTrig_Cast takes nothing returns nothing set gg_trg_Cast = CreateTrigger() local integer index= 0 loop exitwhen index == 12 call TriggerRegisterPlayerUnitEvent(gg_trg_Cast, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) set index = index + 1 endloop call TriggerAddCondition( gg_trg_Cast, Condition( function Trig_Cast_Conditions ) ) call TriggerAddAction( gg_trg_Cast, function Trig_Cast_Actions ) endfunction )) |
20.06.2012, 22:03 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
потому что функция Move вызывается в другом потоке, чем функция Trig_Cast_Actions.
И поэтому в функции-фильтре Filterr нативка GetTriggerUnit не будет работать. Что делать? Сохрани значение GetTriggerUnit, в теле функции Trig_Cast_Actions.
По поводу оптимизации:
Перенеси действия функции-действия Trig_Cast_Actions в функцию-условию Trig_Cast_Conditions.
Аналогично проделай с Filterr и DamageUnits. Ещё много чего... мне лень писать. |
20.06.2012, 22:12 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JugHead
offline
Опыт:
1,612Активность: |
NIKZ, в фильтре значения Аргументов GetTriggerUnit() и GetSpellAbilityUnit() возвращают null. есть 2 решения: Заносить перед GroupEnum, юнита-кастера в глобалку и использовать ее там. либо загружать из хэша. Я предпочитаю 1-ый вариант. |
20.06.2012, 22:47 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NIKZ
Изучаю Jass
offline
Опыт:
6,036Активность: |
Ну вобщем сделал через глобалку, но блин, не люблю я их. |
20.06.2012, 23:53 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
Отредактировано Nerevar, 21.06.2012 в 00:08. |
20.06.2012, 23:58 | #5
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|