Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Алгоритм
Версия Warcraft:
1.31+
Диспетчер событий, реализованный на Lua. Может работать в режиме обычного объекта или в режиме WLPM модуля (определяется автоматически).
Является одним из фундаментальных модулей при построении ахритектуры приложения. Решает проблему высокого зацепления. В основе - паттерн observer

Установка

  • Копировать код из /src и использовать глобалку eventDispatcher
  • ИЛИ используя WLPM и import("eventDispatcher"):
wlpm install https://github.com/Indaxia/lua-eventDispatcher

Использование

-- Подписаться на событие
-- Параметр event - объект со свойствами "data", "name" и "stopPropagation"
-- Можно установить event.stopPropagation = true внутри коллбека, чтобы прервать текущий цикл рассылки
eventDispatcher.on("любое имя события", function(event)
    print("Callback A 1: " .. event.data)
end)

-- ... another file ...

-- Отправить событие со своими данными
eventDispatcher.dispatch("любое имя события", "данные события, любого типа")

История версий

1.2: исправлена возможность десинка (разного поведения на разных машинах) при множестве слушателей одного события
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
29
4 года назад
2
Может не будем превращать это дело в NPM с тоннами бесполезных трехстрочных пекеджей?
0
37
4 года назад
0
Doc, ещё как будем, это именно фундамент для того, на чём я буду пилить дальнейшие пекеджи)
5
7
3 года назад
5
Очень полезная штука.
Ощущение, что 99.99999% обитателей форума не поняли, что это.
Приведу простой пример, если у вас одно событие на получение урона, то через некоторое время оно обрастает большим количеством условий под каждый предмет/спелл и тд. Это полностью решает данную проблему и делает код более понятным и удобным.
3
32
3 года назад
3
Ощущение, что 99.99999% обитателей форума не поняли, что это.
Это гуи - нет
Тут есть инком - нет
Работает на джасс - нет
Работает на 126 - нет
Это аниме - нет
Вот и ответ, к сожалению, просто понимать не кому

Я в посдений раз когда в варе кодил, вообще делал отдельные эвенты в отдельном триггере, для того чтобы можно было в 100 раз проще скопипастить в другую карту, 1 блок кода с 3 событиями, мини отлов урона, мини каст спелов и никаких систем вообще.
А так вещь очень хорошая и полезная
2
27
3 года назад
2
че-то не оч понятно для чего это нужно
0
37
3 года назад
Отредактирован ScorpioT1000
0
МрачныйВорон, непрямое обращение к разным частям системы

Типа если есть какой-то модуль, он слушает эти эвенты, если нет - то и пофиг, и так со всеми. Отвязанность
0
27
3 года назад
0
ScorpioT1000, уже видел в вашей демо наработке на движение с векторами. но ничего не понял. похоже на дебаг
1
37
3 года назад
Отредактирован ScorpioT1000
1
Если по простому - это альтернатива вызова функции.
Способ Вызов:
Библиотека А реагирует на кнопку и вызывает функцию move() библиотеки Б, а Б двигает юнита
Способ События:
Библиотека Б подписывается на событие "move" и при его срабатывании двигает юнита
Библиотека А ждет нажатие кнопки и создает событие "move"
Отличие:
Попробуй удалить одну из библиотек не меняя их внутреннего кода. Прямой вызов придется переписывать

Преимущество в том, что на move могут подписаться многие библиотеки, при этом А не должна ничего о них знать
0
37
2 месяца назад
Отредактирован ScorpioT1000
0
Вышла новая версия!

Версия 1.2

Исправлена возможность десинка (разного поведения на разных машинах) при множестве слушателей одного события

Обновление

При работе с wlpm просто вызвать wlpm install, при копировании вручную обновить код из инструкции по установке
0
9
2 месяца назад
0
Если по простому - это альтернатива вызова функции.
Способ Вызов:
Библиотека А реагирует на кнопку и вызывает функцию move() библиотеки Б, а Б двигает юнита
Способ События:
Библиотека Б подписывается на событие "move" и при его срабатывании двигает юнита
Библиотека А ждет нажатие кнопки и создает событие "move"
Отличие:
Попробуй удалить одну из библиотек не меняя их внутреннего кода. Прямой вызов придется переписывать

Преимущество в том, что на move могут подписаться многие библиотеки, при этом А не должна ничего о них знать
По этому объяснению я не понял в чем разница между триггерами, мы же по сути создавая триггер и подписываемся на разные события.
0
37
2 месяца назад
Отредактирован ScorpioT1000
0
Koladik, речь про моддерский код и взаимодействие написанных нами систем. Триггеры тоже событийно-ориентированные, да. Только вот они работают на движке игры (с сетевой моделью), поэтому значительно медленнее, даже если бы мы могли создавать собственные события.
А эту штуку в целом можно и вне контекста warcraft 3 юзать.
0
9
2 месяца назад
0
Koladik, речь про моддерский код и взаимодействие написанных нами систем. Триггеры тоже событийно-ориентированные, да. Только вот они работают на движке игры (с сетевой моделью), поэтому значительно медленнее, даже если бы мы могли создавать собственные события.
А эту штуку в целом можно и вне контекста warcraft 3 юзать.
ну то есть, это, по сути, реализация подписки на события, аналогичная триггерам по функционалу но быстрее и более универсальная?
0
37
2 месяца назад
Отредактирован ScorpioT1000
0
По тому же абстрактному принципу, но не аналогичная.
  • Здесь можно передавать любые типы данных
  • Событие адресуется по строке, а не хендлу эвента триггера
  • Цикл обработки завязан только на движок lua
  • Внутри обработчика можно остановить распространение текущего срабатывания на остальные обработчики (stopPropagation)
  • Мы не привязываемся к каким-либо константам и классам (хотя строку вполне можно объявлять как константу)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.