Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
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 триггеров

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
37
11 лет назад
0
ScorpioT1000:
Мне лень
Вот чтд xgm.ru/forum/showthread.php?t=28464
Ну и пстодиод www.wc3c.net/showthread.php?t=107658
Тоесть просто у джасса в операторе аля JassSetValue есть проверка, есть ли триггеры на данный эвент
0
24
11 лет назад
0
Есть мнение, что вариэйбл эвент очень сильно тормозит систему кстати
Тоесть просто у джасса в операторе аля JassSetValue есть проверка, есть ли триггеры на данный эвент
Ну ятп работает ок.
0
37
11 лет назад
0
Ну так эвалюейт триггера работает дольше простого вызова функции =)
А лямбда классы в вжасс уже есть?
0
24
11 лет назад
0
Ну так эвалюейт триггера работает дольше простого вызова функции =)
А с чего ты взял что там происходит эвалюейт триггера?
А лямбда классы в вжасс уже есть?
Хз, можно сказать не юзаю вжасс, мне и сжасса хватает.
0
37
11 лет назад
0
А с чего ты взял что там происходит эвалюейт триггера?
При любом срабатывании event происходит эвалюэйт триггера, или ты что-то иное имеешь ввиду под этим словом?
0
24
11 лет назад
0
или ты что-то иное имеешь ввиду под этим словом?
Да... туплю, о другом подумал.
Кста наткнулся сча еще на такой свой вариант реализации:
тык
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)
    }
}
0
37
11 лет назад
0
Хмм юнита то чекать придется
0
24
11 лет назад
0
Хмм юнита то чекать придется
Кстати да. Над будет чонить придумать, или вообще юзать другую мою либу для детекта урона)
Стоп, там все ок, юзается 2 разных триггера. Или ты про какую то другую проверку?
0
37
11 лет назад
Отредактирован ScorpioT1000
0
Про ту что я система, я пришел, зарегал на моих юнитов эвент и работаю только с ним, а мне будет сыпаться всякий хлам от чужих систем.
0
24
11 лет назад
0
Про ту что я система, я пришел, зарегал на моих юнитов эвент и работаю только с ним, а мне будет сыпаться всякий хлам от чужих систем.
А ну разумно. Но реализовывать такое наверно не буду, т.к. нет необходимости в избирательности...
0
6
11 лет назад
0
У меня не получилось применить систему. Выдает Fatal Eror при проверке карты после того, как я вставляю функцию в Нестандартный Код Карты. Использую Jass New Gen Pack 5d Exp2. Пробовал все 3 функции, каждая выдает ошибку проверке карты. Еще до того, как начал применять саму функцию. А система отлова урона нужна. В чем моя ошибка?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.