Gvinnedar Posted October 17, 2022 Share Posted October 17, 2022 Здравствуйте, я полный ноль в LUA и программировании, но очень хотел бы разобраться в написании аддонов. У меня очень много глупых вопросов, надеюсь найти человека который на них ответит. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 17, 2022 Author Share Posted October 17, 2022 Для начала решил попробовать написать простенький аддон, который выводит в чат приветствие. От части получилось, но текст искажается и меняется на различные символы. Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 18, 2022 Share Posted October 18, 2022 2 часа назад, Gvinnedar сказал: текст искажается и меняется на различные символы Кодовая страница скриптов для русского windows-1251. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Спасибо, с этим разобрался. Подскажите где я могу найти команды на вывод сообщений и другие функции для прописи в аддоне. Как я понял это учебник LUA и воть https://alloder.pro/md/LuaApi/CategoryLuaApi.html Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Это так или есть другие источники? Мне интересно где написано про функции и т.д Я не совсем понимаю где прочитать про такое: OnSlash, wtChat, valuedText Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Извините за такие глупые вопросы) Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 18, 2022 Share Posted October 18, 2022 Есть документация по Lua и документация по API Аллодов. К Lua есть куча справочников, где в отличии от документации, понятно написано и есть примеры. OnSlash - скорее всего функция обработчик события. Event, Reaction описаны в документации API. wtChat - скорее всего переменная содержащая ссылку на виджет. Widget описаны в документации API. valuedText - типа данных, описан в документации API. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Документация API это тут ? https://alloder.pro/md/LuaApi/CategoryLuaApi.html Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 18, 2022 Share Posted October 18, 2022 Почти. Вот это всё: Цитата Общее описание и установка Создание пользовательских дополнений Описание полей ресурсов виджетов Пример универсального слота для отображения предметов или заклинаний Lua API - функции и события, предоставляемые клиентом игры Список изменений в Lua API https://alloder.pro/docs/_/modding Локально доступно Папка игры\data\Mods\Docs\ModdingDocuments.zip Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Я очень благодарен за ответы. А как лучше ориентироваться в этой документации. Через ctrl+f ? Или есть лучше поисковик нужных функций и событий? Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 18, 2022 Share Posted October 18, 2022 39 минут назад, Gvinnedar сказал: Через ctrl+f ? Да. Ещё иногда полезны категории, которые группируют функции и события одного типа. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Спасибо большое, буду разбираться) Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 А ID валюты, предметов и т.д тоже в документации API ? Сейчас хочу сделать вывод соверенов в чат при входе на локацию, но как понял застрял на ID валюты. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 18, 2022 Author Share Posted October 18, 2022 Currency просмотрел, но так и не нашел конкретно ID соверенов. Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 18, 2022 Share Posted October 18, 2022 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 скорее всего можно просто запомнить один раз, вряд ли она изменяется в процессе сессии. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 19, 2022 Author Share Posted October 19, 2022 Не совсем понял на счет инструментария, это вся документация выше или я что то упустил ? Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 19, 2022 Author Share Posted October 19, 2022 И честно говоря не совсем понял как добиться ссылки CurrencyID на соверены( Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 19, 2022 Share Posted October 19, 2022 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 соверенов или будет пустым. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 22, 2022 Author Share Posted October 22, 2022 По итогу поле пустое Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 23, 2022 Share Posted October 23, 2022 Если переменная пустая после перебора валют, то такой валюты найдено не было. По-моему, тут возможно 4 варианта - стоит нерусская локаль, стоит нерусский клиент, стоит не windows-1251 кодировка скрипта, у персонажа нет такой валюты вообще. 1. Время и язык > Язык и регион > Административные языковые параметры > Изменить язык системы... В выпадающем списке выбрать "Русский (Россия), галку "Бета версия" убрать. Подтверждить изменения. 2. Вместо "Соверен" в скрипте искать соответствующую языку запись. 3. Скрипт дополнения должен быть в кодировке windows-1251, а не UTF-8, который обычно ставят все программы по умолчанию. Большинство программ позволяет сконвертировать кодировку в любую сторону, способ зависит от программы. В Блокноте, например, Файл > Сохранить как... В выпадающем списке выбрать ANSI. Подтвердить сохранение. 4. В игре открыть информацию о персонаже, вкладку Ценности, категорию Награды, перематывать в поисках Соверен. Если такой нет, получить Соверен на Ал-Риате или взять персонажа с такой валютой. 1 Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 25, 2022 Author Share Posted October 25, 2022 С языком и шрифтом все нормально , но все равно не выдает нужные значения ( я пытаюсь вывести количество соверенов в чат через function GetCurrencyValue( currencyId ) ). Возможно проблема в скриптовом шрифте, формате , но и их я прописал. Сообщение кроме значения соверенов нормально выводит в чат. Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 25, 2022 Share Posted October 25, 2022 Попробуйте переводить число соверенов в строку примерно так: tostring(avatar.GetCurrencyValue(soverenId).value) Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 26, 2022 Author Share Posted October 26, 2022 Если не против посмотри что не так делаю и укажи на ошибки AddonName.lua Quote Link to comment Share on other sites More sharing options...
Zeno Posted October 26, 2022 Share Posted October 26, 2022 Как-то так должно работать, хотя мне почему-то кажется, что 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) ... Конечно же, в чате всегда "Соверен: ", ведь никаких других вариантов и быть не может. Quote Link to comment Share on other sites More sharing options...
Gvinnedar Posted October 26, 2022 Author Share Posted October 26, 2022 (edited) Спасибо 🥲 Edited October 26, 2022 by Gvinnedar Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.