Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
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 триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
ScorpioT1000, ну мой вброс будет концептуально отличаться от того что имеется на данный момент :)
22
Не очень система. Та что была создана Скорпом лучше.
30
А это что тогда по твоему?
Это триггер в базу пишется, и для каждого триггера это место ровно один раз вызывается -__-
ScorpioT1000:
на событие "юнит атакован" делать то же самое
Я помню, там ещё таймеры зачем-то создавались, чтобы удалить юнита из подборки D:
Bornikkeny:
Та что была создана Скорпом лучше
ссылку же

в целом я запарился, изображай из себя гения дальше, чо :3
24
Это триггер в базу пишется, и для каждого триггера это место ровно один раз вызывается -__-
Кэп?
в целом я запарился, изображай из себя гения дальше, чо :3
:facepalm:
Зачем мне изображать? Я просто опишу напишу аналог твоей системы, который будет лучше, и все.
38
Bornikkeny, ты не ошибся?
Я помню, там ещё таймеры зачем-то создавались, чтобы удалить юнита из подборки D:
Да, чтобы после этого анрегать эвент, видимо, проседало фпс. Надо почитать векса.
30
Clamp:
Один раз за всю игру эта регистрация проходит /о
А это что тогда по твоему? ._.
код
Я тебе сказал "А", ты мне ответил "это не А, это Б", я ткнул, что "я сказал А", ты ответил "кэп?"

ScorpioT1000:
чтобы после этого анрегать эвент
ну вот, там обычно ставили 3 секунды, и если с момента атаки проходило больше - урон не регистрировался. Урон от способностей, где в поле boolean attack стояло "false", также не учитывался.
24
Я тебе сказал "А", ты мне ответил "это не А, это Б", я ткнул, что "я сказал А", ты ответил "кэп?"
Хватит строить из себя идиота. Ты прекрасно понял что я о:
ForGroup(Group,function Registrator)
30
ForGroup(Group,function Registrator)
Один раз для каждого триггера. Мимо.
24
Clamp, я в курсе что один раз, для каждого триггера ._. Только ты реально думаешь, что перебор и обвес эвентами пачек юнитов при каждом ините это ок?
33
Faion, если работает, в чём проблема? Ты тестил, или споришь о сферическом коне в вакууме?
30
уф.
1 юнит - 1 ивент.
Каждый юнит на карте должен иметь этот ивент (за явными исключениями вроде ДГУИ) для полноценной работы системы. Так или иначе, тебе придётся пройтись по каждому юниту, чтобы каждый получил этот ивент. Ты не можешь создать свою переменную типа "event", нету нативных функций для этого.
Советую закончить этот спор, ты ведёшь его очень слабо, предоставляя аргументы по принципу "новое - хорошо забытое старое". Количество триггеров, которые работают с этим событием - это только выбор создателя карты. У меня все способности на одном, а счётчики для кое каких систем - на другом. Итого их два, и мне норм.
Кет:
споришь о сферическом коне в вакууме
Порноактёры меряются длинной МПХ, но Файону здесь не повезло, и он пытается хоть в чём-нибудь выпендриться.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.