Алгоритмы, Наработки и Способности
Способ реализации:
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
24
11 лет назад
0
private void Adder()
    {
        int i = 0
        loop
        {
            TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
            exitwhen i==TrigsNum
            i++
        }
        GroupAddUnit(Group,GetEnteringUnit())
    }
Это фейл! и не оффтоп. лол.
0
30
11 лет назад
0
Proove it.
0
24
11 лет назад
0
Легко.
Пусть TrigsNum = 100500 (или как минимум > JASS_MAX). Дальше ясно, или нужна помощь кэпа?
for(int i = 0; i < 50; i++)
{
   AnyUnitDamagedEvent(CreateTrigger())
}
При условии что на карте овер 1к юнитов.
Дальше ясно, или нужна помощь кэпа?
0
30
11 лет назад
Отредактирован Clamp
0
Если Вы умудрились создать over9000 триггеров с событием на получение урона, то проблемы с переполнением массива будут интересовать Вас в последнюю очередь. Кроме того, vJass эмулирует увеличенный размер массива, в результате чего для переполнения придётся создать больше 64 миллионов триггеров. В дополнение к этому замечу, что я не могу даже представить ситуацию, при которой понадобится одновременно создавать 50 триггеров, использующих одно и тоже событие.
0
24
11 лет назад
0
Кроме того, vJass эмулирует увеличенный размер массива
Что то я не вижу тут эмуляции :|
больше 64 миллионов триггеров.
409550 триггеров. fxd*
Если Вы умудрились создать over9000 триггеров с событием на получение урона...
for(int i = 0; i < 9000; ;i++)
{
  trigger t = CreateTrigger()
  AnyUnitDamagedEvent(t)
  DestroyTrigger(t)
  t = null;
}
то проблемы с переполнением массива будут интересовать Вас в последнюю очередь.
Только в случае использование Вашей наработки.
0
30
11 лет назад
0
for(int i = 0; i < 9000; ;i++)
{
  trigger t = CreateTrigger()
  AnyUnitDamagedEvent(t)
  DestroyTrigger(t)
  t = null;
}
Под "умудрились создать" имеется в виду "создать триггеров для реализации каких-либо полезных действий", разумеется.
0
24
11 лет назад
0
что я не могу даже представить ситуацию, при которой понадобится одновременно создавать 50 триггеров, использующих одно и тоже событие.
А Вы не представляйте, вы реализуйте так, что б система работала независимо от кривости рук использующего.
0
30
11 лет назад
0
Кстати, в Вашем примере порог в 9000 не будет преодолён, считаю нужным заметить.
Если использующий не способен адекватно использовать данную систему, простота которой стремится к максимальной отметке, то он в любом случае не сможет создавать программированием контент, достойный внимания. А использование моей системы для создание плохого контента не кажется мне интересной идеей.
0
24
11 лет назад
0
Под "умудрились создать" имеется в виду "создать триггеров для реализации каких-либо полезных действий", разумеется.
Поинтересуйтесь у быдлокодеров, они обязательно найдут способ использовать вместо 1 эвента на 100500 действий, по эвенту на каждое действие.
0
30
11 лет назад
0
409550 триггеров. fxd*
Неверные исправления - Ваш конёк.
Faion:
Поинтересуйтесь у быдлокодеров
Следуя Вашей логике, мне следует поинтересоваться у себя. Так вот, я использую по триггеру на каждый вид действия: 1 триггер на реализацию постоянных (пассивных) способностей, реагирующие на получение урона, 1 триггер на способности с динамичным воздействием (урон = 2х полученного урона, к примеру) и 1 триггер для систем статистики, отображения урона и агро-системы.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.