Тут есть пару вопросов мой триггер почему то срабатывает иногда дважды. Его суть что юнит с шансом наносит урон по области. Первый вопрос можно ли изначально выключенные приватные триггеры включить(чет не включаются). Второе по самому триггеру видно что иногда она срабатывает дважды, а может и более.(Система получения урона подключена, надо будет скину)
Сам код:
scope Retrebiution initializer OnInit

    globals
        private constant integer SpellId = 'A00W'

        private unit Caster
        private boolexpr EnemyFilter
    endglobals

    private function IsAlive takes unit whichUnit returns boolean
        return GetUnitTypeId( whichUnit ) > 0 and not IsUnitType( whichUnit, UNIT_TYPE_DEAD ) and not IsUnitType( whichUnit, UNIT_TYPE_STRUCTURE )
    endfunction

    private function EnemyFilterFunc takes nothing returns boolean
        return IsAlive( GetFilterUnit() ) and IsUnitEnemy( GetFilterUnit(), GetOwningPlayer( Caster ) )
    endfunction 
    
    private function GroupFilter takes unit caster returns boolexpr
        set Caster = caster
        return EnemyFilter
    endfunction
    
    private function Actions takes nothing returns nothing
        local unit caster = GetEventDamageSource()
        local integer level = GetUnitAbilityLevel(caster, SpellId)
        local real radius = 100 + level * 25
        local real damage = 10 + 25 * level
        local integer chance = 19 + level * 1
        local integer random
        local group g 
        local unit u
        
            
        set random = GetRandomInt(1, 100)

        if chance > random then
            set g = CreateGroup()
            call GroupEnumUnitsInRange(g, GetUnitX(caster),GetUnitY(caster), radius, GroupFilter( caster ))
                loop
                    set u = FirstOfGroup(g)
                    exitwhen u == null          
                        call UnitDamageTarget( caster, u, damage, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, null) 
                        call DestroyEffect( AddSpecialEffectTarget ( "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl", u, "origin" ) )
                        call GroupRemoveUnit(g, u)
                    endloop
            call DestroyGroup(g)
        endif
        
    
        set g = null
        set caster = null
    endfunction
    
    private function Conditions takes nothing returns boolean
        return GetEventDamage() > 0.00 and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) and GetUnitAbilityLevel(GetEventDamageSource(), SpellId) > 0
    endfunction
    
    private function OnInit takes nothing returns nothing
        set gg_trg_Retrebiution = CreateTrigger(  )
        //call DisableTrigger( gg_trg_Retrebiution )
        call TriggerAddCondition( gg_trg_Retrebiution, Condition( function Conditions  ) )
        call TriggerAddAction( gg_trg_Retrebiution, function Actions  )
        
        set EnemyFilter = Filter( function EnemyFilterFunc )
    endfunction

endscope

Принятый ответ

Перед тем как нанести урон отключай тригер gg_trg_Retrebiution, после включай его
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
1
7 месяцев назад
0
Так в одном я допер, срабатывает она повторно из за урона нанесенного этой же способностью.
1
29
7 месяцев назад
1
Шёл 2к23 год…
private function IsAlive takes unit whichUnit returns boolean
        return GetUnitTypeId( whichUnit ) > 0 and not IsUnitType( whichUnit, UNIT_TYPE_DEAD ) and not IsUnitType( whichUnit, UNIT_TYPE_STRUCTURE )
    endfunction
0
13
7 месяцев назад
Отредактирован Borodach
0
Перед тем как нанести урон отключай тригер gg_trg_Retrebiution, после включай его
Принятый ответ
0
1
7 месяцев назад
0
Borodach, сработало, вроде тривиальное решение но как то сам до него не догадался.

nazarpunk, В чем суть претензии, пишу как умею
1
29
7 месяцев назад
1
В чем суть претензии, пишу как умею
В том, что существует функция UnitAlive.
0
13
7 месяцев назад
0
Ну и лаконичнее лучше сделать "свитчер". Булевская переменная в триггере на получение урона.
Если switchDamage == true
switchDamage = false
return
А перед нанесением урона ставить switchDamage = true
Чтобы оставить комментарий, пожалуйста, войдите на сайт.