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

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

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

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

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

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

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

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

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

Подробнее

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

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

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

Zeno

Разработчик аддонов
  • Постов

    169
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Zeno

  1. Скорее всего, не секрет, но EVENT_UNIT_HEALTH_CHANGED лучше уже не использовать - его удалят.

    Если только цели, то, думаю, достаточно будет обрабатывать событие о смене цели EVENT_AVATAR_TARGET_CHANGED, при котором производить регистрацию и дерегистрацию обработчиков событий EVENT_OBJECT_HEALTH_CHANGED и EVENT_OBJECT_BUFFS_CHANGED с фильтрами по цели. Крайне желательно запоминать статус регистраций, т.к. его нельзя проверить. Если предполагать их статус и предположение окажется неверным, то будет вылетать некритическая ошибка (будет писать в лог, если у игрока он включен, а выполнение продолжится). А проводить дерегистрацию обязательно потому что есть предел в 500 регистраций обработчиков.

    Есть другой способ. По EVENT_SECOND_TIMER использовать object.GetHealthInfo(avatar.GetTarget()) и object.GetBuffs(avatar.GetTarget()). Раз в секунду сами спрашиваем здоровье и бафы цели.

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

  3. Технически возможно. Посмотрю, как будет время. Но мне кажется, будет хуже, потому что разноцветные точки будут перекрывать друг друга, если находятся в одном месте, как они перекрывают друг друга без всяких дополнений.

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

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

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

     image.thumb.png.59bec66d6b04a2d0b2412784fca6fc07.png

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

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

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

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

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

  7. ###Cartographer###O7.1##Exclamation01##E47EEC#B7FC64#FFFFF0B7##1889#14F5##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_джиннов###
    ###Cartographer###O7.1##Exclamation01##E99EA4#B42850#FFFF8D84##1BF0#1858##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##EEB8E4#B30AC4#FFFEF8D7##1F53#1955##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##EC83A8#B08254#FFFF1D4B##1DDC#1B92##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##E27188#AB6E54#FFFF7E76##172D#2010##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##E1E6DC#B128BC#FFFFFAEF##16D1#1AFF##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_джиннов###
    ###Cartographer###O7.1##Exclamation01##E3B8E0#B3EA34#1AC5##1806#188F##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_джиннов###
    ###Cartographer###O7.1##Exclamation01##E12D50#B5D1B4#D96##1655#16E0##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_джиннов###
    ###Cartographer###O7.1##Exclamation01##EBD890#AAFB7C#FFFF95BE##1D6A#2075##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##E65E9C#AAAC94#FFFF53D0##19C8#20BB##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##E8D12C#B09320#FFFF5882##1B68#1B83##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Exclamation01##EA2888#ACED88#FFFF3D8D##1C4B#1EBD##Suslanger##Suslanger::##Уро-Борос##Место%_появления%_Уро-Бороса##Суслангер##Суслангер##Пески%_ифритов###

    Все места появления Уро-Бороса. Координаты точно в местах остановки во время погони (там же где и появляется).

    • Спасибо 1
  8. PartyMapZ

    Просмотр файла

    PartyMapZ_1.jpg.cd31bf0f4fab0827fe3d7250ad67d31e.jpgPartyMapZ_2.jpg.f5959c71eea60dad6248b569ab3ce7b9.jpgpointerz3.jpg.71c98e28f3c65382d0a6a654766a2303.jpg

    Показывает иконки классов аватара/группы/рейда на карте и миникарте.

    • Зеленым - аватар, синим - группа, оранжевым - другие группы рейда.
    • Можно выбрать точки или маркеры, а также показывать ли на карте/миникарте аватар/группу/рейд отдельно с помощью меню в игре или через файл настроек, сделав его приоритетным.

     

    Shows avatar/group/raid class icons on the map and minimap.

    • Green - avatar, blue - group, orange - other raid groups.
    • You can select dots or markers, as well as whether to show the avatar/group/raid on the map/minimap separately using the menu in the game or through the settings file after prioritizing it.

    • Добавил
    • Добавлено
      18.10.2022
    • Категория

     

    • Спасибо 1
  9. Почти. Вот это всё:

    • Цитата

       

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

       

       

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

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

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

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

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

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

  11. 6 часов назад, Gleqb сказал:

    устанавливал я их правильно, в нужную папку

    Тогда вот это должно быть неверно. Частая ошибка использование пути "Папка игры\Mods" вместо правильного.

    Правильный путь к папкам дополнений и файлам типа pak "Папка игры\data\Mods\Addons"

    Правильный путь к описателю каждого дополнения "Папка игры\data\Mods\Addons\Папка дополнения\AddonDesc.(UIAddon).xdb"

    • Нравится 1
  12. 1 час назад, Равэнна сказал:

    Если есть возможность их захватить - скиньте их пожалуйста сюда.

    Так парой сообщений выше они все есть по идее. Из этих списков я на данный момент уточнил координаты и подтвердил все, кроме одного. Толи не попадается, толи там не бывает (но вроде бывает). Будут все, скину целиком.

    https://alloder.pro/forums/topic/1444-cartographer/?do=findComment&comment=54864

    https://alloder.pro/forums/topic/1444-cartographer/?do=findComment&comment=54866

     

  13. [21:55:00]Error: addon ShipControl(1644947130): Game::LuaAstralGetHubRadius: astral hub zone not found, details: int __cdecl Game::LuaAstralGetHubRadius(struct lua_State *)
      func: GetHubRadius, field, line: -1, defined: C, line: -1, [C]
        func: EVENT_ASTRAL_HUB_CHANGED, field, line: 811, defined: Lua, line: 800, [string "Mods/Addons/ShipControlSA/Scripts/ShortMap.lua"]
          func: ShortMap_ShowAll, global, line: 1148, defined: Lua, line: 1132, [string "Mods/Addons/ShipControlSA/Scripts/ShortMap.lua"]
            func: AvatarShip, upvalue, line: 848, defined: Lua, line: 805, [string "Mods/Addons/ShipControlSA/Scripts/Main.lua"]
              func: ?, ?, line: 868, defined: Lua, line: 866, [string "Mods/Addons/ShipControlSA/Scripts/Main.lua"]

    Версия 76. Возможная причина - залёт в хаб лютого или в пустой хаб внутри.

  14. Только что, Icedown сказал:

    Однако некоторые баффы из баф листа не показывались, потому что перед их названиями было "--", убрал их и всё работает

    Это сделано специально. Я занёс все, а некоторые закомментировал, чтобы их не было видно по умолчанию, но при необходимости их не надо было бы искать и вписывать. Если они вам нужны, то, конечно, убирайте символы комментирования.

  15. ###Cartographer###O7.1##Tick03##E9AF7A#B41B16#FFFF8D7E##1BFB#1864##Suslanger##Suslanger::##Червяк##Червяк##Суслангер##Суслангер##Пески%_ифритов###
    ###Cartographer###O7.1##Tick03##E1C98A#B0FF19#FFFFF509##16BD#1B24##Suslanger##Suslanger::##Червяк##Червяк##Суслангер##Суслангер##Пески%_джиннов###

    К меткам выше. Ещё 2. Примерные координаты.

  16. Пропущенный сундук на Ал-Риате.

    Для файла Resources.lua:

    { Type = "Treasure", Pos = { posX = 12395.300, posY = 13405.000, posZ = 11.277 }, SimplePos = { 13.56, 52.71 } },

    Для импорта в пользовательские метки:

    ###Cartographer###O7.1##Treasure##BD2324#CC8B48#2C0D##54C#1497##HuntingGround04##WarZone::##Сундук##Сокровище##Руины%_Ал-Риата##Руины%_Ал-Риата##Городские%_предместья###

     

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

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

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