Помогите решить проблемку, я вот всегда делал урон перебирая юнитов через if но подумал лучше использовать ForGroup начал делать триггер и столкнулся с проблемой, как указать на кастера в отдельной функции с GetEnumUnit()? И как нанести потом урон этим выбранным юнитам

Занеси все что нужно в глобалки перед перебором
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

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

22
Занеси все что нужно в глобалки перед перебором
Принятый ответ
32
Глобальные переменные, так же в фортгруп будуттраьотать GetTriggerxxx нативки, к примеру кластер скилла
28
Я тебе несколько раз говорил, заноси локальные переменные в глобальные

globals
group TempGroup = CreateGroup()
endglobals

function mycond takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
return UnitAlive(bj_lastReplacedUnit) ... and IsUnitEnemy(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit))
endfunction

function damage takes nothing returns nothing
call UnitDamageTarget(bj_lastCreatedUnit,GetEnumUnit()...)
endfunction

function myfunc takes nothing returns nothing
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),300,Condition(function mycond))
call ForGroup(TempG,function damage)
call GroupClear(TempG)
endfunction
Можно в принципе действия сразу в фильтре делать, возвращая фолс/ничего

function mycond takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
if UnitAlive(bj_lastReplacedUnit) ... and IsUnitEnemy(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit)) then
call UnitDamageTarget(bj_lastCreatedUnit,bj_lastReplacedUnit...)
endif
return false
endfunction

function myfunc takes nothing returns nothing
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),300,Condition(​function mycond))
endfunction

Конечно в юзе вариковских переменных возможна проблема, если например в событии юнит получает урон, создаётся юнит (на гуи, используя переменную bj_lastCreatedUnit), то возможна перезапись, в таком случае достаточно использовать нигде не используемую глобалку, ну либо каждый раз вызывать юнита триггера в функции проверки, как сказал quq_CCCP

о, даже смог найти вопрос где я читал об этом, можешь заглянуть в комменты

вот тебе мини-тест, фильтр в состоянии обработать всех юнитов и продолжить выполнять следующие действия, а цикл обрывает поток
раскрыть
globals
    integer i = 0
    integer count = 1330 // колво юнитов на карте
    group TempG = CreateGroup()
endglobals

function mycond takes nothing returns boolean
    set i = i+1
    call BJDebugMsg(I2S(i))
    return true
endfunction

function Trig_sd_Actions takes nothing returns nothing
    call GroupEnumUnitsInRect(TempG,bj_mapInitialPlayableArea,Condition(function mycond))
    call BJDebugMsg("проигнорировано юнитов: "+I2S(count-i))
    call BJDebugMsg("через 3 сек посмотрим сколько юнитов обработает цикл")
    call TriggerSleepAction(3)
    set i = 0
    loop
        set bj_lastCreatedUnit = FirstOfGroup(TempG)
        exitwhen bj_lastCreatedUnit == null
        set i = i+1
        call BJDebugMsg(I2S(i))
        call GroupRemoveUnit(TempG,bj_lastCreatedUnit)
    endloop
    call BJDebugMsg("проигнорировано юнитов: "+I2S(i))
    // поток обрывается и это сообщение мы даже не увидим, все последующие действия не будут выполнены
endfunction

function s takes nothing returns nothing
    set i = i+1
endfunction

function show takes nothing returns nothing
    set i = 0
    call ForGroup(TempG,function s)
    call BJDebugMsg("проигнорировано юнитов: "+I2S(i))
endfunction

//===========================================================================
function InitTrig_sd takes nothing returns nothing
    set gg_trg_sd = CreateTrigger(  )
    call TriggerAddAction( gg_trg_sd, function Trig_sd_Actions )
    call TimerStart(CreateTimer(),4,false,function show)
endfunction



Загруженные файлы
14
rsfghd:
Я тебе несколько раз говорил, заноси локальные переменные в глобальные

globals
group TempGroup = CreateGroup()
endglobals

function mycond takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
return UnitAlive(bj_lastReplacedUnit) ... and IsUnitEnemy(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit))
endfunction

function damage takes nothing returns nothing
call UnitDamageTarget(bj_lastCreatedUnit,GetEnumUnit()...)
endfunction

function myfunc takes nothing returns nothing
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),300,Condition(function mycond))
call ForGroup(TempG,function damage)
call GroupClear(TempG)
endfunction
Можно в принципе действия сразу в фильтре делать, возвращая фолс/ничего

function mycond takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
if UnitAlive(bj_lastReplacedUnit) ... and IsUnitEnemy(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit)) then
call UnitDamageTarget(bj_lastCreatedUnit,bj_lastReplacedUnit...)
endif
return false
endfunction

function myfunc takes nothing returns nothing
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),300,Condition(​function mycond))
endfunction

Конечно в юзе вариковских переменных возможна проблема, если например в событии юнит получает урон, создаётся юнит (на гуи, используя переменную bj_lastCreatedUnit), то возможна перезапись, в таком случае достаточно использовать нигде не используемую глобалку, ну либо каждый раз вызывать юнита триггера в функции проверки, как сказал quq_CCCP

о, даже смог найти вопрос где я читал об этом, можешь заглянуть в комменты

вот тебе мини-тест, фильтр в состоянии обработать всех юнитов и продолжить выполнять следующие действия, а цикл обрывает поток
раскрыть
globals
    integer i = 0
    integer count = 1330 // колво юнитов на карте
    group TempG = CreateGroup()
endglobals

function mycond takes nothing returns boolean
    set i = i+1
    call BJDebugMsg(I2S(i))
    return true
endfunction

function Trig_sd_Actions takes nothing returns nothing
    call GroupEnumUnitsInRect(TempG,bj_mapInitialPlayableArea,Condition(function mycond))
    call BJDebugMsg("проигнорировано юнитов: "+I2S(count-i))
    call BJDebugMsg("через 3 сек посмотрим сколько юнитов обработает цикл")
    call TriggerSleepAction(3)
    set i = 0
    loop
        set bj_lastCreatedUnit = FirstOfGroup(TempG)
        exitwhen bj_lastCreatedUnit == null
        set i = i+1
        call BJDebugMsg(I2S(i))
        call GroupRemoveUnit(TempG,bj_lastCreatedUnit)
    endloop
    call BJDebugMsg("проигнорировано юнитов: "+I2S(i))
    // поток обрывается и это сообщение мы даже не увидим, все последующие действия не будут выполнены
endfunction

function s takes nothing returns nothing
    set i = i+1
endfunction

function show takes nothing returns nothing
    set i = 0
    call ForGroup(TempG,function s)
    call BJDebugMsg("проигнорировано юнитов: "+I2S(i))
endfunction

//===========================================================================
function InitTrig_sd takes nothing returns nothing
    set gg_trg_sd = CreateTrigger(  )
    call TriggerAddAction( gg_trg_sd, function Trig_sd_Actions )
    call TimerStart(CreateTimer(),4,false,function show)
endfunction



Чел прикинь я создал библиотеку и она пашет)))))) хз как но пашет я и сам не ожидал понаставил как ты и говорил глобал пепеменные через private создал группу одну для нанесения урона как ты и говорил и все работает как часы это ваще нечто что то типа сверхестественное явление

Я бля теперь мега супер охринительный читер кодер

quq_CCCP:
Глобальные переменные, так же в фортгруп будуттраьотать GetTriggerxxx нативки, к примеру кластер скилла
Друг мой что с твоей речевой апаратурой? Я не могу прочитать твои письма
28
Гуванч, лол, думаю хвастаться или радоваться этим нужно немного в другом месте)
ах да, не матерись, а то банов от модераторов отхватишь
32
Писал с телефона, не очень удобно как ты понимаешь.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.