Мне нужно МАКСИМАЛЬНО оптимизировать 2 кода, где проверяются юниты с помощью групп. Как всё это преобразить в фильтры. Код 1. Тут есть глобальная группа udg_MagesGroup, которая в итоге должна быть постоянной, то есть остаться с тем же составом юнитов.
Code
local integer uid local unit un local unit uc local unit ur local player p local group h1 = CreateGroup() local group h2 = CreateGroup() local group h3 = CreateGroup()
loop set un = FirstOfGroup(udg_MagesGroup) exitwhen un == null call GroupRemoveUnit( udg_MagesGroup, un ) call GroupAddUnit( h1, un ) call GroupEnumUnitsInRange( h2, GetWidgetX(un), GetWidgetY(un), 900., null ) set uid = GetHandleId(un) loop set uc = FirstOfGroup(h2) exitwhen uc == null call GroupRemoveUnit( h2, uc ) set p = GetOwningPlayer(un) if (тут мои всякие условия, их очень много) then call GroupAddUnit( h3, uc ) endif endloop set ur = GroupPickRandomUnit(h3) call SaveAgentHandle(udg_Hash, uid, 445, ur) call IssueTargetOrderById( un, 851971, ur ) endloop
loop set un = FirstOfGroup(h1) exitwhen un == null call GroupRemoveUnit( h1, un ) call GroupAddUnit( udg_MagesGroup, un ) endloop
Код 2. Тут есть глобальная группа udg_MagesGroup, которая в итоге должна быть постоянной, то есть остаться с тем же составом юнитов.
Code
local integer uid local unit un local group g = CreateGroup() local real x1 local real y1 local real x2 local real y2
set un = FirstOfGroup(udg_MagesGroup) exitwhen un == null set uid = GetHandleId(un) call GroupRemoveUnit( udg_MagesGroup, un ) call GroupAddUnit( g, un ) set x1 = LoadReal(udg_Hash, uid, 460) set y1 = LoadReal(udg_Hash, uid, 461) set x2 = GetWidgetX(un) set y2 = GetWidgetY(un) if x1 == x2 and y1 == y2 then (Тут мои действия) elseif x1 != x2 or y1 != y2 then (Тут тоже мои действия) endif call SaveReal(udg_Hash, uid, 460, x2) call SaveReal(udg_Hash, uid, 461, y2) endloop
loop set un = FirstOfGroup(g) exitwhen un == null set uid = GetHandleId(un) call GroupRemoveUnit( g, un ) call GroupAddUnit( udg_MagesGroup, un ) endloop
call DestroyGroup(g) set g = null set un = null
Напишите мне плз как это должно выглядеть с фильтрами
ForGroup - одна native'ка, хотя и неизвестно, что у нее внутри, она явно должна быть быстрее манипуляций с созданием временной группы. Может, помнишь, был на сайте такой человек, rixt7956, он даже несколько функций написал, вроде копирования юнитов из одной группы в другую, лишь бы не использовать ForGroup. А зря.
В первом коде, у меня используется 3 локальные группы + 1 глобальная. 1 локалка для "переливания" из глобальной в локальную, и обратно. 2 локалка, группа внутри группы - выделение всех юнитов в радиусе 900 от выбранного юнита из глобальной группа. 3 локалка, это "отфильтрованные" юнита 2-ой локальной группы, откуда в итоге выбирается рандомный юнит.
Если сделать это с ForGroup, то у меня получаеся запускается функция ForGroup, а оттуда N-ное количество раз запускается фильтр, проверяющий всех юнит в радиусе 900. "Отфильтрованные" юниты будут сохранены другую, новую глобальную/локальную группу, откуда будет выбран рандомный юнит. Тут не используются локальные группы, но зато запускается функция из функции. Раз у меня карта на 10 игроков, то запускаться она может от 0 до 10 раз.
Так что же тут быстрее выходит, ForGroup или локалки?
Сообщение отредактировал FatalBlade - Пятница, 06 Января 2012, 16:24:36
Если в группе уже есть юниты, и их не нужно терять - ForGroup. Если юниты есть, но они больше не нужны - цикл. Если в группу набираются юниты - фильтры.
Ок, и последний вопрос. Если для юнита U из глобальной группы выбраны все юниты в радиусе 900, и для каждого из них нужно что то сравнивать юнитом U... Короче как передать юнита U в фильтр? А то мне в фильтре нужно например проверять владельцев юнитов U и фильтрованного юнита.
Занести U в глобальную переменную. Вернее, можно даже не U, а GetOwningPlayer(U).
Весь этот процесс может происходить сразу хоть с 10 игроками. Если уж глобалка то массив нужен, не? А нельзя что бы функция что то брала? Если есть "takes nothing returns nothing", и раз можно что то возвращать, значит можно и получать. Тогда и глобалки не нужны.
function FilterUnits takes nothing returns boolean local unit un = GetFilterUnit() local player p = GetOwningPlayer(udg_Mage) local integer uid = GetHandleId(udg_Mage)
if (Тут очень много условий) then set un = null set p = null return true else set un = null set p = null return false endif endfunction
function FilterMages takes nothing returns nothing local integer uid = GetHandleId(GetEnumUnit()) local group g = CreateGroup() local unit un set udg_Mage = GetEnumUnit()
call GroupEnumUnitsInRange( g, GetWidgetX(udg_Mage), GetWidgetY(udg_Mage), 900., Condition(function FilterUnits)) set un = GroupPickRandomUnit(g) call SaveAgentHandle(udg_Hash, uid, 445, un) call IssueTargetOrderById( udg_Mage, 851971, un )
call DestroyBoolExpr(Condition(function FilterUnits)) call GroupClear(g) call DestroyGroup(g) set g = null set un = null endfunction
function Trig_Magic_Up_Actions takes nothing returns nothing call ForGroup(udg_MagesGroup, function FilterMages ) endfunction
Сообщение отредактировал FatalBlade - Пятница, 06 Января 2012, 17:31:34
if (Тут очень много условий) then set un = null set p = null return true else set un = null set p = null return false endif
Зачем дважды обнулять переменные и устанавливать что функция возвращает? if (conditions) then set un = null set p = null return true endif return false
Добавлено (06 Январь 2012, 17:36:52) --------------------------------------------- И игрока обнулять не обязательно.
Зачем дважды обнулять переменные и устанавливать что функция возвращает? if (conditions) then set un = null set p = null return true endif return false
Действия которые написано после return, уже не могут выполняться, так ведь?