Добавлен rsfghd
Вот такой кусочек кода
Код
private function myfilt takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
return not IsUnitDead(bj_lastReplacedUnit) and not IsUnitType(bj_lastReplacedUnit,UNIT_TYPE_STRUCTURE) and IsUnitEnemy(bj_lastReplacedUnit,bj_groupEnumOwningPlayer) and not IsUnitInGroup(bj_lastReplacedUnit,TempG)
endfunction
private function dmgk takes nothing returns nothing
call UnitDamageTarget(bj_lastCreatedUnit,GetEnumUnit(),TempReal,true,false,AttackType,DamageType,WeaponType)
call GroupAddUnit(TempG,GetEnumUnit())
endfunction
private function move1 takes nothing returns nothing
local unit u = GetEnumUnit()
local real a = GetUnitFacing(u)*bj_DEGTORAD
local group g = CreateGroup()
call SetUnitX(u,GetUnitX(u)+WavesSpeed*Cos(a))
call SetUnitY(u,GetUnitY(u)+WavesSpeed*Sin(a))
set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),WaveRadius,Condition(function myfilt))
set bj_groupEnumOwningPlayer = null
set bj_lastCreatedUnit = u
call ForGroup(g,function dmgk)
set bj_lastCreatedUnit = null
call GroupClear(g)
call DestroyGroup(g)
set g = null
set u = null
endfunction
private function move takes nothing returns nothing
...
set TempG = LoadGroupHandle(udg_Hash,i,4)
call ForGroup(g,function move1)
call SaveGroupHandle(udg_Hash,i,4,TempG)
call GroupClear(TempG)
set TempG = null
...
endfunction
прим. TempG глобальная группа
Как поведёт себя выгружаемая группа "set TempG = LoadGroupHandle(udg_Hash,i,4)" после "call GroupClear(TempG)"? По сути же каждый раз мы будем выгружать пустую группу? А мне нужна, чтобы она уже была с продамаженными юнитами. Я могу это спокойно реализовать через луп, но тогда придётся отказаться от двух функций ForGroup (move, move1), а это на скорость обработки вроде влияет.. как быть?
Как поведёт себя выгружаемая группа "set TempG = LoadGroupHandle(udg_Hash,i,4)" после "call GroupClear(TempG)"? По сути же каждый раз мы будем выгружать пустую группу? А мне нужна, чтобы она уже была с продамаженными юнитами. Я могу это спокойно реализовать через луп, но тогда придётся отказаться от двух функций ForGroup (move, move1), а это на скорость обработки вроде влияет.. как быть?
Принятый ответ
Всё, довольно быстро разобрался
Помогла функция от quq_CCCP если не ошибаюсь
Помогла функция от quq_CCCP если не ошибаюсь
function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
Вот так переделал
...
local group gg = null
...
set TempG = LoadGroupHandle(udg_Hash,i,4)
set TempReal = LoadReal(udg_Hash,i,3)
call ForGroup(g,function move1)
set gg = CopyGroup(TempG)
call SaveGroupHandle(udg_Hash,i,4,gg)
call GroupClear(TempG)
set TempG = null
...
Хотя вроде каждые 0.03 сек создаётся новая группа, а удаляется лишь один раз вместе с таймером, мне кажется там утечек из-за этого дофига. Но это чуть позже проверю, в таком случае откажусь от ForGroup
Да, к сожалению оно вызывает утечки, но это было очевидно. Копирование группы лучше использовать для локальных групп, которые можно будет потом уничтожить. В общем перенесу всё в луп
Код
private function move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local group g = LoadGroupHandle(udg_Hash,i,0)
local group gg = CopyGroup(g)
local group ggg = CreateGroup()
local group g1 = LoadGroupHandle(udg_Hash,i,4)
local real d = LoadReal(udg_Hash,i,2)+WavesSpeed
local real a
local unit u = null
local unit uu = null
loop
set u = FirstOfGroup(gg)
exitwhen u == null
set a = GetUnitFacing(u)*bj_DEGTORAD
call SetUnitX(u,GetUnitX(u)+WavesSpeed*Cos(a))
call SetUnitY(u,GetUnitY(u)+WavesSpeed*Sin(a))
set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(ggg,GetUnitX(u),GetUnitY(u),WaveRadius,Condition(function myfilt))
set bj_groupEnumOwningPlayer = null
loop
set uu = FirstOfGroup(ggg)
exitwhen uu == null
if not IsUnitInGroup(uu,g1) then
call UnitDamageTarget(u,uu,LoadReal(udg_Hash,i,3),true,false,AttackType,DamageType,WeaponType)
call GroupAddUnit(g1,uu)
endif
call GroupRemoveUnit(ggg,uu)
set uu = null
endloop
call GroupRemoveUnit(gg,u)
set u = null
endloop
if d >= LoadReal(udg_Hash,i,1) then
DisplayTextToPlayer(Player(0),0,0,I2S(1))
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,i)
call ForGroup(g,function kill)
call GroupClear(g)
call DestroyGroup(g)
call GroupClear(g1)
call DestroyGroup(g1)
else
call SaveReal(udg_Hash,i,2,d)
endif
call DestroyGroup(gg)
call DestroyGroup(ggg)
set g = null
set gg = null
set ggg = null
set g1 = null
set t = null
set g = null
endfunction
Что это за абилку я делаю, можете посмотреть с 20.12.2020 вечером в моём блоге))
Да, это реклама говноабилок, я лох
Да, это реклама говноабилок, я лох
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован rsfghd
Помогла функция от quq_CCCP если не ошибаюсь
Да, это реклама говноабилок, я лох