Алгоритмы, Наработки и Способности
Способ реализации:
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 триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
24
11 лет назад
1
кто то не может понять 20 строчек кода <3
Ну тогда поясните мсье крутой программист.
0
30
11 лет назад
0
указанному триггеру регистрируется событие "юнит входит на игровую территорию".
при реакции на добавленное событие для юнита сразу добавляется событие получения урона.
В теории, две строчки текста прочитать проще, чем 20 строчек кода, но ты даже здесь облажался.
1
24
11 лет назад
1
Автор считает, что в процессе не могут появляется новые юниты?
Окей, с этим облажался. А что с обвешиванием эвентами?
0
30
11 лет назад
Отредактирован Clamp
0
1 юнит - 1 эвент урона на него каждому триггеру
пикаю всех и по очереди каждого регистрирую
Без танцев с бубном и создания триггера лишнего

вообще можно было создать 1 триггер на все события, но там надо было бы вводить базу действий с условиями, нафиг оно не надо, весь прикол сверхпростой архитектуры теряется.
0
24
11 лет назад
0
Clamp, хорошо, для особо одаренных спрошу проще. Нафига для каждого триггера ты заново пикаешь всею юнитов на карте, и заново на них вешаешь эвент получения урона? Или ты думаешь в карте может быть только один триггер, который будет отлавливать получение урона?
0
30
11 лет назад
Отредактирован Clamp
0
Ты предлагаешь хранить юнитов на карте в группе и регать событие просто по группе?
Регистрация события основного проходит только один раз, пик юнитов в группу если и медленнее, то на такие такты процессора, что всем глубоко чихать.
TriggerRegisterUnitEvent(GetTriggeringTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
По-секрету. Оно регистрирует событие только одному триггеру.
И именно поэтому это действие повторяется для каждого триггера.
0
24
11 лет назад
0
Ты предлагаешь хранить юнитов на карте в группе и регать событие просто по группе?
Да нафига? ._. Элементарно же. Нужно просто создать 1! триггер, на который будет вешаться эвенты. И этот триггер будет запускать экшены подписанные на этот триггер.
0
30
11 лет назад
0
Все вместе, и все фильтры в экшнены впихать, от красота-то!
Событие оно и есть событие, оно не дублируется никаким образом. Просто вместо прямого вызова действий оно включает указанные триггеры, вся разница.
0
24
11 лет назад
0
Все вместе, и все фильтры в экшнены впихать, от красота-то!
:facepalm: Во первых если фильтрация будет в самой функции, это даже будет микрооптимальнее. Во вторых можешь написать свой эвент. Который будет создаваться при срабатывании триггера на который подписаны юниты.
0
30
11 лет назад
0
Зачем мне писать свой эвент, если я уже написал свой эвент, коим по сути и является void AnyUnitDamagedEvent(trigger)?
2
24
11 лет назад
2
Clamp, да по тому что это говнокод. Ты видимо не понимаешь, что создаешь эвентов создается равное кол-ву юнитов * на кол-во триггеров подписанных. И я уверяю тебя, эвенты не стекаются на каждом юните, ибо каждый эвент дергает другой триггер.
1 пункт от Кет: 1.1 (ненормативная лексика)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.