Добавлен AllChosen
Собственно, я написал один небольшой триггер для массовых кастов. Суть проста - триггер применяет на каждого дружественного воина в выбранной области определённую область. В качестве входных параметров триггер принимает точку, область воздействия, триггерного игрока, заклинание, которое должно накинуться на каждого юнита в области и приказ этого заклинания.
И вот в самой игре данное событие вызывает утечки (смотрю с HandleCounter), но моего нынешнего уровня знаний не хватает, чтобы определить - где в данной ситуации создаётся утечка. При чём на самом месте каста не остаётся дополнительных юнитов, не начинает фризить игра.
1 скриншот - вызов метода при касте заклинания.
2 скриншот - сам метод массового каста
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()
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Эта функция утечна, используй её аналог на координатах X,Y вместо Location
Отредактирован scopterectus
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
Если выражение возвращает boolean или функция, то незачем писать == True оно само по себе True., или false.