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

Добавлен , не публикуется
Для подписки на данный эвент использовать:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
2
11 лет назад
Отредактирован SlenderMan
0
А безопасно ли использовать массивы вместо хеш таблиц в подобных системах?
0
24
11 лет назад
Отредактирован Faion
0
Да, но это будет совершенно не эффективно в конкретно этой системе.
0
30
11 лет назад
0
ScorpioT1000:
Есть мнение, что вариэйбл эвент очень сильно тормозит систему кстати, адик что-то говорил про это.
0
24
11 лет назад
Отредактирован Faion
0
Тестов со стопвотчем не видел, а на необоснованные предположения не собираюсь полагаться. У скорпа есть мнение что рефлексия может работать быстрее чем нативный вызов :nate:
0
30
11 лет назад
0
Алсо, не нашёл в мануле по сжассу лямбда функций
0
24
11 лет назад
0
Алсо, не нашёл в мануле по сжассу лямбда функций
Вроде фича ласт сжасса. Ну или мб просто забыли описать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.