Система регистрации урона

Not published
Для подписки на данный эвент использовать:
TriggerRegisterAnyUnitTakesDamage(t)
Если нужно добавить тип юнитов, которые нужно игнорировать системой (к примеру юнитов для дгуи\фсгуи), используйте:
AddFilterUnitByTypeId(typeId)
Для удаления:
RemoveFilterUnitByTypeId(typeId)
Если хотите что б событие нанесения нулевого урона не регистрировалось, установите в настройках:
#define private EventDamage = 0.0
» библиотека
library UnitDamageEvent
{
    // источник урона
    public unit Source = null;
    // цель урона
    public unit Target = null;
    // урон
    // для регистрации эвента нанесения урона установите значение как -1.0
    // если вы хотите, что бы нулевой урон не вызывал эвент, то установите как 0.0
    #define private EventDamage = -1.0;
    public float Damage = EventDamage;
    
    private trigger EventTrigger = null;
    private trigger SystemTrigger = null;

    // отвечает за включение\отключение фильтрации юнитов
    #define private UnitFilterEnable = true;
    
    #if (UnitFilterEnable)
        public hashtable sysHashtable = InitHashtable();
    #endif
    
    // добавление\удаление типа юнита для фильтрации
    #define AddFilterUnitByTypeId(typeId) = SaveBoolean(UnitDamageEvent_sysHashtable, 0,typeId, true)
    #define RemoveFilterUnitByTypeId(typeId) = RemoveSavedBoolean(UnitDamageEvent_sysHashtable, 0,typeId)
    #define TriggerRegisterAnyUnitTakesDamage(t) = TriggerRegisterVariableEvent(t, "UnitDamageEvent_Damage", GREATER_THAN, EventDamage);

    callback onInit()
    {
        EventTrigger = CreateTrigger(); SystemTrigger = CreateTrigger();
        group g = CreateGroup();region r = null;unit u = null;
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,null);
        ForGroup(g, lambda void(){
            #if(UnitFilterEnable)
                if(LoadBoolean(UnitDamageEvent_sysHashtable, 0,GetUnitTypeId(GetEnumUnit()))){return;}
            #endif
            TriggerRegisterUnitEvent(EventTrigger,GetEnumUnit(),EVENT_UNIT_DAMAGED)
        });
        GroupClear(g);DestroyGroup(g);g = null;
        RegionAddRect(r, bj_mapInitialPlayableArea);
        TriggerRegisterEnterRegion(SystemTrigger,r,null); r = null;
        TriggerAddAction(SystemTrigger, lambda void(){
            #if(UnitFilterEnable)
                if(LoadBoolean(UnitDamageEvent_sysHashtable, 0,GetUnitTypeId(GetEnumUnit()))){return;}
            #endif
            TriggerRegisterUnitEvent(EventTrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
        });
        TriggerAddAction(EventTrigger, lambda void()
        {
            Source = GetEventDamageSource();Target = GetTriggerUnit();Damage = GetEventDamage();
            Source = null;Target = null;Damage = EventDamage
        });
    }
}
Для работы библиотеки требуется последняя версия cjass


Views: 2 170

SlenderMan #1 - 8 years ago (изм. ) -1
Голосов: +0 / -1
А безопасно ли использовать массивы вместо хеш таблиц в подобных системах?
Faion #2 - 8 years ago (изм. ) -1
Голосов: +0 / -1
Да, но это будет совершенно не эффективно в конкретно этой системе.
Clamp #3 - 8 years ago -2
Голосов: +0 / -2
ScorpioT1000:
Есть мнение, что вариэйбл эвент очень сильно тормозит систему кстати, адик что-то говорил про это.
Faion #4 - 8 years ago (изм. ) -1
Голосов: +0 / -1
Тестов со стопвотчем не видел, а на необоснованные предположения не собираюсь полагаться. У скорпа есть мнение что рефлексия может работать быстрее чем нативный вызов :nate:
Faion #6 - 8 years ago -1
Голосов: +0 / -1
Алсо, не нашёл в мануле по сжассу лямбда функций
Вроде фича ласт сжасса. Ну или мб просто забыли описать.