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

Программирование на 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 пользователей онлайн

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

    • Mayron
      Алкогольная независимость - это когда ты не зависишь от алкоголя, а выпиваешь в любой момент, когда душа пожелает.
    • Mayron
      — Чем отличается женская логика от мужской? — Мужская логика проста: два плюс два равно четыре. Женская логика сложнее: два плюс два иногда бывает пять, потому что настроение хорошее.
    • Mayron
      Допрашивают даму: - Охарактеризуйте Ваш источник доходов! Дама: - На неприличные вопросы не отвечаю!
    • Mayron
      Коллега просила на день рождения вакууматор, а подружки подарили ей вакуумный вибратор. Она расстроилась, но ненадолго.
    • Mayron
      Понял, что нужно заняться фигурой, когда закрывая ноутбук прищемил складку на животе…
    • Mayron
    • ReyAnd
      Дак все ж такие. И все из этих всех, считают, что они единственные в своём роде
    • Mayron
      В святые 90-е в кино и сериалах снимались актеры и актрисы без особых сценических талантов, но сплошь красавицы и красавцы. Это были любовницы и любовники элиты тех лет. Сейчас в основном снимаются и без актерских талантов, и без внешних данных. Ведь это дети тех самых актрис из 90-х от сильно страшной элиты 90х.
    • Mayron
      Самые ужасные люди - это те, чья самооценка не зависит от чужого мнения. Они не соглашаются, если не согласны. Отказывают без чувства вины. Не ждут одобрения. Уважают чужую позицию, но не меняют свою, если не согласны. Живут так, будто можно быть собой. Жутко, правда?
    • Mayron
      Наконец-то мои соседи сверху попали: с 1 сентября россиянам запретили держать дома бегемотов и слонов!
×
×
  • Создать...