Алгоритмы, Наработки и Способности
Способ реализации:
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
21
6 лет назад
Отредактирован scopterectus
0
Clamp, Но я же не внутри варика.
Может я еще неправильно прочитал/понял код, но даже если воин войдёт, выйдет и снова войдёт в bj_mapInitialPlayableArea. То всем триггерам добавится второе событие на одного и того же юнита?
2
32
6 лет назад
2
ScopteRectuS, когда юнит создается на карте - он входит в игровой рект (bj_mapInitialPlayableArea), а когда он умирает он никуда не уходит, где был там и остается, у совсем дохлы координаты х -0.00, y - 0.00 что является центром карты.
Выйти за пределы карты юнит не может, т.к игра завершится с фаталом.
6
16
6 лет назад
6
Юнит МОЖЕТ выйти за пределы bj_mapInitialPlayableArea. Для нормальной работы создай рект -99999,-99999,99999,99999 и в нём регистрируй входящих.
0
21
6 лет назад
0
quq_CCCP, DracoL1ch, я не имел ввиду выход воина из области карты, когда GetUnitX( ) > GetRectMaxX( ) и GetUnitY( ) < GetRectMinY( ).
Я имел ввиду другое, например, если воина спрятать, а затем снова показать, или воскресить мёртвого воина и тому подобные случаи.
0
8
6 лет назад
0
ScopteRectuS, спрятанный стоит там же, а воскресить = создать нового юнита.
0
21
6 лет назад
0
воскресить = создать нового юнита
тут не согласен, потому что GetHandeId( ) возвращает одно и то же число.
0
32
6 лет назад
0
ScopteRectuS, умершие с карты никуда не уходят.
0
8
6 лет назад
Отредактирован uranus
0
ScopteRectuS, а может просто Remove идет на труп? Хм, странно, почему я был так уверен в этом.
0
16
6 лет назад
0
а с чего ради воскрешение должно труп уничтожать? По логике вещей проще объекту хп вернуть и всё, чем пересоздавать
2
30
6 лет назад
2
воскресить = создать нового юнита
У меня целая карта строилась на том, что воскрешение работает согласно своему названию и ничего не пересоздаёт.

По каким-то причинам был уверен, что разложившиеся юниты триггерят событие выхода из региона.
Поправил этот момент, теперь триггерит на событие собственно разложения.
0
21
6 лет назад
0
Хотел только было сказать что система не ловит саммонов, но вижу ты все уже пофиксил.
0
21
6 лет назад
Отредактирован scopterectus
0
	private function onUnitDecay takes nothing returns nothing
        call GroupRemoveUnit(allUnits, GetLeavingUnit())
    endfunction
0
21
6 лет назад
0
Хотя в итоге не сильно удобней чем в классическом виде.
0
30
6 лет назад
0
ScopteRectuS, спасибо, поправил.

Raised, "классического" вида знавать не приходилось.
0
21
6 лет назад
0
2 Триггера жеж. Тем более нет смысла так запариваться когда можно создать простой обработчик урона. Регать овердохрена событий для тучи триггеров - так себе подход.
0
30
6 лет назад
0
создать простой обработчик урона
Вот тут поподробнее, пожалуйста.
0
21
6 лет назад
Отредактирован Raised
0
Функция, которая срабатывает когда проходит урон. В ней проверяются условия и эксекутится соответствующая функция в зависимости от кейса. А ты о чем подумал?
0
30
6 лет назад
0
срабатывает когда проходит урон
Как?
0
21
6 лет назад
0
Так как обычно.
0
21
6 лет назад
0
Clamp, я думаю он имел ввиду сделать так, как было ранее.
0
21
6 лет назад
Отредактирован Clamp
0
раскрыть
    function OnDamage takes nothing returns nothing
        //Тут проверки и эксекут функции, в зависимости от кейса. Только не перегрейся.
    endfunction

    function OnMapEntrance takes nothing returns nothing
        call TriggerRegisterUnitEvent(ON_UNIT_DAMAGE,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
    endfunction

    function main takes nothing returns nothing
        call InitBlizzard()
        
        set WHOLE_MAP = CreateRegion()
        call RegionAddRect(WHOLE_MAP,bj_mapInitialPlayableArea)
        
        set ON_MAP_ENTRANCE = CreateTrigger()
        call TriggerRegisterEnterRegion(ON_MAP_ENTRANCE,WHOLE_MAP,null)
        call TriggerAddAction(ON_MAP_ENTRANCE,function OnMapEntrance)
      
        set ON_UNIT_DAMAGE = CreateTrigger()
        call TriggerAddAction(ON_UNIT_DAMAGE,function OnDamage)
                         
    
        set MY_UNIT = CreateUnit(Player(0),'U005',-3440.0,3542.7,309.950)
        call SetHeroStr(MY_UNIT,14,true)
        call SetHeroAgi(MY_UNIT,14,true)
        call SetHeroInt(MY_UNIT,24,true)
        call SetUnitColor(MY_UNIT,ConvertPlayerColor(12))
        
        set NEUTRAL_UNIT = CreateUnit(NEUTRAL_UNIT,'u003',3269.8,2784.1,262.763)
        call SetUnitColor(NEUTRAL_UNIT,ConvertPlayerColor(12))
            
    endfunction 
2 пункта от Кет: 2.1 (оскорбление)
0
30
6 лет назад
0
Raised,
main
Удачи вручную перепаковывать .j файл после каждого сейва карты.
2
37
6 лет назад
2
Clamp, есть inject
0
21
6 лет назад
0
Если что инжект перезаписывает майн.

По сабжу: имелл ввиду 2 триггера которые регают событие для третьего. Первый при ините добавляет ивент для всех начальных юнитов. Второй - при входе на карту. Это и есть "Как обычно".
Вешать на каждый ивент по бандлу триггеров едва ли целесообразней чем эксекутить функцию в зависимости от кейса, то есть необходимость такой "системы" весьма спорна.
0
30
6 лет назад
0
Первый при ините добавляет ивент для всех начальных юнитов.
Для этого не нужна сущность триггера, что прекрасно видно из кода системы.

Вешать на каждый ивент по бандлу триггеров
Вот только это эвенты вешаются на триггеры, а не наоброт.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.