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

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Хочу пообщаться с людьми которые разбираются в разработке аддонов.


Gvinnedar

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

Здравствуйте, я полный ноль в LUA и программировании, но очень хотел бы разобраться в написании аддонов.

У меня очень много глупых вопросов, надеюсь найти человека который на них ответит.

 

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

Для начала решил попробовать написать простенький аддон, который выводит в чат приветствие.

От части получилось, но текст искажается и меняется на различные символы.

 

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

2 часа назад, Gvinnedar сказал:

текст искажается и меняется на различные символы

Кодовая страница скриптов для русского windows-1251.

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

Спасибо, с этим разобрался.

Подскажите где я могу найти команды на вывод сообщений и другие функции для прописи в аддоне.

Как я понял это учебник LUA и воть https://alloder.pro/md/LuaApi/CategoryLuaApi.html

 

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

Это так или есть другие источники?
Мне интересно где написано про функции и т.д

Я не совсем понимаю где прочитать про такое:

OnSlash,   wtChat,   valuedText 

 

 

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

Есть документация по Lua и документация по API Аллодов. К Lua есть куча справочников, где в отличии от документации, понятно написано и есть примеры.

OnSlash - скорее всего функция обработчик события. Event, Reaction описаны в документации API.

wtChat - скорее всего переменная содержащая ссылку на виджет. Widget описаны в документации API.

valuedText - типа данных, описан в документации API.

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

Документация API это тут ? 

https://alloder.pro/md/LuaApi/CategoryLuaApi.html

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

Почти. Вот это всё:

  • Цитата

     

    • Общее описание и установка
    • Создание пользовательских дополнений
      • Описание полей ресурсов виджетов
      • Пример универсального слота для отображения предметов или заклинаний
    • Lua API - функции и события, предоставляемые клиентом игры
    • Список изменений в Lua API

     

     

https://alloder.pro/docs/_/modding

Локально доступно Папка игры\data\Mods\Docs\ModdingDocuments.zip

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

Я очень благодарен за ответы.

А как лучше ориентироваться в этой документации.

Через ctrl+f ?

Или есть лучше поисковик нужных функций и событий?

 

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

39 минут назад, Gvinnedar сказал:

Через ctrl+f ?

Да.

Ещё иногда полезны категории, которые группируют функции и события одного типа.

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

А ID валюты, предметов и т.д тоже в документации API ?

Сейчас хочу сделать вывод соверенов в чат при входе на локацию, но как понял застрял на ID валюты.

 

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

Currency просмотрел, но так и не нашел конкретно ID соверенов.

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

59 минут назад, Gvinnedar сказал:

А ID валюты, предметов и т.д тоже в документации API ?

По-моему это предлагается искать самостоятельно с помощью имеющегося инструментария.

Должно быть где-то в валютах аватара по идее.

        local avatarCurrencies = avatar.GetCurrencies()
        for _, currencyId in pairs(avatarCurrencies) do
            local currencyInfo = currencyId:GetInfo()
            if currencyInfo then common.LogInfo("common", currencyInfo.name, "[", tostring(currencyInfo.sysName), "]: ", tostring(avatar.GetCurrencyValue(currencyId).value),"/",tostring(currencyInfo.maxValue)) end
        end

Показывает, что соверены в этом есть, просто у них нет sysName, поэтому их нельзя найти с помощью avatar.GetCurrencyId(sysName). Так что каждый раз получаем таблицу, а её перебираем до соответствия по имени, не забывая переводить WString в string для сравнения. Найденную ссылку на CurrecnyId скорее всего можно просто запомнить один раз, вряд ли она изменяется в процессе сессии.

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

Не совсем понял на счет инструментария, это вся документация выше или я что то упустил ?

 

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

И честно говоря не совсем понял как добиться ссылки CurrencyID на соверены(

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

        local soverenId
        local avatarCurrencies = avatar.GetCurrencies()
        for _, currencyId in pairs(avatarCurrencies) do
            local currencyInfo = currencyId:GetInfo()
			if currencyInfo and userMods.FromWString(currencyInfo.name) == "Соверен" then
				soverenId = currencyId
				break
			end
        end

soverenId в результате будет ссылкой на CurrencyID соверенов или будет пустым.

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

Если переменная пустая после перебора валют, то такой валюты найдено не было.

По-моему, тут возможно 4 варианта - стоит нерусская локаль, стоит нерусский клиент, стоит не windows-1251 кодировка скрипта, у персонажа нет такой валюты вообще.

1. Время и язык > Язык и регион > Административные языковые параметры > Изменить язык системы... В выпадающем списке выбрать "Русский (Россия), галку "Бета версия" убрать. Подтверждить изменения.

 image.thumb.png.59bec66d6b04a2d0b2412784fca6fc07.png

2. Вместо "Соверен" в скрипте искать соответствующую языку запись.

3. Скрипт дополнения должен быть в кодировке windows-1251, а не UTF-8, который обычно ставят все программы по умолчанию. Большинство программ позволяет сконвертировать кодировку в любую сторону, способ зависит от программы. В Блокноте, например, Файл > Сохранить как... В выпадающем списке выбрать ANSI. Подтвердить сохранение.

4. В игре открыть информацию о персонаже, вкладку Ценности, категорию Награды, перематывать в поисках Соверен. Если такой нет, получить Соверен на Ал-Риате или взять персонажа с такой валютой.

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

С языком и шрифтом все нормально , но все равно не выдает нужные значения ( я пытаюсь вывести количество соверенов в чат через function GetCurrencyValue( currencyId ) ).

Возможно проблема в скриптовом шрифте, формате , но и их я прописал.

Сообщение кроме значения соверенов нормально выводит в чат.

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

Попробуйте переводить число соверенов в строку примерно так: tostring(avatar.GetCurrencyValue(soverenId).value)

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

Если не против посмотри что не так делаю и укажи на ошибки

AddonName.lua

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

Как-то так должно работать, хотя мне почему-то кажется, что 40 размер шрифта великоват.

function LogToChat(chatText) -- [138] Что ещё за цифровые комментарии?
	local wtChat = stateMainForm:GetChildUnchecked("ChatLog",false):GetChildUnchecked("Container",true) -- Это текстовый контейнер чата?
	if not wtChat or not wtChat.PushFrontValuedText then return end -- Видимо, не нашли чат или нашли не чат?
	if not common.IsWString(chatText) then chatText = userMods.ToWString(chatText) end -- [146] Опять они!
	local valuedText = common.CreateValuedText() -- Создаём новый объект с текстом и получаем на него ссылку
	local format = "<html fontname='AllodsFantasy' fontsize='40' shadow='1'><rs class='color'><r name='text'/></rs></html>" -- Это наша отформатированная строка с тегом для подстановки
	valuedText:SetFormat(userMods.ToWString(format)) -- Задаём нашу строку
	valuedText:SetClassVal("color", "LogColorRed") -- Подставляем класс
	valuedText:SetVal("text", chatText) -- Подставляем текст
	wtChat:PushFrontValuedText(valuedText) -- Пихаем наш объект с текстом в начало контейнера чата. Наверное, после этого оно должно появится в активной вкладке чата и будет там висеть, если снег не пойдёт
end -- function [153] И снова!

function GetCurrencyValue(currencyId) -- Возвращает кол-во валюты по CurrencyId
	local currencyValue = avatar.GetCurrencyValue(currencyId) -- Получаем кол-во и макс. кол-во валюты
	if currencyValue then return currencyValue.value end -- Возвращаем только количество, если нет ошибки
end

function GetCurrencyIdByName(currencyName) -- Возвращает ссылку на валюту (CurrencyId) по её имени
	local avatarCurrencies = avatar.GetCurrencies() or {} -- Получаем валюты
	for _, currencyId in pairs(avatarCurrencies) do -- Очередность перебора не имеет значения, индекс тоже
		local currencyInfo = currencyId:GetInfo() -- Получаем информацию о валюте под очередным индексом
		if currencyInfo and currencyInfo.name and userMods.FromWString(currencyInfo.name) == currencyName then return currencyId end -- Если ошибки нет и валюта имеет то же имя, что и искомая, то возвращаем ссылку на эту валюту (CurrencyId)
	end
end
	
function print_GG() -- Главная функция со странным названием
	local currencyName = "Соверен" -- Задаём имя нужной валюты
	local currencyId = GetCurrencyIdByName(currencyName) -- Получаем ссылку на нужную нам валюту по её имени
	if not currencyId then  -- Если валюта не найдена, отправляем функции вывода в чат сообщение об этом и завершаем работу
		LogToChat(currencyName..": нет в наличии.")
		return
	end
	local currencyValue = GetCurrencyValue(currencyId) or 0 -- Получаем кол-во валюты по ссылке на валюту
	LogToChat(currencyName..": "..tostring(currencyValue)) -- Отправляем функции вывода в чат собранную строку с именем и кол-вом валюты
end

function Init() -- Инициализация
	if not avatar.IsExist() then -- Если нет аватара, будем запускать снова при появлении аватара, а пока всё
		common.RegisterEventHandler(Init,"EVENT_AVATAR_CREATED")
		return
	end
	print_GG() -- Вызываем главную функцию со странным названием
end

Init() -- Запускаем

Если вкратце по ошибкам, то:

- Очень много ненужного и неиспользуемого (почти половина строк).

- Есть подозрение, что функция вывода в чат откуда-то выдрана, уже больно в ней много лишнего для текущей задачи, но наверное, рабочая.

- Главная функция ничего не делает. То есть не ищет соверены и не получает их значение и не вызывает для этого другие функции. 

- local str = ("Соверен: ", currentValue) - это попытка присвоить одной переменной два значения, причём второе значение - это переменная, которая нигде не объявлена (а точнее объявлена локальной в другой функции, которая нигде не вызывается). Результатом подобного будет присвоение переменной исключительно первого значения.

- Главная функция пытается передать две локальных переменных аргументами функции вывода в чат (LogToChat( str, str2)), которая принимает только один аргумент (function LogToChat(param1)). Результатом подобного будет передача лишь первого аргумента.

- Процесс выполнения до передачи в чат был такой: Init() -> print_GG() -> local str = "Соверен: " -> LogToChat(str) ... Конечно же, в чате всегда "Соверен: ", ведь никаких других вариантов и быть не может.

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

Спасибо 🥲

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования