Jump to content
Alloder.pro  about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

Results of the competition "Allods and Life"

Stories, that warm souls.

Read More

Digest December

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

The new Talents Calc

In honor of the tenth anniversary of alloder.pro, we have prepared a stunning gift for you.

Read More

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

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


Gvinnedar
 Share

Recommended Posts

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

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

 

Link to comment
Share on other sites

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

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

 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

OnSlash,   wtChat,   valuedText 

 

 

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

  • Цитата

     

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

     

     

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

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

Link to comment
Share on other sites

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

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

Через ctrl+f ?

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

 

Link to comment
Share on other sites

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

Через ctrl+f ?

Да.

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

Link to comment
Share on other sites

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

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

 

Link to comment
Share on other sites

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 скорее всего можно просто запомнить один раз, вряд ли она изменяется в процессе сессии.

Link to comment
Share on other sites

        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 соверенов или будет пустым.

Link to comment
Share on other sites

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

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

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

 image.thumb.png.59bec66d6b04a2d0b2412784fca6fc07.png

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

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

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

  • Upvote 1
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Как-то так должно работать, хотя мне почему-то кажется, что 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) ... Конечно же, в чате всегда "Соверен: ", ведь никаких других вариантов и быть не может.

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use