Написал библиотеку по отлавливанию получения повреждений.
  • Всё ли правильно я сделал?
  • Что можно доработать?
  • Если добавленный юнит умрет, то event, который отвечает за получение им повреждений останется в памяти. Плохо ли это? Если да, то как его удалить правильно?
library TriggerRegisterAnyUnitDamagedEvent initializer Init

    globals
        public     constant    trigger    TRIGGER          =    CreateTrigger()
        private    constant    trigger    TRIGGER_ADDER    =    CreateTrigger()
    endglobals

    private function TriggerAddEvent takes nothing returns boolean
        if not HaveSavedHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla")) then
            call SaveTriggerEventHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla"), TriggerRegisterUnitEvent(TRIGGER, GetFilterUnit(), EVENT_UNIT_DAMAGED))
        endif
        return false
    endfunction

    private function Init takes nothing returns nothing
        local group    g      =    CreateGroup()
        local rect     r      =    GetWorldBounds()
        local region   reg    =    CreateRegion()
        local boolexpr filter = Condition(function TriggerAddEvent)

        call GroupEnumUnitsInRect(g, r, filter)

        call RegionAddRect(reg, r)
        call TriggerRegisterEnterRegion(TRIGGER_ADDER, reg, filter)

        call DestroyGroup(g)
        call RemoveRect(r)
        set g   = null
        set r   = null
        set reg = null
    endfunction

    function TriggerRegisterAnyUnitDamagedEvent takes code c returns nothing
        call TriggerAddCondition(TRIGGER, Condition(c))
    endfunction

endlibrary
UPD 1: Заметил такой баг - создавал кучу воинов и атаковал их, на некоторых воинов не срабатывал триггер, в то время как на других работал.
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
Как то кривовато, да и выглядит неочень. Где проверки на дамми юнитов, неуязвимых юнитов, они тоже попадают на карту.
21
quq_CCCP, можно подробнее? и как можно сделать проверку на дамми юнита?
32
GetUnitTypeId( тип даммика) или IsUnitType( UNIT_TYPE_SAPPER) , подумай сам как лучше отличать тех юнитов которые не будут получать урона и\или юнитов для которых это неважно (варды\мины) я сделал для себя проверку на мемхаке на тип вард и наличие инвула и так проверяю.
Так же нету проверки на героев, они могут войти на карту дважды, помойму после смерти герой не покидает игровой рект, но на всякий случай проверь, чтобы не наплодить 100500 ивентов на одного юнита.
21
quq_CCCP, переделал, посмотри, пожалуйста. А проверка на дамми и т. д. не нужна, мне кажется. То что они дамми, ведь не отменяет то, что они получили урон, а если нужно их отсеять, то можно уже сделать это в самой функции, где это нужно.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.