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

Программирование на 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
      Нет. Теперь все, как у Майрона на видосах
    • Mayron
      Первые 25 лет зубы работают на тебя, а потом ты работаешь на зубы.
    • Mayron
    • antiz
      Индусы научат негров уважению: Когда говорят про "совершенство мозга и человека", знайте - врут, это глючный кривой биокомпьютер, в так себе собранном храмовом биороботе: И не понятно, как бы сам поступил в такой ситуации: Ни какой то, а случайный/лбой азиат на второй день в зале: Красивое. Неужели еще есть такие девушки:  
    • Belkanick
      4 Сентября в Black Desert пройдут технические работы с 09:00 до 13:00 (время по МСК). Во время технических работ вход в игру будет невозможен, как и отправка в игру предметов из веб-склада. Технические работы могут занять больше времени, чем ожидалось, либо завершиться ранее заявленного времени. Также с 09:00 до 13:00 (время по МСК) пройдут технические работы на официальном сайте. В указанное время сайт будет недоступен. График проведения технических работ ● Серверы: с 09:00 до 13:00 (время по МСК) ● Официальный сайт: с 09:00 до 13:00 (время по МСК)   Завершающиеся ивенты  ● Мир, где хаос и порядок, добро и зло существуют бок о бок! ● Новое предложение Патрицио! ● В Иданию вместе с Крыльями Заката! ● Новые приключения вместе с Иданией! Скидка в Steam! ● Шепот, доносящийся из нового региона (Шанс получения увеличен!) ● Путешествие вместе с Благословением луны! ● Извлекайте Камни Кафраса и передавайте предметы!     Предстоящие обновления ● Ротация уровня фортов каждого узла в битве за узлы ● Проложение маршрута на карте мира (M) с учетом использования Колодца бездны ● [Вуконг] Просвещение Рабам и расширение навыков Гнева Черного духа  
    • antiz
      Сначала не понял....лучше бы не понял  Звуковой ряд доставляет! Не могу не согласиться: Долбоебы:   Красивое:  
    • Mayron
    • Mayron
    • Mayron
      - Мы будем долго пытать тебя! - Я скажу вам всё, что захотите! - Сначала пытки, потом уже разговоры!
    • Mayron
      У жены муж. Звонок в дверь. Жена: — Это мой любовник! Скорей, прыгай с балкона! Тот быстро на балкон, прыгнул вниз, летит и думает: —Бля, наоборот же должно быть… И полетел вверх.
×
×
  • Создать...