Объясните пожалуйста, вызывает ли это утечки? Если да, то как грамотно присвоить нулевое значение, чтобы всё продолжало работать как надо?
код
function mycode takes nothing returns nothing
    local unit u = GetEnumUnit()
    local group g = LoadGroupHandle(H,GetHandleId(u),0)
    
    if g == null then
        set g = CreateGroup()
    endif
    
    if CountUnitsInGroup(g) < 5 then
        set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),'nshe',GetUnitX(u),GetUnitY(u),0)
        call GroupAddUnit(g,bj_lastCreatedUnit)
        call SaveGroupHandle(H,GetHandleId(u),0,g)
        call DisplayTextToForce(GetPlayersAll(),I2S(CountUnitsInGroup(g)))
    endif
    
    set u = null
endfunction
На каждого выбранного юнита будет ежесекундно создаваться овечка, если овечек больше 5 у этого юнита, то они перестанут создаваться
В общем мне казалось, что функция local group g = LoadGroupHandle(H,GetHandleId(u),0) будет вызывать утечки без последующего обнуления, но что по счётчику хэндлов, что по нагрузке вара - их нет. Неужели всё хорошо?
Я привык, что локальные группы нужно обнулять (DestroyGroup, set = null), но в данном случае это ломает систему, поэтому обнуление я перенёс на смерть юнита

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

ну не обнулили g
во-вторых, не привязали группу при ее создании к выбранному юниту. Короче, это уже ошибка.
    if g == null then
        set g = CreateGroup()
		//надо в хэш на зэндл выбранного записать группу
		set g = null //переменная - это просто ссылка
    endif
при смерти овцы удаляем ее из группы
при смерти выбранного юнита удаляем группу
может стоит подумать сделать на всю игру одну группу овечек или вообще обойтись без группы. будет фиксировать заход/выход овцы. На каждого выбранного заводим счетчик. А каждой овце привязываем выбранного. Когда овца умирает, то зная к кому привязана, у выбранного понижаем счетчик.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
27
4 года назад
Отредактирован MpW
2
ну не обнулили g
во-вторых, не привязали группу при ее создании к выбранному юниту. Короче, это уже ошибка.
    if g == null then
        set g = CreateGroup()
		//надо в хэш на зэндл выбранного записать группу
		set g = null //переменная - это просто ссылка
    endif
при смерти овцы удаляем ее из группы
при смерти выбранного юнита удаляем группу
может стоит подумать сделать на всю игру одну группу овечек или вообще обойтись без группы. будет фиксировать заход/выход овцы. На каждого выбранного заводим счетчик. А каждой овце привязываем выбранного. Когда овца умирает, то зная к кому привязана, у выбранного понижаем счетчик.
Принятый ответ
0
30
4 года назад
0
А каждой овце привязываем выбранного
Чем это лучше привязывания овец к юниту?
1
27
4 года назад
Отредактирован MpW
1
Clamp, ну он для каждого выбранного создает группу из 5 овец. А можно обойтись без группы, но 5 овечек хранят ссылку к выбранному. когда одна овца умирает, у выбранного счетчик -1
Это как, если на арену выйдет 20 юнитов, то наверное будет 20 групп создано. А еще 20 переборов на счетчиков групп
0
30
4 года назад
0
А, точно, тут же группа используется, ты прав. Но вообще можно и без группы хранить овец у юнита, я бы так и делал, потому и спросил.
0
27
4 года назад
0
мб стоило просто единый счетчик на арене завести? сколько юнитов на арене, столько и овец, только в 5 раз больше. не знаю для чего ему так надо
0
27
4 года назад
Отредактирован rsfghd
0
МрачныйВорон, хотелось бы чтобы у каждого своя овечка была. Например поставили 2 фермы, у одной убили овцу, у другой оставили, если бы счётчик был общим, то овца могла бы заспавнится не с той фермы

В принципе ладно, могу записать в целочисленную, просто хотел поработать в группой
Сделал как описали выше, до групп мне ещё далеко
код
function mycode takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer i = LoadInteger(H,GetHandleId(u),0)
    
    if i < 5 then
        set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),'nshe',GetUnitX(u),GetUnitY(u),0)
        call SaveUnitHandle(H,GetHandleId(bj_lastCreatedUnit),0,u)
        set i = i+1
        call SaveInteger(H,GetHandleId(u),0,i)
        call DisplayTextToForce(GetPlayersAll(),I2S(i))
    endif
    
    set u = null
endfunction
1
27
4 года назад
Отредактирован rsfghd
1
UPD: как я мог протупить с ссылкой на группу...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.