DSmmo

Аддон отслеживающий event-ы

12 posts in this topic

Порой нужно найти нужные ивенты, которые приходят на то или иное действие. Насчитал более 600 ивентов. Вывод параметров приходящих с ивентом получить легко, а вот имя ивента с параметрами увязать не могу. 

Хотелось бы видеть картинку в mods на подобие:

Warning: addon CheckEvents: EVENT_ADDON_LOAD_STATE_CHANGED
Info: addon CheckEvents: loading: true
Info: addon CheckEvents: unloading: false
Info: addon CheckEvents: name: UserAddon/CheckEvents

Часть с параметрами реализовал следующим образом:

local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
local reaction = {}

for _, event in pairs( events ) do	
	reaction[ event ] = function ( params )
		LogWarning( " _______________ " ) -- Сюда подразумевалось выводить название ивента
		
		if params then
			for key, value in pairs( params ) do
				LogInfo( key, ": ", value )
			end
		end
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

А вот с именем как не пробовал получается nil. После выхода из тела цикла естественной переменные цикла чистятся и уже в функциях остаётся пустота. Как это можно победить? Что можно придумать чтобы можно было получать такую информацию?

Кроме создания 600+ отдельных функций не вижу решений... 

Share this post


Link to post
Share on other sites

Не понял зачем это надо.

Так вместо 

LogWarning( " _______________ " ) -- Сюда подразумевалось выводить название ивента

LogInfo(event)

Выведет EVENT_ADDON_LOAD_STATE_CHANGED из массива events

Share this post


Link to post
Share on other sites

Выше дан ответ. Код полностью:

local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
local reaction = {}

for _, event in ipairs( events ) do	
	reaction[ event ] = function ( params )
		LogWarning(event) -- Сюда подразумевалось выводить название ивента
		
		if params then
			for key, value in pairs( params ) do
				LogInfo( key, ": ", value )
			end
		end
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

Могу посоветовать воспользоваться функцией  advtostring() вот отсюда:

Получаем такой код:

local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
local reaction = {}

for _, event in ipairs( events ) do	
	reaction[ event ] = function ( params )
		LogInfo(event, ": ", advtostring(params))
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

Результат будет примерно такой:

Info: addon CheckEvents: EVENT_ADDON_LOAD_STATE_CHANGED: {
	loading = true,
	unloading = false,
	name = 'UserAddon/CheckEvents'
}

 

Share this post


Link to post
Share on other sites
7 часов назад, logg сказал:

Не понял зачем это надо.

Так вместо 


LogWarning( " _______________ " ) -- Сюда подразумевалось выводить название ивента

LogInfo(event)

Выведет EVENT_ADDON_LOAD_STATE_CHANGED из массива events

Циклом создаю функции и помещаю их в массив. Следом подписываю функции на ивенты.

После отработки цикла функции есть и работают, но без переменных цикла, а переменная event, в которой хранится имя ивента и есть переменная цикла.

Share this post


Link to post
Share on other sites
2 часа назад, DSmmo сказал:

Никто что ль не знает как можно это решить??

local events = {"EVENT_ADDON_LOAD_STATE_CHANGED",  }
local reaction = {}

for _, event in ipairs( events ) do	
	reaction[ event ] = function ( params )
		LogInfo(event) -- Сюда мы и пишем имя эвента, которое будет выводиться
		
		if params then
			for key, value in pairs( params ) do
				LogInfo( key, ": ", value )
			end
		end
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

И в лог, соответственно, пишет:

[23:37:55]Info: addon EventCollecter(0): EVENT_ADDON_LOAD_STATE_CHANGED
[23:37:55]Info: addon EventCollecter(0): debug: false
[23:37:55]Info: addon EventCollecter(0): loading: true
[23:37:55]Info: addon EventCollecter(0): name: UserAddon/EventCollecter
[23:37:55]Info: addon EventCollecter(0): unloading: true
[23:37:56]Info: addon EventCollecter(0): EVENT_SECOND_TIMER
[23:37:56]Info: addon EventCollecter(0): elapsedMs: 1006
[23:37:56]Info: addon EventCollecter(0): timeMs: 1564087076024
[23:37:57]Info: addon EventCollecter(0): EVENT_SECOND_TIMER
[23:37:57]Info: addon EventCollecter(0): elapsedMs: 1014
[23:37:57]Info: addon EventCollecter(0): timeMs: 1564087077038
[23:37:58]Info: addon EventCollecter(0): EVENT_SECOND_TIMER
[23:37:58]Info: addon EventCollecter(0): elapsedMs: 996
[23:37:58]Info: addon EventCollecter(0): timeMs: 1564087078034

Или оно не так должно работать?

Share this post


Link to post
Share on other sites
1 час назад, DSmmo сказал:

Так...

Хм... в чем разница pairs и ipairs??

Ipairs проходит последовательно по индексам (пара индекс - значение ) в числовом порядке,  пока не встретит пару с nil значением ( не числовые ключи наподобие a["one"] он вообще не увидит, и какие-либо числовые после 1-ой пары с nil тоже) 

pairs же проходит по ключам (пара ключ - значение) то есть по всей таблице, но совсем не последовательно

Share this post


Link to post
Share on other sites

Поменял на ipairs - разницы нет... блииин
Версия клиента 4.0 (забыл ранее указать)
видимо мне придётся самому искать решение

Share this post


Link to post
Share on other sites
local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
local reaction = {}

for _, event in ipairs( events ) do
  	local event = event
	reaction[ event ] = function ( params )
		LogWarning(event)
		
		if params then
			for key, value in pairs( params ) do
				LogInfo( key, ": ", value )
			end
		end
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

Lua 5.0.3

Share this post


Link to post
Share on other sites

Пробовал я локально сделать, но пробовал внутри функции... завтра попробую так сделать, отпишу.

Вопрос: разве eventtrack(могу допустить ошибку) в wow не удобная штука? Показывает ивенты и их параметры в реальном времени. Я пытаюсь сделать подобие для аллодов...

Share this post


Link to post
Share on other sites
21 час назад, LEM сказал:

local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
local reaction = {}

for _, event in ipairs( events ) do
  	local event = event
	reaction[ event ] = function ( params )
		LogWarning(event)
		
		if params then
			for key, value in pairs( params ) do
				LogInfo( key, ": ", value )
			end
		end
	end
	
	common.RegisterEventHandler( reaction[ event ], event )
end

Lua 5.0.3

Работает, спасибо)
Вопрос решен!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now