Перейти к содержанию

Программирование на LUA для создания аддона


Yamenko

Рекомендуемые сообщения

В php функция var_dump($arg); вернет примерно такое значение для таблицы (массива):

array(3) {[name]=>string("Название")[qwer]=>int(2)[default]=>array(3) {[0]=>string(1) "a" [1]=>string(1) "b" [2]=>string(1) "c" }}

 

указывает тип и что есть в переменной $arg в данном случае внутри массива лежит строка, численное значение и вложенный массив с 3мя значениями...

 

думал может в LUA есть что-то похожее...

 

через перебор таблицы есть некоторые сложности, если есть вложенные таблицы их тоже нужно смотреть отдельно, а если переменная ссылается на функцию, то вообще не понятно, что там может быть :-)

Если функцию не сделали ЗОСы, то можно написать и самому, юзай на здоровье. :)

local function var_dump(...)
	local function pairs_table(a, i)
		local s = "(" .. tostring(#a) .. "){"
		for n, v in pairs(a) do
			local t = type(v)
			s = s .. "[" .. n .. "]=>" .. t
			if t == "number" then
				s = s .. "(" .. v .. ")"
			elseif t == "string" then
				s = s .. "(\"" .. v .. "\")"
			elseif t == "boolean" then
				if v then s = s .. "(True)" else s = s .. "(False)" end
			elseif t == "table" then 
				if i < 5 then -- Ограничиваем рекурсию вложенностью в 5 раз
					s = s .. pairs_table(v, i + 1) -- Рекурсивный вызов функции
				else
					s = s .. "{???}" -- Если превышена вложенность выдастся это
				end
			-- Не обрабатываются типы "nil", "function", "userdata" и "thread"
			-- Для них выведется только название типа
			end
			s = s .. " " -- Разделитель пробел, можно указать другой
		end  
		return s .. "}"
	end
	return "arg" .. pairs_table(arg, 0)
end

local function test(...)
	local s = var_dump(...)
	d(s)
end
 

Тем более для того, что я хочу сделать (галочку напротив рецептов и мотивов) как я понял нужно будет еще GUI разбирать.

Да, в работе ГУИ придется разбираться, без этого никак. Можно поковырять аддоны которые делают подобные вещи. Например:

ShowMotifs - Выводит в окне инвентаря рядом со шмоткой иконку соответствующую стилю шмотки.

DIKIFA - Выводит во всплывающем описании мотива или рецепта список персов которые его знают (зеленым) и которые не знают (красным).

SousChef - Выводит в окне инвентаря рядом с рецептом яркую галочку если этот рецепт не известен основному повару и тусклую если не известен текущему персу. Аддон устарел и может глючить под текущим релизом игры.

Изменено пользователем ForgottenLight
Ссылка на комментарий
Поделиться на другие сайты

Пробую функцию но что-то опять не так :-)
вобщем при использовании функции ошибка

user:/AddOns/DNSE/DNSE.lua:44: operator # is not supported for # nil

Приходит пустой запрос
вот что отправляю:

local DNSE = {
              name = "DNSE", 
              version = "0.0.1", 
              textError = {}, 
              default = {
                         showFrame = false, 
                         showText = true, 
                         showGreeting = true
              }
}

тут часть кода и функции...

d(var_dump(DNSE)) 

Пробовал и локальную и глобальную переменную туда отправлять, пробовал одно значение отправлять одно и тоже приходит "nil"
если в начале функции написать d(arg) то он пишет nil... 
Немного переделал твою функцию, но проблема таже:

local function var_dump(...)

	local function S(a)
		local s = tostring(a)
		return s
	end
		
	local function pairs_table(ar)
		for key, val in pairs(ar) do
			local typeArg = type(val)
			if typeArg == "table" then pairs_table(val) 
			else msg = msg.."["..S(key).."]=>"..typeArg.."("..S(val)..")"
			end
			msg = msg.." "
		end
		msg = msg.."\n"
		return msg	
	end
	return "Сообщение:\n"..pairs_table(arg)
end

вобщем бьюсь с функцией второй день... :-)
Заранее спасибо :-)

Изменено пользователем Yamenko
Ссылка на комментарий
Поделиться на другие сайты

Надо будет глянуть, я написал функцию по теории на работе , на практике ее не испытывал.

 

Добавлено:

Сейчас глянул поиском по аддонам, похоже ЗОСы не сделали поддержку ключевого слова arg в своей версии LUA, но нашлось интересное решение, там первой строкой функции вписано:

local arg = {...}
Попробуй тоже так сделать.
Изменено пользователем ForgottenLight
Ссылка на комментарий
Поделиться на другие сайты

@ForgottenLight, Да тоже поразбирал аддоны, все логично :-) надо же обратиться к переменным.

Можно сразу напрямую обращаться в (...) , без дополнительно переменной

"return "Сообщение: "..pairs_table(...)"

попробовал - работает... надо будет немного вывод настроить и обработку вложенных таблиц.

Спасибо 

Ссылка на комментарий
Поделиться на другие сайты

@ForgottenLight, Да тоже поразбирал аддоны, все логично :-) надо же обратиться к переменным.

Можно сразу напрямую обращаться в (...) , без дополнительно переменной

"return "Сообщение: "..pairs_table(...)"

попробовал - работает... надо будет немного вывод настроить и обработку вложенных таблиц.

Спасибо

Тогда скорее:

"return "Сообщение: "..pairs_table({...})"

Если подать просто три точки, то туда передастся несколько переменных (если конечно у процедуры несколько параметров) и в результате процедура pairs_table обработает только первую в списке. А если заключить три точки в фигурные скобки, то из этих переменных будет сформирована таблица, и в процедуру подастся таблица.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Так с этим вроде разобрался немного.

но появилось еще парочка вопросов:

Вопрос в том где вы смотрите как пользоваться такими функциями как CHAT_SYSTEM и похожими... на wiki не нашел...

 

PS еще вопрос: Если есть ошибки в аддонах выскакивает окошко с ошибками. Я использую вот такую сборку:

local function AddErrorInChat(_, text)
	if text ~= nil then 
		if saveVars.showFrame then ZO_UIErrors_HideCurrent() end -- Скрывает окно ошибок
		if saveVars.showText then d("Text: "..text) end 					-- Вывод в чат ошибки если активно в настройках
	end
end
EVENT_MANAGER:RegisterForEvent(DNSE.name.."_AddErrorInChat", EVENT_LUA_ERROR, AddErrorInChat)

Если эти ошибки в середине игры когда персонаж уже активен, тогда очень хорошо работает... а вот сразу после загрузки не выводит сообщений и не закрывает окошко...

"ZO_UIErrors_HideCurrent()" пробовал пихать и в "EVENT_ADD_ON_LOADED" и в "EVENT_PLAYER_ACTIVATED", но результата нет...

 

Заранее премного благодарен.

Изменено пользователем Yamenko
Ссылка на комментарий
Поделиться на другие сайты

Так с этим вроде разобрался немного.

но появилось еще парочка вопросов:

Вопрос в том где вы смотрите как пользоваться такими функциями как CHAT_SYSTEM и похожими... на wiki не нашел...

 

На данный момент у меня стоит около 60 аддонов. Вот у коллег по цеху многие функции и подсматриваю. :) Еще на ЕСОУИ выкладывают исходники интерфейса от ЗОСов, там тоже можно поковыряться.

 

PS еще вопрос: Если есть ошибки в аддонах выскакивает окошко с ошибками. Я использую вот такую сборку:

local function AddErrorInChat(_, text)
	if text ~= nil then 
		if saveVars.showFrame then ZO_UIErrors_HideCurrent() end -- Скрывает окно ошибок
		if saveVars.showText then d("Text: "..text) end 					-- Вывод в чат ошибки если активно в настройках
	end
end
EVENT_MANAGER:RegisterForEvent(DNSE.name.."_AddErrorInChat", EVENT_LUA_ERROR, AddErrorInChat)
Если эти ошибки в середине игры когда персонаж уже активен, тогда очень хорошо работает... а вот сразу после загрузки не выводит сообщений и не закрывает окошко...

"ZO_UIErrors_HideCurrent()" пробовал пихать и в "EVENT_ADD_ON_LOADED" и в "EVENT_PLAYER_ACTIVATED", но результата нет...

 

Есть подозрение, что эти ошибки случаются до как запускается этот аддон, они накапливаются где то, а после захода чара уже показываются.

 

Заранее премного благодарен.

Извиняй, что ответил не сразу - на работе меня малость пригрузили под конец года. :) А по приходу домой голова думать совсем отказывается. :)

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...