Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
cJass
library UnitDamaged initializer InitRect {
    #include "cj_types_priv.j"

    private group   allUnits;
    private region  mapArea;
    private trigger Trigger[];
    private int     TrigsNum = 0;

    private void unitDamagedEvent() {
        TriggerRegisterUnitEvent(Trigger[TrigsNum], GetEnumUnit(), EVENT_UNIT_DAMAGED);
    }

    void AnyUnitDamagedEvent(trigger toTrigger) {
        Trigger[TrigsNum] = toTrigger;
        ForGroup(allUnits, function unitDamagedEvent);
        TrigsNum++;
    }

    private void onUnitSpawn() {
        for (int i = 0; i < TrigsNum; i++) {
            TriggerRegisterUnitEvent(Trigger[i], GetEnteringUnit(), EVENT_UNIT_DAMAGED);
        }
        GroupAddUnit(allUnits, GetEnteringUnit());
    }

    private void onUnitDecay() {
        GroupRemoveUnit(allUnits, GetDecayingUnit());
    }

    private void InitRect() {
        trigger onSpawn = CreateTrigger();
        trigger onDecay = CreateTrigger();
        allUnits = CreateGroup();
        mapArea = CreateRegion();
        GroupEnumUnitsInRect(allUnits, GetWorldBounds(), null);
        RegionAddRect(mapArea, GetWorldBounds());
        TriggerRegisterEnterRegion(onSpawn, mapArea, null);
        for (int i = 0; i < bj_MAX_PLAYER_SLOTS; i++) {
            TriggerRegisterPlayerUnitEvent(onDecay, Player(i), EVENT_PLAYER_UNIT_DECAY, null);
        }
        TriggerAddAction(onSpawn, function onUnitSpawn);
        TriggerAddAction(onDecay, function onUnitDecay);
    }
}
vJass
library UnitDamaged initializer initRect
    globals
        private group   allUnits
        private region  mapArea
        private trigger Trigger[]
        private integer TrigsNum = 0
    endglobals

    private function unitDamagedEvent takes nothing returns nothing
        call TriggerRegisterUnitEvent(Trigger[TrigsNum], GetEnumUnit(), EVENT_UNIT_DAMAGED)
    endfunction

    function AnyUnitDamagedEvent takes trigger toTrigger returns nothing
        set Trigger[TrigsNum] = toTrigger
        call ForGroup(allUnits, function unitDamagedEvent)
        set TrigsNum = TrigsNum + 1
    endfunction

    private function onUnitSpawn takes nothing returns nothing
        local integer i = 0
        loop
            exitwhen (i == TrigsNum)
            call TriggerRegisterUnitEvent(Trigger[i], GetEnteringUnit(), EVENT_UNIT_DAMAGED)
            set i = i + 1
        endloop
        call GroupAddUnit(allUnits, GetEnteringUnit())
    endfunction

    private function onUnitDecay takes nothing returns nothing
        call GroupRemoveUnit(allUnits, GetDecayingUnit())
    endfunction

    private function initRect takes nothing returns nothing
        local integer i = 0
        local trigger onSpawn = CreateTrigger()
        local trigger onDecay = CreateTrigger()
        set allUnits = CreateGroup()
        set mapArea = CreateRegion()
        call GroupEnumUnitsInRect(allUnits, GetWorldBounds(), null)
        call RegionAddRect(mapArea, GetWorldBounds())
        call TriggerRegisterEnterRegion(onSpawn, mapArea, null)
        loop
            exitwhen (i == bj_MAX_PLAYER_SLOTS)
            call TriggerRegisterPlayerUnitEvent(onDecay, Player(i), EVENT_PLAYER_UNIT_DECAY, null)
            set i = i + 1
        endloop
        call TriggerAddAction(onSpawn, function onUnitSpawn)
        call TriggerAddAction(onDecay, function onUnitDecay)
    endfunction
endlibrary

Добавление события:
    call AnyUnitDamagedEvent(subscribingTrigger)

Источник урона (атаковавший юнит):
GetEventDamageSource()
Цель урона (атакованный юнит):
GetTriggerUnit() 
Величина нанесённого урона:
GetEventDamage()

Установка: скопировать в Нестандартный Код Карты, дальнейших действий не требуется.

Ограничения:
  • Нельзя использовать с динамичными триггерами
  • Нельзя использовать более, чем с JASS_MAX_ARRAY_SIZE триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...
38
Ну так эвалюейт триггера работает дольше простого вызова функции =)
А лямбда классы в вжасс уже есть?
24
Ну так эвалюейт триггера работает дольше простого вызова функции =)
А с чего ты взял что там происходит эвалюейт триггера?
А лямбда классы в вжасс уже есть?
Хз, можно сказать не юзаю вжасс, мне и сжасса хватает.
38
А с чего ты взял что там происходит эвалюейт триггера?
При любом срабатывании event происходит эвалюэйт триггера, или ты что-то иное имеешь ввиду под этим словом?
24
или ты что-то иное имеешь ввиду под этим словом?
Да... туплю, о другом подумал.
Кста наткнулся сча еще на такой свой вариант реализации:
тык
library EventUnitDamaged
{
    private trigger registerEventDamage = null
    private trigger registerEnterRect = null
    
    private void Core()
    {
        // создаем триггер
        registerEventDamage = CreateTrigger();
        // создаем группу
        group g = CreateGroup()
        // получаем всех юнитов на карте
        GroupEnumUnitsInRect(g, GetWorldBounds(), null)
        // вешаем на каждого юнита эвент получения урона
        ForGroup(g, lambda void(){
            TriggerRegisterUnitEvent(registerEventDamage,GetEnumUnit(),EVENT_UNIT_DAMAGED)
        });
        GroupClear(g);
        DestroyGroup(g);
        g = null;
        
        // добавляем отслеживание появления новых юнитов
        registerEnterRect = CreateTrigger();
        TriggerRegisterEnterRectSimple(registerEnterRect,GetWorldBounds())
        
        // и при появлении новых юнитов добавляем им эвент
        TriggerAddAction(registerEnterRect, lambda void() {
            TriggerRegisterUnitEvent(registerEventDamage,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
        });
    }
    
    public void AddEventAction(code func)
    {
        if (registerEventDamage == null)
        {
            Core();
        }
        TriggerAddAction(registerEventDamage, func)
    }
}
38
Хмм юнита то чекать придется
24
Хмм юнита то чекать придется
Кстати да. Над будет чонить придумать, или вообще юзать другую мою либу для детекта урона)
Стоп, там все ок, юзается 2 разных триггера. Или ты про какую то другую проверку?
38
Про ту что я система, я пришел, зарегал на моих юнитов эвент и работаю только с ним, а мне будет сыпаться всякий хлам от чужих систем.
24
Про ту что я система, я пришел, зарегал на моих юнитов эвент и работаю только с ним, а мне будет сыпаться всякий хлам от чужих систем.
А ну разумно. Но реализовывать такое наверно не буду, т.к. нет необходимости в избирательности...
6
У меня не получилось применить систему. Выдает Fatal Eror при проверке карты после того, как я вставляю функцию в Нестандартный Код Карты. Использую Jass New Gen Pack 5d Exp2. Пробовал все 3 функции, каждая выдает ошибку проверке карты. Еще до того, как начал применять саму функцию. А система отлова урона нужна. В чем моя ошибка?
30
Только в том, что ты не сказал, какую ошибку выдает редактор =)
30
Твои требуют генетических отклонений в сторону любви к жестким извращениям.
5
Ничего выдающегося :(
ведь реально больше есть потребность не просто зарегистрировать получения урона, но и определить:
  1. Источник урона (атакующий)
  2. Тип атаки
  3. Тип урона
  4. Вид заклинания (для урона, полученного заклинанием или способностью)
  5. Величину урона (как реальную, так и базовую)
но на WC3 это очень сложно - особенно с заклинаниями - тут всё дамаг систему нужно перелывать
30
Источник урона (атакующий)
GetEventDamageSource()
Величину урона
GetEventDamage()
* facepalm *
9
Какая команда получает боевую еденицу получившую урон?
32
WakVellios:
Какая команда получает боевую еденицу получившую урон?
GetTriggerUnit()
JASS API в помощь.
3
а как использовать эту систему
говорят самый лучший детектор урона это
и не вижу тут vjass
30
говорят самый лучший детектор урона это
The system is written in pure JASS and realizes damage handler functions with a variable event
Тут выше было обсуждение, почему это не очень хорошо. В целом, моя система просто даёт возможность создать глобальное событие "юнит получает урон", а любые дополнительные проверки при необходимости накручиваются уже поверх. Прелесть в том, что алгоритмически эта система является ноу-хау, по крайней мере я не встречал подобного компактного решения в 30 строк.
Dota_2015:
и не вижу тут vjass
Библиотеки, например, являются функционалом из vJass, как и globals/endglobals.
Dota_2015:
а как использовать эту систему
Скопировал в нестандартный код карты, для нужного триггера вызываешь call AnyUnitDamagedEvent(Trigger). Всё описано в ресурсе.

А, ну и эта появилась раньше на джва месяца!
2 комментария удалено
30
Пользуясь случаем, чутка улучшил системку.
21
А может ли один юнит в каком-то случае дважды войти в bj_mapInitialPlayableArea?
30
ScopteRectuS, можешь ли ты зайти в комнату дважды, не выходя из неё? :)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.