Добавлен
unit EnemyInGroup (unit u, float x, float y, float range) {
    group enemies = CreateGroup()
    unit u_e
    
    GroupEnumUnitsInRange(enemies, x, y, range, Condition(function SimpleCond))
    loop
        u_e = FirstOfGroup(enemies)
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            return u_e
            exitwhen true
        else
            GroupRemoveUnit(enemies, u_e)
        endif
    exitwhen u_e == null
    endloop

    //return u_e
    
    DestroyGroup(enemies)
    enemies = null
    u_e = null
}
Пишет missing return, хотя он есть, чо делать?

Мне и нужно, чтобы возвращало первого попавшего
Окей, я тогда чутка переделаю свою версию.
code
globals
    player TransPlayer
    unit LastEnemyUnit
endglobals

function filter takes nothing returns boolean
    if IsUnitEnemy(GetFilterUnit(), TransPlayer) then
        set LastEnemyUnit = GetFilterUnit()
    endif
    return false
endfunction

function EnemyInRange takes unit u, real x, real y, real range returns unit
    set TransPlayer = GetOwningPlayer(u)
    set LastEnemyUnit = null
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
    return LastEnemyUnit
endfunction
Плохо, что ретурн позволяет появлятся утечкам.
Только если это локальная переменная, тип которой наследник handle. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
Но тут ведь тоже в случае наличия противника будет утечка в u, ибо она не обнуляется (баг такой пока есть)
С каких это пор параметры функции утекают?
28
С каких это пор параметры функции утекают?
xD
Там это и параметр, и локальная, параметр не заметил. Аргументы да, не утекают.
14
Raised:
Подход не вполне верный. Тебе нужно возвращать не юнита, а группу. Иначе твоя функция оборвется когда обнаружит в группе первого врага. Почему у тебя в цикле 2 exitwhen?
code
    loop
        u_e = FirstOfGroup(unitsInRange)
    exitwhen u_e  ==  null
        if IsUnitEnemy(u_e, GetOwningPlayer(u)) then
            GroupRemoveUnit(unitsInRange, u_e)
            GroupAddUnit(enemies, u_e)
        else
            GroupRemoveUnit(unitsInRange, u_e)
        endif
    endloop

    return enemies
Ну а дальше работаешь с группой.
Мне и нужно, чтобы возвращало первого попавшего
Плохо, что ретурн позволяет появлятся утечкам.
21
Плохо, что ретурн позволяет появлятся утечкам.
Откуда такая информация?
28
Мне и нужно, чтобы возвращало первого попавшего
Окей, я тогда чутка переделаю свою версию.
code
globals
    player TransPlayer
    unit LastEnemyUnit
endglobals

function filter takes nothing returns boolean
    if IsUnitEnemy(GetFilterUnit(), TransPlayer) then
        set LastEnemyUnit = GetFilterUnit()
    endif
    return false
endfunction

function EnemyInRange takes unit u, real x, real y, real range returns unit
    set TransPlayer = GetOwningPlayer(u)
    set LastEnemyUnit = null
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
    return LastEnemyUnit
endfunction
Плохо, что ретурн позволяет появлятся утечкам.
Только если это локальная переменная, тип которой наследник handle. Если локальная другого типа, или это аргумент функции, или это глобальная, то утечек не будет.
Это, кстати, обещают исправить в будущих патчах.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.