Алгоритмы, Наработки и Способности
Способ реализации:
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 лет назад
Отредактирован Faion
0
А зачем вообще TriggerResgister ? сделайте класс, наследуйтесь от него и передавайте системе
Затем что у нас тут СОП, а не ООП.
Clamp:
Хотя в целом не лучше и не хуже.
Лол. Объясняю для особо одаренных, почему твой код - уг.
Берем из твоей либы:
AnyUnitDamagedEvent(trigger trg)
И регистрируем 100, опустим тот факт, что нефига не зарегистрируется, если на карте много юнитов, ну а далее, мы уничтожаем 99 триггеров(ты же не думал что они будут все статичными, лол).
И смотрим сюда:
private void Adder()
    {
        int i = 0
        loop
        {
            TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
            exitwhen i==TrigsNum
            i++
        }
        GroupAddUnit(Group,GetEnteringUnit())
    }
Лол. Конечно же моя система ничем не лучше :D
Для самых одаренных из одаренных поясняю, в твоей системе еще нужно писать метод для удаления твоей костыльной регистрации ._.
0
30
11 лет назад
Отредактирован Clamp
0
  1. события нельзя удалять
  2. каждое событие существует в единственном экземпляре и имеет ряд ссылок на завязанные на нём триггеры.
  3. количество ссылок на удалённые триггеры никаким образом не влияет на производительность карты и затрачиваемый ею объем оперативной памяти.
Вывод: нет никакой необходимости эти ссылки чистить.
Заметка: аргумент про перманентность событий для каждого динамичного триггера появился только что, а сообщил ты о нём так, как будто уже три дня только об этом и говоришь.
Дополнение: твоя регистрация не менее костыльная ввиду того, что у тебя тоже нельзя её удалить.
P.S.: дискуссия с тобой неприятна ввиду твоей речевой стилистики, низкой грамотности, открытого неуважения к оппоненту и того, что ты не скрываешь, что это неуважение вызвано самим фактом того, что он является твоим оппонентом. Также твоё общение выглядит так, будто ты страдаешь нарциссизмом, однако при этом готов вылизывать обувь людям, от которых зависишь, что является типичным признаком низкой самооценки и вызывает следствие в виде попыток самоутвердиться на тех, кто заведомо слабее тебя в теме дискуссии, и даже при этом ты умудряешься опускаться до переходов на личности и повторов отбитых аргументационных суждений.
P.P.S.: дальнейшие твои сообщения с речевыми конструкциями вида "твоё ... - убогое" или "моё ... лучше по факту того, что оно лучше" будут просто игнорироваться, а в случаях, где будет отсутствовать иное содержание - удаляться.

и да, на все динамичные спелы типа "юнит получит х2 от полученного урона" нормальные люди используют один единственный триггер.

я предупреждал, а за офтоп так ещё и пункты полагаются.
2 комментария удалено
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 триггер для систем статистики, отображения урона и агро-системы.
0
24
11 лет назад
Отредактирован Faion
0
Если использующий не способен адекватно использовать данную систему, простота которой стремится к максимальной отметке, то он в любом случае не сможет создавать программированием контент, достойный внимания. А использование моей системы для создание плохого контента не кажется мне интересной идеей.
Речь не о адекватности использующего или еще о чем то ином вязанном о использовании. Как минимум если существует метод Add, то должен быть метод Remove,который будет реализовывать удаление уже не нужного триггера из Trigger[].
Clamp:
Неверные исправления - Ваш конёк.
:hmm:
0
30
11 лет назад
0
Попробуй начать ставить пробелы после всех знаков препинания, пожалуйста.
Faion:
должен быть метод Remove, который будет реализовывать удаление уже ненужного триггера
Система разрабатывалась с расчётом на адекватное использование, а оно не подразумевает создание нового триггера на каждый случай инициализации заклинания.
0
24
11 лет назад
0
1 триггер на реализацию постоянных (пассивных) способностей, реагирующие на получение урона
Быдлокодер будет использовать на каждую способность своему эвенту, очевидно же.
Систем так же может быть более десятка. Новые юниты так же могут пачками создаваться.
Особо одаренные могут подписываться на регистрацию эвента при каждом использовании.
Clamp:
Система разрабатывалась с расчётом на адекватное использование, а оно не подразумевает создание нового триггера на каждый случай инициализации заклинания.
Цель публикации системы не в том, чтобы показать "ололо, я могу", а чтобы её могли использовать те, кто не в состоянии написать.
0
30
11 лет назад
0
:hmm:
Хорошо, здесь ты прав.
Если я могу использовать что-то, что я не в состоянии сделать самостоятельно, я всё равно буду стараться использовать это адекватно. Например, не буду забивать гвозди микроскопом.
0
24
11 лет назад
0
я всё равно буду стараться использовать это адекватно.
Те кто не в состоянии написать подобное, как правило и занимаются забиванием гвоздей микроскопом. Ибо те кто не подходят под это описание, пишут сами свои системы.
0
37
11 лет назад
0
Есть мнение, что вариэйбл эвент очень сильно тормозит систему кстати, адик что-то говорил про это.
Попробуйте затестить например простое изменение 1000 переменных и с повешенными на них событиями.
Ну с таймером офк
0
24
11 лет назад
0
ScorpioT1000, определенно нет. Этот эвент, тоже самое что: TriggerRegisterUnitStateEvent(trig, whichUnit, UNIT_STATE_MANA, opcode, limitval)
0
37
11 лет назад
0
Faion, ты уже провел тесты?
0
24
11 лет назад
0
ScorpioT1000, нет, т.к. я не особо сомневаюсь, да и пока не пользуюсь этой либой. По этому у тебя есть прекрасная возможность развеять свои сомнения и мою уверенность :)
0
37
11 лет назад
0
ScorpioT1000:
Мне лень
Вот чтд xgm.ru/forum/showthread.php?t=28464
Ну и пстодиод www.wc3c.net/showthread.php?t=107658
Тоесть просто у джасса в операторе аля JassSetValue есть проверка, есть ли триггеры на данный эвент
0
24
11 лет назад
0
Есть мнение, что вариэйбл эвент очень сильно тормозит систему кстати
Тоесть просто у джасса в операторе аля JassSetValue есть проверка, есть ли триггеры на данный эвент
Ну ятп работает ок.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.