Добавлен  scopterectus 
                            
                            
                            
                            
                            
                            
                        
                        
                    scope StormHammer
    globals
        public    constant    integer      ABILITY_ID                             =    'A019'
        public    constant    integer      THUNDERCLAP_ID                         =    'A00K'
        public    constant    string       THUNDERCLAP_ORDER                      =    "thunderclap"
        public    constant    string       EFFECT_PATH                            =    "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl"
        public    constant    string       LIGHTNING_NAME                         =    "CLPB"
        public    constant    real         LIGHTNING_HEIGHT                       =    9900.0
        public    constant    real         LIGHTNING_LIFE_TIME                    =    0.1
    endglobals
    globals
        public    constant    group       enumUnits           =    CreateGroup()
        public                boolexpr    boolexprForGroup    =    null
    endglobals
    public function Conditions takes nothing returns boolean
        local integer abilityLevel    = GetUnitAbilityLevel( GetAttacker(), ABILITY_ID )
        local real    currentMana     = GetUnitState( GetAttacker(), UNIT_STATE_MANA )
        local real    abilityManaCost = GetAbilityManaCost( ABILITY_ID, abilityLevel )
        local boolean a = ( abilityLevel >= 1 )
        local boolean b = ( currentMana >= abilityManaCost )
        local boolean c = ( not IsAbilityOnCooldown( GetUnitAbility( GetAttacker(), ABILITY_ID ) ) )
        return ( a ) and ( b ) and ( c )
    endfunction
    public function GroupCallback takes nothing returns boolean
        local unit   filterUnit         = GetFilterUnit()
        local unit   attackingUnit      = bj_lastCreatedUnit
        local player attackingUnitOwner = bj_groupEnumOwningPlayer
        local boolean a = not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE)
        local boolean b = IsUnitEnemy(filterUnit, attackingUnitOwner)
        local boolean c = GetWidgetLife(filterUnit) > 0.405
        if ( a ) and ( b ) and ( c ) then
            call UnitDamageTarget( attackingUnit, filterUnit, 125.0, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
        	call CreateFloatingTextTag( null, FLOATING_TEXTTAG_CRITICAL_STRIKE, R2I( 125.0 ), GetUnitX( filterUnit ), GetUnitY( filterUnit ) )
        endif
        
        set filterUnit    = null
        set attackingUnit = null
        return false
    endfunction
    public function Actions takes nothing returns nothing
        local unit    victim          = GetTriggerUnit()
        local unit    attacker        = GetAttacker()
        local real    victimZ         = GetUnitFlyHeight(victim)
        local real    victimX         = GetUnitX(victim)
        local real    victimY         = GetUnitY(victim)
        local integer abilityLevel    = GetUnitAbilityLevel( attacker, ABILITY_ID )
        local integer abilityManaCost = GetAbilityManaCost( ABILITY_ID, abilityLevel )
        local real    abilityCooldown = GetAbilityDataCooldown( GetUnitAbility( attacker, ABILITY_ID ), abilityLevel )
        local real    newManaState    = GetUnitState( attacker, UNIT_STATE_MANA ) - abilityManaCost
        call IssueImmediateOrder( attacker, "stop" )
        call StartAbilityCooldown( attacker, ABILITY_ID, abilityCooldown )
        call SetUnitState( attacker, UNIT_STATE_MANA, newManaState )
        set bj_lastCreatedUnit       = attacker
        set bj_groupEnumOwningPlayer = GetOwningPlayer(attacker)
        call GroupEnumUnitsInRange( enumUnits, victimX, victimY, 675.0, boolexprForGroup )
//      call GroupClear(enumUnits)
        set bj_lastCreatedUnit       = null
        set bj_groupEnumOwningPlayer = null
        call CreateLightningTimed( LIGHTNING_NAME, true, victimX, victimY, LIGHTNING_HEIGHT, victimX, victimY, victimZ, LIGHTNING_LIFE_TIME )
        call CasterCastAbilityImmediate( GetOwningPlayer(attacker), victimX, victimY, victimZ, THUNDERCLAP_ID, 1, THUNDERCLAP_ORDER )
        call DestroyEffect( AddSpecialEffect( EFFECT_PATH, victimX, victimY ) )
        set victim        = null
        set attacker      = null
    endfunction
endscope
function InitTrig_StormHammer takes nothing returns nothing
    call PreloadAbility  ( StormHammer_ABILITY_ID     )
    call PreloadAbility  ( StormHammer_THUNDERCLAP_ID )
    call PreloadEffect   ( StormHammer_EFFECT_PATH    )
    call PreloadLightning( StormHammer_LIGHTNING_NAME )
    set StormHammer_boolexprForGroup = Condition(function GroupCallback)
    set gg_trg_StormHammer = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_StormHammer, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_StormHammer, Condition( function StormHammer_Conditions ) )
    call TriggerAddAction( gg_trg_StormHammer, function StormHammer_Actions )
endfunctionПринятый ответ
 ScopteRectuS, у тебя где то перезаписывается bj_lastCreatedUnit
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
    
        
            
                `
            
            
                
        
    
    ОЖИДАНИЕ РЕКЛАМЫ...
            
                    
                        Чтобы оставить комментарий, пожалуйста, войдите на сайт.
                    
                
             
                        
                        
                    
 WC3
                                WC3
                            



 
                    
                
т.к. является велосипедом
ScopteRectuS, 1 раз это при первом запуске системы?
или 1 раз при каждом вызове GroupEnumUnitsInRange?
и убери обнуление бж переменных наподобие bj_lastCreatedUnit
они ведь глобальные
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
Ред. scopterectus
Ред. nvc123
первая итерация нанесла урон
сработал триггер на получение урона и перезаписал переменные
пошла 2 итерация
новые потоки имеют приоритет над ещё работающем
т.е. если на середине кода стартанул 2 поток то будет выполнятся он а только потом 2 половина кода
на этом основаны некоторые фишки в вар3
например выдача невидимых предметов
и вообще я хз кто научил вас юзать бж переменные
как по мне за такое расстреливать надо
А за пояснения спасибо.
nvc123, хотел задать ещё один вопрос по выше написанному коду:
Если внутри функции GroupCallback() вызвать функцию GetAttacker(), то она почему-то возвращает того атакующего юнита, которого я пытался передать с помощью глобальных переменных. Это нормально вообще? Если всё и так работает, то зачем передавать данные с помощью глобальных переменных, когда можно получить юнитов с помощью подобных функции?