Собственно, я написал один небольшой триггер для массовых кастов. Суть проста - триггер применяет на каждого дружественного воина в выбранной области определённую область. В качестве входных параметров триггер принимает точку, область воздействия, триггерного игрока, заклинание, которое должно накинуться на каждого юнита в области и приказ этого заклинания.
И вот в самой игре данное событие вызывает утечки (смотрю с HandleCounter), но моего нынешнего уровня знаний не хватает, чтобы определить - где в данной ситуации создаётся утечка. При чём на самом месте каста не остаётся дополнительных юнитов, не начинает фризить игра.
1 скриншот - вызов метода при касте заклинания.
2 скриншот - сам метод массового каста
function MassBuffAbility takes location TrigLoc, integer range, player TrigPlayer, integer TrigSpell, string Order returns nothing
    
    local group g = CreateGroup()
    local unit EnumUnit
    local player EnumPlayer
    local integer EnumUnitType
    call GroupEnumUnitsInRangeOfLoc(g, TrigLoc, range, null)
        loop    
        EnumUnit = FirstOfGroup( g)
        EnumPlayer = GetOwningPlayer(EnumUnit)
        EnumUnitType = GetUnitTypeId(EnumUnit)
            if (IsUnitAlly(EnumUnit, TrigPlayer) == true || EnumPlayer == TrigPlayer && EnumUnitType != 'u03O' ) then
            local unit DummyUnit
            DummyUnit =  CreateUnitAtLoc(TrigPlayer, 'u03O', TrigLoc, 160)
            call UnitAddAbility( DummyUnit, TrigSpell)
            call IssueTargetOrderById( DummyUnit, OrderId(Order), EnumUnit ) 
            call SetUnitState(DummyUnit, UNIT_STATE_MANA, 5000)
            call UnitApplyTimedLife(DummyUnit , 'BTLF', 0.5 )
            DummyUnit = null
            endif
        EnumPlayer = null
        EnumUnitType = 0
        call GroupRemoveUnit(g, EnumUnit)
        exitwhen EnumUnit == null
        endloop
    call DestroyGroup(g)
    g = null
    EnumUnit = null    
    EnumPlayer = null
    EnumUnitType = 0
endfunction

Принятый ответ

AllChosen, строки
TrigSpell = 0
TrigPlayer = null

EnumPlayer = null
EnumUnitType = 0
Строка
EnumUnit = null
тоже лишняя, так как условием выхода из цикла loop является
exitwhen EnumUnit == null
Старайтесь использовать координаты вместо локаций:
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
22
4 года назад
3
call GroupEnumUnitsInRangeOfLoc(g, TrigLoc, range, null)
Эта функция утечна, используй её аналог на координатах X,Y вместо Location
p.s. Название аналогичной функции забыл :(
0
21
4 года назад
Отредактирован scopterectus
0
Наверное, из_за дамми юнита, который не сразу удаляется, а лишь после полного разложения трупа. Я бы не рекомендовал создавать столько даммиков, а использовал бы одного, если, конечно, способность мгновенная.
5
17
4 года назад
5
AllChosen, строки
TrigSpell = 0
TrigPlayer = null

EnumPlayer = null
EnumUnitType = 0
Строка
EnumUnit = null
тоже лишняя, так как условием выхода из цикла loop является
exitwhen EnumUnit == null
Старайтесь использовать координаты вместо локаций:
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
Принятый ответ
0
3
4 года назад
0
Vlod:
AllChosen, строки
TrigSpell = 0
TrigPlayer = null

EnumPlayer = null
EnumUnitType = 0
Строка
EnumUnit = null
тоже лишняя, так как условием выхода из цикла loop является
exitwhen EnumUnit == null
Старайтесь использовать координаты вместо локаций:
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
Благодарю за совет. По итогу решил проблему и смогу оптимизировать данный скрипт

ScopteRectuS:
Наверное, из_за дамми юнита, который не сразу удаляется, а лишь после полного разложения трупа. Я бы не рекомендовал создавать столько даммиков, а использовал бы одного, если, конечно, способность мгновенная.
К сожалению, такой скрипт должен действовать на все способности и не всегда они будут мгновенными
0
32
4 года назад
0
Фильтр то для группы религия юзать не позволяет? Ну ==true, icefrog разлогинься!
Если выражение возвращает boolean или функция, то незачем писать == True оно само по себе True., или false.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.