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

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

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

    • ReyAnd
      Короче, зомбаков я смотрю, как комедию а это реальный конец света, который мы оценим про Украину в 2040-ом, а он был в 2017-ом. И девочек шитью будем учить. 
    • ReyAnd
      Истина - это красота, красота без всякой пользы. (с) Цитата из фильма и теперь попытаемся забыть сочную грудастую женщину и увидим истинную красоту...без всякой пользы.
    • ReyAnd
      Не всегда прекрасная, но иногда просто глаза и музыка - идеальны, как..  
    • ReyAnd
      1-42 до 1-45. Умным людям давно всё понятно, а у нас ЦЕЛОЕ ПОКОЛЕНИЕ дебилов, боящихся женщин А тут, считай берестяная грамота для ДБ
    • ReyAnd
      А разве с 1-20 до 1-26 - это же наша юность, или как сейчас говорят "пубертат"...В одной сцене - лет пять-десять нынешнего дебила, включая меня 
    • ReyAnd
      Я тут начал СЛУШАТЬ аудио-книги. Это ужасно. Насколько это бездарно. Внутренний чтец божественнен, по сравнению с нынешними чтецами. А я ведь знаю, что есть и хорошие декламаторы. Дак вот, это сериал - идеальный чтец этой книги. Ты не представляешь, как гнусно м блевотно читают Достоевского и Стругацких Буду покупать бумагу.
    • ReyAnd
      Забавно и страшно показан наш Хачапури, совершенно не понимающий почему происходит Майдан 1917, приветствующий его и...Тут мы продолжим   
    • ReyAnd
      Да как тебе объяснить? Наш Мостоотряд №6 строил Крымский мост. А в безымянном овраге рядом с нашим, без шуток, современным предприятием, были выкопаны погреба, вручную. Давно. Сухие и набитые трёхлитровыми баллонами с витаминами всех видов А в моём доме был непонятный сруб и однажды в детстве, в 80-ых я его открыл. А там снег лежит. Лет 50. И вот когда читаешь Горького становится понятно, как жили в землянках и как жили без холодильников. Уж точно, девочки его книги не писали.  Я бы начал с классики. Отрочество. Юность. Мои Университеты.     
    • Mayron
      Ассортимент на 27-28 декабря 2025 года: Предложение действительно до 15:00 (МСК) 29 декабря 2025 года.
    • Mayron
      Ассортимент на 27-28 декабря 2025 года:   • Вварденфелльский анемон (корзина)   Vvardenfell Anemone, Basket  :  3 500 g. • Вварденфелльский анемон (крепкий)   Vvardenfell Anemone, Strong  :  25 000 g. • Вварденфелльский анемон (побег)   Vvardenfell Anemone, Sprout  :  5 000 g. • Вварденфелльский коралловый куст (крепкий)   Vvardenfell Coral Plant, Strong  :  10 000 g. • Вварденфелльский коралловый куст (молодой)   Vvardenfell Coral Plant, Young  :  5 000 g. • Гриб (узловик, гигантский)   Mushroom, Giant Tanglestalk  :  20 000 g.    *New* • Грибы (серый шип, скопление)   Mushroom, Gray Spike Cluster  :  1 500 g. • Ксилярия с Вварденфелла (раздвоенная)   Vvardenfell Xylaria, Forked  :  2 500 g. • Растение (змеиная лоза Мрачных Трясин)   Plant, Murkmire Snakevine  :  7 000 g. • Светящиеся стебли Глубокой Тени (назойливые)   Darkshade Glowstalks, Inquisitive  :  45 000 g. • Цветок (кода)   Flower, Coda  :  3 000 g. • Цветы (рогоз)   Flower, Reed Mace  :  3 000 g. Предложение действительно до 15:00 (МСК) 29 декабря 2025 года.
×
×
  • Создать...