У меня не так много фильтров. 1 или 2. На каждую способность свой фильтр создавать или хватит и одного на всю карту. Где-то в старых вопросах/ответах говорилось что можно использовать 1 фильтр на всю карту?

а как можно сделать без boolexpr-а?
Просто использовать функции.
`
LOADING AD...
23
Похожие вопросы:

ответ
ALL_Remove = false
чтотооченьважное
ALL_Remove = true
как сложно то было

30
Как правильно использовать boolexpr?
Не использовать boolexpr.
Replies (2)
4
nazarpunk, а как можно сделать без boolexpr-а? Просто ссылаясь на фильтр?
30
а как можно сделать без boolexpr-а?
Просто использовать функции.
Accepted answer
28
Если условия фильтров одни и те же, то одного достаточно
32
Ну как правило делают заготовку фильтров на все случаи жизни и используют их для for group.
23
Можно 1 фильтр, можно и много. Можно в него как в матрешку засунуть несколько "базовых" функций boolean, и на каждый фильтр делать разное сочетание этих функций.
Использовать - для поиска юнитов вокруг точки или юнита через group enum units; в триггер запихивать, в событие, если надо не на всех юнитов его юзать; для for group; для множества абилок можно сделать массив и пихать фильтры по индексу
Replies (24)
4
EugeAl, Ну, мне главное не удобство, а высокая скорость работы нужна)
30
а высокая скорость работы нужна)
Высокая скорость работы и булэкспры. Или вообще не дай боже гуй-муй.
23
Joma, Скорость отличная, проблем не возникало с тормозами.
Ещё пример, добавлю
Допустим надо сделать 60 абилок
они кастуются по группе юнитов каждая через даммикаст
у них всех разные ид, приказы, итд
если у героя есть навык, цена маны меньше
имеются другие ауры, защищающие войска от разных абилок каждая
как это сделать?
Проще всего сделать параметры таблицей, записать всё в массивы, и юзать 1-2 простыми скриптами все абилки по поиску индекса. За неимением в джассе function array, boolexpr это выход )
25
неимением в джассе function array
Это боль :(
Как те-же многомерные массивы и другие фичи программирования, которым уже больше 20-30 лет.
23
konvan5, многомерный массив можно сделать, к счастью. Через "константы столбцов" в духе set a = array [i], set b = array[10+i], и тд ) а функции- боль, да )
30
и юзать 1-2 простыми скриптами все абилки по поиску индекса.
А поиск индекса обязательно написать O(n). Иначе никакого быстродействия не будет.
30
Как те-же многомерные массивы и другие фичи программирования
Ну вот к примеру есть AngelScript с этими вашими фичами. Что-то я не вижу чтоб фанаты производительности на него переходили.
25
nazarpunk, и это шикарно, что хоть фанаты делают все, что должны были cделать маленькие инди-корпорации изначально :D
30
konvan5, фанаты делают. А те кто ноет про производительность что-то не спешат пользоваться и горазды только обмазываться гуй-муй и ныть.
4
nazarpunk, оно ведь только вчера вышло. Возможно требуется время.
30
Возможно требуется время.
Возможно требуется нечто другое.
23
nazarpunk, что такое O(n)? Функция по поиску?
konvan5, что ж поделать) главное - работает)
25
EugeAl, O(n) в программировании обозначает сложность (или время) алгоритма, что в данном случае говорит о выполнении n операций для нахождения. К примеру плохим временм будет O(n*n) для таких поисков (это как цикл в цикле, только зачем так делать для поиска, это вопрос, но кто-то может сделать), или O(2*n). Идеал - это O(1), 1 операция для проверки без циклов.
30
это как цикл в цикле, только зачем так делать для поиска, это вопрос, но кто-то может сделать
Квадратичную сложность гуишники через одного юзают, когда собственные ауры делают.
23
konvan5, Ясно, спасибо. А О(100) это плохо или нормально? С циклом
30
Ясно, спасибо. А О(100) это плохо или нормально?
Если ты напишешь сортировку массива произвольной длинны за O(100), то тебе дадут Нобелевку.
25
EugeAl, если 100 элементов в массиве, то тогда нормально :)
30
konvan5:
При ста элементах это же O(n).
25
nazarpunk, ну так он же не спрашивал, сколько элементов у него :D
23
nazarpunk, только произвольно до 100 ячеек смогу)
konvan5, спасибо, ок)
30
только произвольно до 100 ячеек смогу)
Сортировка 100 элементов за 100 действий это O(n). Уж очень хочу на это посмотреть. Есть пример?
23
nazarpunk, не совсем сортировка, а определение индекса массива по значению. Подходит?
4
Или вообще не дай боже гуй-муй.
Разве на ГУИ можно использовать boolexpr? Нет же, ведь.
30
Разве на ГУИ можно использовать boolexpr?
Можно.
38
Как те-же многомерные массивы и другие фичи программирования, которым уже больше 20-30 лет.
Временные глобальные переменные для широкого спектра функций сразу, благо один поток и можно спокойно выгружать и загружать
Replies (6)
4
ScorpioT1000, Получается, я могу использовать одну глобальную переменную, условно "Кастер". И допустим, примерно в одно и тоже время разные игроки применят свои способности, в которых запустятся периодические таймеры. И в каждой способности каждого игрока будут прогонять поочередно эту переменную "Кастер"? И никаких нестыковок же не будет?
38
Joma, нет, надо выгружать и загружать при моментальном вызове. Это для замены массивов как аргумента. Если есть таймеры - это уже нужно адресное выделение xgm.guru/p/wc3/w3specialprogramming#h4
4
ScorpioT1000, Не дописал свой вопрос более точно)
Если примерно такой:
globals
	unit Caster = null	//Эту переменную используют все
endglobals

function My_Filter takes nothing return boolean
	return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(Caster))	//Вот она!
endfunction

function Two takes nothing return nothing
	local timer t = GetExpiredTimer()
	local integer id = GetHandleId(t)
	local unit caster = LoadUnitHandle(Hash, id, 1)
	
	set Caster = caster	//Вот она!
	//Тут какие-то действия с группой
	
	set t = null
	set caster = null
endfunction

function One takes nothing return nothing
	local unit caster = GetTriggerUnit()
	local timer t = CreateTimer()
	local integer id = GetHandleId(t)
	
	call SaveUnitHandle(Hash, id, 1, caster)
	call TimerStart(t, 0.035, true, function Two)
	
	set caster = null
	set t = null
endfunction
То, не проканает?
38
Joma, советую почитать статьи
30
То, не проканает?
Ну вот что мешает писать код руками?
globals
    unit Caster
    integer CasterId
    unit Target
    timer Timer
    integer TimerId
    group Group = CreateGroup()
endglobals

function isTargetEnemy takes nothing returns boolean
    return IsUnitEnemy(Caster, Target)
endfunction

function GroupIterator takes nothing returns nothing
    set Target = GetEnumUnit()

    if not isTargetEnemy() then
        return
    endif

    // Продолжаем
endfunction

function Two takes nothing returns nothing
    set Timer = GetExpiredTimer()
    set TimerId = GetHandleId(Timer)
    set Caster = LoadUnitHandle(Hash, TimerId, 'cstr')

    call ClearGroup(Group)
    call GroupEnumUnitsInRange(Group, GetUnitX(Caster), GetUnitY(Caster), 500, null)
    call ForGroup(Group, function GroupIterator)
endfunction

function One takes nothing returns nothing
    set Caster = GetTriggerUnit()
    set Timer = CreateTimer()
    set TimerId = GetHandleId(Timer)

    call SaveUnitHandle(Hash, TimerId, 'cstr', Caster)
    call TimerStart(t, 0.035, true, function Two)
endfunction
4
nazarpunk, Вообще-то я ни это имел в виду.
ScorpioT1000, Получается, я могу использовать одну глобальную переменную, условно "Кастер". И допустим, примерно в одно и тоже время разные игроки применят свои способности, в которых запустятся периодические таймеры. И в каждой способности каждого игрока будут прогонять поочередно эту переменную "Кастер"? И никаких нестыковок же не будет?
вообще-то я спрашивал про то, что если например у меня будет 1 фильтр (пусть будет 1 булэкспр) и 1 глобальная переменная условно "Кастер". И если её будут использовать все игроки для фильтра юнитов (не враг ли этот фильтруемый юнит к нам) в многократном таймере - то не будет ли каких либо проблем, вроде в одно и тоже время 2 и более игроков будут использовать эту самую переменную "кастер". Грубо говоря из MUI, не превратиться ли это в "Не MUI"?
30
а определение индекса массива по значению
Если тебе такое понадобилось, то что-то явно пошло не так.
Replies (2)
23
nazarpunk, что то - это нежелание делать хэш таблицу. Ибо геморрой с функциями, а не просто обращения к значениям.
30
EugeAl, это не нежелание а банальная рукожопость.
To leave a comment please sign in to the site.