1

» WarCraft 3 / Антиспелл

Перед кастом "слоу" проверь есть ли в цели баф "амулета защиты", если нету то наноси урон
У амулета защиты нет бафа =(
Пришлось делать свой итем который даёт ауру, а при получении вражеского заклинания ауру удаляет с перезарядкой в ХХ секунд не нанося урон. Пришлось использовать глобалки на перезарядку ауры, но всё работает отлично. Вопрос закрыт.
1

» WarCraft 3 / Антиспелл

Почему эта строчка не вначале кода. В jass все локалки инициируются в верху функц. Как у вас прокатило?
Потому что внутри лупа.

Ты когда вешаешь дебаф ( ты же определяешь эту цель) сразу наноси триггерно урон. Не нужно делать проверку на наличие дебафа и потом наносить урон.
Да триггер нормально работает без дебафа, но мне нужен дебаф для проверки что нет щита от заклинаний...
1

» WarCraft 3 / Антиспелл

С таймером всё вообще перестает правильно работать. Вот код:
function Trig_StrelaLda_Actions2 takes nothing returns nothing
    local timer timerAct = GetExpiredTimer()
    local integer id = GetHandleId(timerAct)
    local unit caster = LU(Hash, id, k_caster)
    local unit dummy = LU(Hash, id, k_dummy)
    local real process = LR(Hash, id, k_process) + LR(Hash, id, k_speed)
    local group groupAct
    local group groupAct2
    local unit u = null
    
    if process > LR(Hash, id, k_maxDistance) then
        call DestroyGroup(LG(Hash, id, k_group))
        call KillUnit(dummy)
        call FlushChildHashtable(Hash, id)
        call PauseTimer(timerAct)
        call DestroyTimer(timerAct)
    else
        call SR(Hash, id, k_process, process)
      if Move2WithNormalizeCond(dummy, LR(Hash, id, k_speed), LR(Hash, id, k_angle), true, false) then
      else
        call SR(Hash, id, k_process, LR(Hash, id, k_maxDistance))
      endif  
        
        set groupAct = CreateGroup()
        call GroupEnumUnitsInRange(groupAct, GetUnitX(dummy), GetUnitY(dummy), LR(Hash, id, k_aoe), null)
        set u = FirstOfGroup(groupAct)
            if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LG(Hash, id, k_group)) then
                if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
                    if IsUnitEnemy(u, GetOwningPlayer(caster)) then
                       
                        local unit x = CreateUnit(GetOwningPlayer(caster), 'h00Z', GetUnitX(u), GetUnitY(u), 1.00)
                        call IssueTargetOrder(x, "slow", u)
                        call UnitApplyTimedLife(x, 'BTLF', 1)
                        if GetUnitAbilityLevel(u, 'B00F') > 0 then
                        call UnitDamageTarget(x, u, LR(Hash, id, k_damage), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
                        endif
                        
                        call DestroyEffect(AddSpecialEffectTarget(LS(Hash, id, k_damageEffect), u, "origin"))
                        call GroupAddUnit(LG(Hash, id, k_group), u)
                        set x = null
                        set groupAct2 = CreateGroup()
                        call GroupEnumUnitsInRange(groupAct2, GetUnitX(u), GetUnitY(u), 500, null)
                    loop
                        set u = FirstOfGroup(groupAct2)
                        exitwhen u == null
                        if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LG(Hash, id, k_group)) then
                            if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
                                if IsUnitEnemy(u, GetOwningPlayer(caster)) then
                        
                        local unit x2 = CreateUnit(GetOwningPlayer(caster), 'h00Z', GetUnitX(u), GetUnitY(u), 1.00)
                        call IssueTargetOrder(x2, "slow", u)
                        call UnitApplyTimedLife(x2, 'BTLF', 1)
                        if GetUnitAbilityLevel(u, 'B00F') > 0 then
                        call UnitDamageTarget(x2, u, LR(Hash, id, k_damage) / 2, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
                        endif
                        
                        call DestroyEffect(AddSpecialEffectTarget(LS(Hash, id, k_damageEffect), u, "origin"))
                        call GroupAddUnit(LG(Hash, id, k_group), u)
                        set x2 = null
                                endif
                            endif
                        endif
                        call GroupRemoveUnit(groupAct2, u)
                    endloop
                        call DestroyGroup(groupAct2)
                        call DestroyGroup(LG(Hash, id, k_group))
                        call KillUnit(dummy)
                        call FlushChildHashtable(Hash, id)
                        call PauseTimer(timerAct)
                        call DestroyTimer(timerAct)
                    endif
                endif
            endif
        call GroupRemoveUnit(groupAct, u)
        call DestroyGroup(groupAct)
    endif
    set caster = null
    set dummy = null
    set timerAct = null
    set groupAct = null
    set groupAct2 = null
endfunction

function Trig_StrelaLda_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local real xCaster = GetUnitX(caster)
    local real yCaster = GetUnitY(caster)
    local real xTarget = GetSpellTargetX()
    local real yTarget = GetSpellTargetY()
    local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
    local unit dummy = CreateUnit(GetOwningPlayer(caster), 'n016', xCaster, yCaster, angle)
    
    local integer level = GetUnitAbilityLevel(caster, 'A030')
    local real maxDistance = 10000
    local real damage = 500 + GetHeroStr(caster, true) * 3
    local real aoe = 125 * level
    local real speed = 900
    
    local string damageEffect = "Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl"
    
    local timer timerAct = CreateTimer()
    local integer id = GetHandleId(timerAct)
    
    if xCaster == xTarget and yCaster == yTarget then
        set angle = GetUnitFacing(caster)
    endif
    call SetUnitX(dummy, xCaster + aoe * 1.33 * Cos(angle * bj_DEGTORAD))
    call SetUnitY(dummy, yCaster + aoe * 1.33 * Sin(angle * bj_DEGTORAD))
    call SetUnitScale(dummy, aoe * 0.8 * 0.01, aoe * 0.8 * 0.01, aoe * 0.8 * 0.01)
    
    call SU(Hash, id, k_caster, caster)
    call SU(Hash, id, k_dummy, dummy)
    
    call SR(Hash, id, k_damage, damage)
    call SR(Hash, id, k_maxDistance, maxDistance)
    call SR(Hash, id, k_angle, angle)
    call SR(Hash, id, k_aoe, aoe)
    call SR(Hash, id, k_speed, speed  * 0.03)
    
    call SS(Hash, id, k_damageEffect, damageEffect)
    
    call SR(Hash, id, k_process, 0)
    call SG(Hash, id, k_group, CreateGroup())
    
    call TimerStart(timerAct, 0.03, true, function Trig_StrelaLda_Actions2)
    
    set caster = null
    set dummy = null
    set timerAct = null
endfunction

function Trig_StrelaLda_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A030'
endfunction

function InitTrig_StrelaLda takes nothing returns nothing
    set gg_trg_StrelaLda = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_StrelaLda, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_StrelaLda, Condition( function Trig_StrelaLda_Conditions ) )
    call TriggerAddAction( gg_trg_StrelaLda, function Trig_StrelaLda_Actions )
endfunction
1

» WarCraft 3 / Как сделать чтобы после обучение война здание пропадало

Можно зданию дать способность "невидимость", а войну способность "видеть скрытые войска". После обучения война удалить у него способность "видеть скрытые войска"