Привет, xgm
Я недавний гость в jass'е, до этого работал в основном в гуи. Хотел я значит вставить в свою карту скилл из way of others, болотный щит
Описание: кастер на время превращается в щит на указанного юнита, повышающий броню и полностью защищающий от магического урона
Принцип: основу скилла сделал из защитной ауры банши, обеспечив защиту от маг урона. Для брони создаём дамми и накладываем баф на основе innerfire. Заносим в массивы кастера и цель, прячем кастера, ждём время действия щита, перемещаем кастера к цели и показываем его
Проблема: дамми исправно создаётся, но с кастером ровным счётом ничего не происходит. Написал вместо прятанья убить кастера, ноль реакции. Выносил действия с ним в отдельную функцию, убирал ожидания, убирал вообще все переменные, не помогло. Ломал голову часов 5, помогите люди добрые. Заранее спасибо
ЗЫ: знаю что нужна ещё как минимум проверка умрёт ли цель до конца щита, но сейчас пытаюсь заставить работать хотя бы это
собственно весь код
function Trig_Mana_shield_Conditions takes nothing returns boolean
    if GetSpellAbilityId() == 'A022' then
    return true
    endif
endfunction

function Fucking_Bog_Shield takes integer i, integer k returns nothing
    local unit u_1
    local unit u_2
    set u_1 = udg_unit_1[i]
    set u_2 = udg_unit_2[i]
    
    call TriggerSleepAction( 0.10 )
    set udg_unit_1[i] = u_1
    call ShowUnitHide( udg_unit_1[i] )
    set u_1 = udg_unit_1[i]
    call TriggerSleepAction( 24.90 )
    set udg_unit_1[i] = u_1
    set udg_unit_2[i] = u_2
    call SetUnitPositionLoc( udg_unit_1[i], GetUnitLoc(udg_unit_2[i]) )
    call ShowUnitShow( udg_unit_1[i] )

    set udg_unit_1[k] = udg_unit_1[i]
    set udg_unit_2[k] = udg_unit_2[i]
    set udg_i = udg_i - 1
endfunction

function Trig_Mana_shield_Actions takes nothing returns nothing
    local integer i
    local integer j
    local integer k=0
    call CreateNUnitsAtLoc( 1, 'e005', GetOwningPlayer(GetSpellAbilityUnit()), GetSpellTargetLoc(), bj_UNIT_FACING )
    call UnitAddAbilityBJ( 'A01Y', GetLastCreatedUnit() )
    call IssueTargetOrderBJ( GetLastCreatedUnit(), "innerfire", GetSpellTargetUnit() )
    call UnitApplyTimedLifeBJ( 1.00, 'BTLF', GetLastCreatedUnit() )
    set i = udg_i

        set j = 1
    loop
        exitwhen j > i
    if  ( GetSpellAbilityUnit() == udg_unit_1[j] )  then
        set k=j
    else
    endif
        set j = j + 1
    endloop

    if  ( k == 0 )  then
        set i=i+1
        set udg_i=i
        set udg_unit_1[i] = GetSpellAbilityUnit()
        set udg_unit_2[i] = GetSpellTargetUnit()
    else
        set i=k
    endif

    call Fucking_Bog_Shield(i,k)
    
endfunction

//===========================================================================
function InitTrig_Mana_shield takes nothing returns nothing
    set gg_trg_Mana_shield = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Mana_shield, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Mana_shield, Condition( function Trig_Mana_shield_Conditions ) )
    call TriggerAddAction( gg_trg_Mana_shield, function Trig_Mana_shield_Actions )
endfunction

Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
НУ во первых нужно это как то без вейтов и массивов, с такой реализацией не удивительно что не работает.
Во вторых - это делается без баффов, если вы планируйте маг имун, добовляйте юниту просто спеллбук с пассивным маг имунном и скиллом на доп. защиту.
Попробуйте почитать про хештаблицы и таймеры.
28
это не джасс это гуи с локалками
quq_CCCP, в данном случае можно и вейтом обойтись
и локалками
21
quq_CCCP, на сайте нет статей непосредственно о таймерах на Jass - было бы очень неплохо напиши кто такую. Простейшая же вещь, но те кто только взялся изучать Jass редко её используют.
28
GF RaiseD, лол, что?
есть куча по дебильному способу с хэшом и написанная мной статья без хэша
или это сарказм?
2
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
Принятый ответ
21
nvc123, я не лопачу весь список ресурсов сайта, а смотрю исключительно в статьи. В статьях не нашёл ничего непосредственно о таймерах. Заюзай [!] на ресурсе о котором ты говоришь и он будет добавлен/продублирован в базу статей.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.