Алгоритмы, Наработки и Способности
Способ реализации:
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
30
11 лет назад
0
В случае если разом нужно будет подписать пачку триггеров, твоя "система" повесит карту.
У меня ~50 способностей, завязанных на получении урона, штук 20 из них создают динамичные триггеры для работы способности, т.к. овертайм. Все действия по инициализации вынесены в отдельные функции, ну, ты знаешь, пикнули героя - вызвали функцию. Все они у меня после старта игры одновременно вызываются. На моей слабенькой одноядерной машине даже лагов нету. Ты облажался.
Faion:
для динамичного использования
Его каждому триггеру всего 1 раз вызывают, какое нахер динамичное использование, мастер в макасинах ручной работы?
0
37
11 лет назад
0
Ясно, лол.
Я никогда не работал с отловом урона и почему-то запомнилось как будто этой функции там не было, наверное из этой темы xgm.ru/forum/showthread.php?t=19398.
0
30
11 лет назад
0
Бывает =)
Этот комментарий удален
0
37
11 лет назад
0
На моей слабенькой одноядерной машине даже лагов нету. Ты облажался.
Если бы все авторы мелких наработок это утверждали =)))
1
30
11 лет назад
Отредактирован Clamp
1
Ну, вообще там действительно нечему лагать =)
Кстати, версия без проблемы с условием:
Код*
library UnitDamaged initializer InitRect
{
    private region  Region
    private group   Group
    private int     TrigsNum = 0
    private trigger array Trigger
    
    private void Adder()
    {
        int i = 0
        loop
        {
            TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
            exitwhen i==TrigsNum
            i++
        }
        GroupAddUnit(Group,GetEnteringUnit())
    }
    
    private void Registrator()
    {
        TriggerRegisterUnitEvent(Trigger[TrigsNum],GetEnumUnit(),EVENT_UNIT_DAMAGED)
    }
    
    void AnyUnitDamagedEvent(trigger trg)
    {
        Trigger[TrigsNum]=trg
        ForGroup(Group,function Registrator)
        TrigsNum++
    }

    private void InitRect()
    {
        trigger trg = CreateTrigger()
        Group = CreateGroup()
        Region = CreateRegion()
        GroupEnumUnitsInRect(Group,bj_mapInitialPlayableArea,null)
        RegionAddRect(Region, bj_mapInitialPlayableArea)
        TriggerRegisterEnterRegion(trg,Region,null)
        TriggerAddAction(trg,function Adder)
    }
}

*не тестировал, но должно работать
0
24
11 лет назад
0
О ужс. Ладно, так и быть, приду с работы напишу по человечески.
0
30
11 лет назад
0
Нахрен не нужно.
ScorpioT1000:
наработка рядовая, хз зачем вы там срач устроили
Faion, успокойся, смысла во всём этом цирке никакого нету. Все системы состоятельны, и эта ничем не хуже любой другой на тему.
0
24
11 лет назад
0
Все системы состоятельны
твоя система подходит только для маленьких проектов. А если кто то додумается юзать это в большом проекте, то этот человек повесит себе проект.
Короче заканчивай ныть. Приду с работы, покажу как над писать, заодно как свои эвенты создавать.
0
30
11 лет назад
0
если кто то додумается юзать это в большом проекте, то этот человек повесит себе проект
Аргументация?
Ах, прости, я забыл, это не твоя сильная сторона, аргументировать своё мнение.
Мнение СВДНа о ней, который сказал, что она не имеет недостатков (версия с массивом триггеров) я ценю (почему бы? а, он не голословит) заметно больше твоего.
0
24
11 лет назад
Отредактирован Faion
0
Аргументация?
А что тут аргументировать, ты не думал что перебор пары тысяч юнитов может стать существенной нагрузкой для большой карты, в которой "параллельно" работают десятки других систем? А если последовательно десяток инитов? В видимо не думал, в прочем тебе простительно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.