нормально ли юзать это:
group g = CreateGroup()
GroupEnumUnitsInRangeOfLoc(g, l, r,null)
unit u = FirstOfGroup(g)

whilenot(u==null){

if(Буль){ //сюда наш буль, вместо буля в GroupEnumUnitsInRangeOfLoc(g, l, r,null)
DoSomething
GroupRemoveUnit(g,u)
u = FirstOfGroup(g)}

else{
DoNothing
GroupRemoveUnit(g,u)
u = FirstOfGroup(g)}
}
DestroyGroup(g)
вместо этого:
group g = CreateGroup()
GroupEnumUnitsInRangeOfLoc(g, l, r,Буль)
ForGroup(g,function ________)
DestroyGroup(g)

Не знаю нафига вам плодить локал группы?
1 Глобальную группу для мгновенных действий, примеру пикнут всех в аое и нанести дмг.
2 Для долго хранящихся групп, к примеру группы для триггерных скиллов по типу Волна Силы где группа хранит уже попавшихся на время полета волны юзайте GroupUtils или прочие ресайклы групп, быстро и удобно.
Ах да, фильтры быстрее вашего перебора с проверкой в цикле, создайте N фильтров на все сулучаи жизни и юзайте на здоровье.
вот пример:

globals 
	boolexpr OnlyEnemy = null
	unit bj_lastFilterUnit = null
endglobals


function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction

function init takes nothing returns nothing
	set OnlyEnemy = Condition( function EnemyFilter )
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
Да а почему бы и нет? Разница не большая. Что цикл будет перебирать (хотя цикл у тебя какой-то странный. Из под условия можно вынести удаление юнита из группы и поиск первого юнита) , что ForGroup. Для каждой ситуации определенный метод имеет преимущество.
Мне вообще удобно не пользовать ForGroup. Я обычно делаю сразу отбор и действия в GroupEnumUnits...
21
Да вроде нормально. Хотя, помнится, в некоторых случаях приходится использовать ForGroup, например если у тебя группа не локальная и не одноразовая, или когда юнита удалять из группы нельзя/не нужно. Если у тебя группа используется в качестве фильтра - нормально. Есть ряд случаев когда подходит только ForGroup.
7
EnergyFrost:
Да а почему бы и нет? Разница не большая. Что цикл будет перебирать (хотя цикл у тебя какой-то странный. Из под условия можно вынести удаление юнита из группы и поиск первого юнита) , что ForGroup. Для каждой ситуации определенный метод имеет преимущество.
Мне вообще удобно не пользовать ForGroup. Я обычно делаю сразу отбор и действия в GroupEnumUnits...
А за странность извините, я просто писал не задумываясь код, чисто для вопроса... ну а разница чисто в том, что для forgroup нужна отдельная функция, и она не может же принимать аргументы(если может, то просветите) в итоге, если я хочешь нанести дмг, то мне нужен метод, чтоб перенести юнита, в функцию, где он уже наносит каждому члену группы урон(например).
GF RaiseD:
Да вроде нормально. Хотя, помнится, в некоторых случаях приходится использовать ForGroup, например если у тебя группа не локальная и не одноразовая, или когда юнита удалять из группы нельзя/не нужно. Если у тебя группа используется в качестве фильтра - нормально. Есть ряд случаев когда подходит только ForGroup.
Насчет удаление юнита, циклом тоже можно, просто создаешь вторую группу и помере удаления с одной группы закидуешь в другую, а после выполнения всех действий перекидываешь всех обратно
21
M1n3rva, это когда циклом. А если действие нужно произвести не мгновенно?
7
Ну извини, действие не мгновенно, почти всегда заставит тебя юзать таймер и записывать всё в хеш или глобалки.
И да, действие не мгновенное тоже можно сделать, причем легко через цикл:
2 группы, с одной удаляем в другую кидаем(если нельзя,чтоб группа руинилась)
Цикл, в теле создаем таймер под каждого юнита
Сохраняем в хеш под хэндлИд таймера
Ну а дальше ты понял)
фор групп - не использован.
21
M1n3rva, это я знаю. У меня были проблемы с использованием считывания/записи локальной группы в хэш в таймере: вроде как не получалось передать локальной группе значение без "CreateGroup()", тоесть без создания нового хэндла. Старая ссылка терялась и это вызывало утечки групп. С "ForGroup" подобного не наблюдалось.
32
Не знаю нафига вам плодить локал группы?
1 Глобальную группу для мгновенных действий, примеру пикнут всех в аое и нанести дмг.
2 Для долго хранящихся групп, к примеру группы для триггерных скиллов по типу Волна Силы где группа хранит уже попавшихся на время полета волны юзайте GroupUtils или прочие ресайклы групп, быстро и удобно.
Ах да, фильтры быстрее вашего перебора с проверкой в цикле, создайте N фильтров на все сулучаи жизни и юзайте на здоровье.
вот пример:

globals 
	boolexpr OnlyEnemy = null
	unit bj_lastFilterUnit = null
endglobals


function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction

function init takes nothing returns nothing
	set OnlyEnemy = Condition( function EnemyFilter )
endfunction
Принятый ответ
15
Да. Для мгновений лучше глобалки использовать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.