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

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

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

offline
Опыт: 383
Активность:
При касте вылетает с фаталом =(
При касте заклинания вар вылетает с фаталом=(
что тут неверно:

Код:
function CastFilter takes nothing returns boolean
    return GetSpellAbilityId() == 'A007'
endfunction
    
function FilterUnit takes unit cu returns boolean
    return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(cu)) and GetWidgetLife(GetFilterUnit())>0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)
endfunction

function Action takes nothing returns nothing 
    local unit cu = GetSpellAbilityUnit()
    local integer lvl = GetHeroLevel(cu)
    local integer m = lvl*200
    local integer h = lvl*750 
    local real xc = GetUnitX(cu)
    local real yc = GetUnitY(cu)
    local group gr = CreateGroup()
    local boolexpr b = Condition(function FilterUnit)
    call SetUnitManaBJ(cu,(GetUnitStateSwap(UNIT_STATE_MANA,cu) - m ))  
    call GroupEnumUnitsInRange(gr, xc, yc, 600+25*lvl, b) 
   
    loop
       exitwhen FirstOfGroup(gr) == null
       call SetUnitLifeBJ(FirstOfGroup(gr),(GetUnitStateSwap(UNIT_STATE_LIFE, FirstOfGroup(gr))+h))
       call GroupRemoveUnit(gr,FirstOfGroup(gr))
    endloop

    set cu=(null)
    set xc=0
    set yc=0
    set gr=(null)
    set lvl=0
    set gr=(null)
    set b=(null)
    set h=0
endfunction
    
//==== Init Trigger VH ====
function InitTrig_VH takes nothing returns nothing
    set gg_trg_VH = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_VH ,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_VH , Condition(function CastFilter))
    call TriggerAddAction(gg_trg_VH , function Action)
endfunction
Старый 21.01.2010, 14:32
agentex

offline
Опыт: 34,834
Активность:
такие циклы лучше не надо делать, чревато..
зачем столкьо вызовов ферстофгруп? 1 раз за итерацию записать в локалку и работать. но по хорошему нужно ForGroup ом делать а не так
Старый 21.01.2010, 15:08
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
globals
    integer h=0
endglobals

function CastFilter takes nothing returns boolean
    return GetSpellAbilityId() == 'A007'
endfunction
    
function FilterUnit takes nothing returns boolean
    local unit u=GetFilterUnit()
    if (IsUnitAlly(u,GetOwningPlayer(u)) and GetWidgetLife(u)>0.405 and not IsUnitType(u,UNIT_TYPE_STRUCTURE) and not IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE)) then
        call SetWidgetLife(u,GetUnitLife(u)+h)
    endif
    u=null
    return false
endfunction

function Action takes nothing returns nothing 
    local unit cu = GetSpellAbilityUnit()
    local integer lvl = GetHeroLevel(cu)
    local group gr = CreateGroup()
    local boolexpr b = Filter(function FilterUnit)
    call SetUnitMana(cu,GetUnitState(cu,UNIT_STATE_MANA) - lvl*200))  
    h = lvl*750
    call GroupEnumUnitsInRange(gr,GetUnitX(cu),GetUnitY(cu),600+25*lvl,b) 
    set cu=null
    set gr=null
endfunction
    
//==== Init Trigger VH ====
function InitTrig_VH takes nothing returns nothing
    set gg_trg_VH = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_VH ,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_VH , Condition(function CastFilter))
    call TriggerAddAction(gg_trg_VH , function Action)
endfunction
Hellfim добавил:
callback-функции не могут принимать аргументов.
Старый 21.01.2010, 15:22
Sunn
To feel joy, not be blue
offline
Опыт: 4,975
Активность:
Попробуй этот код
» раскрыть
Код:
function FilterUnit takes nothing returns boolean
    local unit u = GetFilterUnit ()
    local unit v = GetSpellAbilityUnit ()
    local player p = GetOwningPlayer (v)
    if IsUnitAlly(u, p) and GetWidgetLife (u) > 0.405 and not IsUnitType (u,UNIT_TYPE_STRUCTURE) and not IsUnitType (u,UNIT_TYPE_MAGIC_IMMUNE) then
        call SetUnitState(u, UNIT_STATE_LIFE, RMaxBJ (0., (GetUnitState (u, UNIT_STATE_LIFE) + GetHeroLevel (v) * 750.)))
    endif
    set u = null
    set v = null
    set p = null
    return false
endfunction

function Actions takes nothing returns boolean
    local unit u
    local group g
    local boolexpr b
    if GetSpellAbilityId() == 'A007' then
        set u = GetSpellAbilityUnit ()
        set g = CreateGroup ()
        set b = Condition (function FilterUnit) 
        call SetUnitState(u, UNIT_STATE_MANA, RMaxBJ (0., (GetUnitState (u, UNIT_STATE_MANA) - GetHeroLevel (u) * 200.)))
        call GroupEnumUnitsInRange (g, GetUnitX (u), GetUnitY (u), 600. + 25. * GetHeroLevel (u), b) 
        call DestroyGroup (g)
        call DestroyBoolExpr (b)
        set u = null
        set g = null
        set b = null
    endif
    return false
endfunction

function InitTrig_VH takes nothing returns nothing
    local integer i = 0
    local trigger t = CreateTrigger ()
    local player p 
    loop
        set p = Player (i) 
        call TriggerRegisterPlayerUnitEvent (t, p, EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set i = i + 1
        exitwhen i == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition (t, Condition (function Actions))
    set t = null
    set p = null
endfunction

Насчет твоего варианта - странно, что оно вобще у тебя компилировалось, т.к. ты в функцию-фильтр передавал значение, а этого делать нельзя.
Не создавай локальные переменные нативных типов(аля integer, real), если тебе надо их использовать меньше скажем 5-ти раз. Уж лучше просто вставить функцию чем тратить время на аллокацию... и обнулять целочисленные и реальные их тоже не надо.
При обнулении хендлов не обязательно нулл в скобках писать... Ну и утечки у тебя, куда ж без них.

Sunn добавил:
ъ, хелл опередил...

Sunn добавил:
Кстати, если у Cheguevar'ы, нет жнгп то твой код не заработает О.о
Старый 21.01.2010, 15:24
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Не создавай локальные переменные нативных типов(аля integer, real), если тебе надо их использовать меньше скажем 5-ти раз.
Ересь.
Достаточно от 2-3 раз уже следует создавать.
Кстати, если у Cheguevar'ы, нет жнгп то твой код не заработает О.о
Ну значит бед ляк для чегевары.
Старый 21.01.2010, 15:38
Cheguevara

offline
Опыт: 383
Активность:
не, жнгп есть=)
всем спс=)
Cheguevara добавил:
еще и раскритиковали утечками=)
Старый 21.01.2010, 22:58
Закрытая тема

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

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

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

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



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