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

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

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

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

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

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

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

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

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

Подробнее

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

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

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

LEM

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

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

  • Посещение

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

  1. 1 час назад, OLDodin сказал:

    Дает использовать инсигнию без ошибок, но при этом нет события об изменении что ли?

    Не смотрел событие, инсижки можно применять, но статы не изменяются. Из-за этого аддон уходит в бесконечную прокрутку до срабатывания защиты.

  2. Правка для вещей 3 тира.

    Изначально я надеялся, что подойдет itemLib.CanUseOnItem(sourceId, targerId) или itemLib.GetBlockingPredicateCause(itemId), но увы.
    А еще нет готовой функции для получения тира, поэтому пришлось сделать свою.

    local function getItemTier(itemId)
      local category = itemLib.GetCategory(itemId)
      local categoryInfo = category and itemLib.GetCategoryInfo(category)
      local tier = categoryInfo and categoryInfo.sysName and string.match(categoryInfo.sysName, 'Tier(%d+)') -- sysName = 'Tier03'
      return tier and tonumber(tier) or -1
    end

    Также случайно обнаружил, что третий тир не максимальный.

    image.png.5e0cb0ecedc5478b934f7fdfdcaf7963.png

    P.S. Кстати, в бою GetBlockingPredicateCause выдаст {isInNotPredicate = true, sysCause = "ENUM_ActionFailCause_NotInCombat"}.
    Можешь потом как-нибудь задействовать ее, чтобы не проверять состояние боя самому.

    StatManager.zip

  3. Могу предложить два варианта:

    Первый вариант для всех юнитов

    do -- советую положить себе куда-то эти две полезные функции
      function table.normalize(t)
        if t[0] ~= nil then
          table.insert(t, 0, nil)
        end
        return t
      end
      --[[
      function table.denormalize(t)
        if t[0] == nil and t[1] ~= nil then
          t[0] = table.remove(t, 1)
        end
        return t
      end
      --]]
    end
    
    local units = {}
    
    common.RegisterEventHandler(function(p)
      if not units[p.unitId] then -- необязательная проверка для параноиков
        units[p.unitId] = {
          name = object.GetName(p.unitId)
        }
        -- chat(units[p.unitId].name, p.unitId, 'spawned')
      end
    end, 'EVENT_UNIT_SPAWNED')
    
    common.RegisterEventHandler(function(p)
      if units[p.unitId] then
        -- chat(units[p.unitId].name, p.unitId, 'despawned')
        units[p.unitId] = nil
      end
    end, 'EVENT_UNIT_DESPAWNED')
    
    local function InitAvatar(avatarId)
      for _, unitId in ipairs(table.normalize(avatar.GetUnitList())) do
        units[unitId] = {
          name = object.GetName(unitId)
        }
      end
    end
    
    local function Init()
      if avatar.IsExist() then
        InitAvatar(avatar.GetId())
      else
        local function onAvatarCreated(p)
          common.UnRegisterEventHandler(onAvatarCreated, 'EVENT_AVATAR_CREATED')
          InitAvatar(p.id)
        end
        common.RegisterEventHandler(onAvatarCreated, 'EVENT_AVATAR_CREATED')
      end
    end
    
    Init()

    Второй вариант с фильтрацией по имени

    do -- советую положить себе куда-то эти две полезные функции
      function table.normalize(t)
        if t[0] ~= nil then
          table.insert(t, 0, nil)
        end
        return t
      end
      --[[
      function table.denormalize(t)
        if t[0] == nil and t[1] ~= nil then
          t[0] = table.remove(t, 1)
        end
        return t
      end
      --]]
    end
    
    local units = {}
    local names = {
      ['Клыкастый кабан'] = true,
    }
    
    local function filter(name)
      -- можно воспользоваться common.CompareWString(text1, text2)
      return names[userMods.FromWString(name)]
    end
    
    common.RegisterEventHandler(function(p)
      if not units[p.unitId] then -- необязательная проверка для параноиков
        local name = object.GetName(p.unitId)
        if filter(name) then
          units[p.unitId] = {
            name = name
          }
          -- chat(units[p.unitId].name, p.unitId, 'spawned')
        end
      end
    end, 'EVENT_UNIT_SPAWNED')
    
    common.RegisterEventHandler(function(p)
      if units[p.unitId] then
        -- chat(units[p.unitId].name, p.unitId, 'despawned')
        units[p.unitId] = nil
      end
    end, 'EVENT_UNIT_DESPAWNED')
    
    local function InitAvatar(avatarId)
      for _, unitId in ipairs(table.normalize(avatar.GetUnitList())) do
        local name = object.GetName(unitId)
        if filter(name) then
          units[unitId] = {
            name = name
          }
        end
      end
    end
    
    local function Init()
      if avatar.IsExist() then
        InitAvatar(avatar.GetId())
      else
        local function onAvatarCreated(p)
          common.UnRegisterEventHandler(onAvatarCreated, 'EVENT_AVATAR_CREATED')
          InitAvatar(p.id)
        end
        common.RegisterEventHandler(onAvatarCreated, 'EVENT_AVATAR_CREATED')
      end
    end
    
    Init()

     

  4. 06.06.2020 в 19:48, asia сказал:

    спамит:

      Показать содержимое


    [02:13:14]Error: addon StatManager(1548262933): Widgets::LuaGetInstanceId: Empty widget, details: int __cdecl Widgets::LuaGetInstanceId(struct lua_State *)
      func: GetInstanceId, method, line: -1, defined: C, line: -1, [C]
        func: DestroyMenu, global, line: 72, defined: Lua, line: 71, [string "Mods/Addons/StatManager/Menu/Menu.lua"]
          func: HideMainMenu, global, line: 0, defined: Lua, line: 0, [string "Mods/Addons/StatManager/Script.lua"]
            func: action, local, line: 0, defined: Lua, line: 0, [string "Mods/Addons/StatManager/Script.lua"]
              func: ?, ?, line: 158, defined: Lua, line: 146, [string "Mods/Addons/StatManager/Menu/Menu.lua"]

     

    Исправлено (Script.lua 145 строка доп. проверка виджета)

     

    StatManager.zip

  5. UniStatBonusChecker

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

    Показывает, когда господство не дает бонус.

    1057701246_UniStatBonusChecker1.png.0de67dd7fc2241e2afedfbf9e5f2b20b.pngUniStatBonusChecker.png.3b149d397c1d06af5df04f06123f665a.png

    Команды:

    /usbc dnd - активирует/деактивирует перемещение
    /usbc reset - сбрасывает позицию

    Некромантам советую взглянуть на аддон GospodstvoNekromanta.


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

     

  6. AlRihatChestsDetector

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

    Помощник в поиске сундуков Ал-Риата, а также:

    • Сундук (Иса)
    • Экю, Пыльца фей (Айрин)
    • Старинный сундук (Тающий остров)
    • Сокровище, Большое сокровище (Суслангер)

     

    Перемещать полоски можно с зажатым шифтом.

    /arcd reset - сбрасывает позицию

    😉Отдельная благодарность:

     


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

     

  7. TrinketCooldown

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

    Показывает время восстановления бонусов от амулета и аугментаций брони.

    TrinketCooldown3.gif.f383d9cc9e5be1ffa34c97ff38e6ee84.gif

    Команды:

    /tc dnd - активирует/деактивирует перемещение
    /tc reset - сбрасывает позицию

    Если вам требуется оповещение о срабатывании бонусов амулета, то взгляните на NotifyTrink2.


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

     

  8. Есть три способа решить эту проблему:

    1. Экранируем кавычки

    "\"Злая девка\" пошла ко дну! Меня Вонючий Жо прислал!"

    2. Оборачиваем реплику в одинарные кавычки

    '"Злая девка" пошла ко дну! Меня Вонючий Жо прислал!'

    3. Используем синтаксис многострочного текста

    [["Злая девка" пошла ко дну! Меня Вонючий Жо прислал!]]
    • Нравится 1
    • Спасибо 1
  9. Просто применение не всех умений можно отловить. Информация в файле очень старая, проще включить отображение всех кулдаунов.

    Allods_200504_192941.jpg.9308226a09943d8913487220c7fed16b.jpg

    [19:29:33]Info: addon CooldownInfo(0): [19:29:33.410] buff_added
    [19:29:33]Info: addon CooldownInfo(0): [19:29:33.416] buff: name 'Драконье зелье поглощения', remaining 9.979, duration 10, stackCount 1, stackLimit 1, isStackable false, isNeedVisualizeDuration true
    [19:29:33]Info: addon CooldownInfo(0): [19:29:33.420]   spell: name 'Драконье зелье поглощения', rank 1, predicted 300, texture true 
    [19:29:33]Info: addon CooldownInfo(0): [19:29:33.425]   object: name 'Лево', id 7519, sys 'ENGINEER', owner 'none' 

    Allods_200504_194747.jpg.26e5a159dca2077bab06837ac8f60158.jpg

    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.219] buff_added
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.224] buff: name 'Кровь Арейсии', remaining 4.98, duration 5, stackCount 1, stackLimit 1, isStackable true, isNeedVisualizeDuration true
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.230]   spell: name 'Выпить', rank 1, predicted 300, texture false 
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.234]   object: name 'Лево', id 7519, sys 'ENGINEER', owner 'none' 
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.239] 
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.244] healing_received
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.249] spell: name 'Выпить', rank 1, predicted 300, texture false 
    [19:47:41]Info: addon CooldownInfo(0): [19:47:41.253]   object: name 'Лево', id 7519, sys 'ENGINEER', owner 'none' 

     

  10. Перемещать список умений можно было всегда. В версии 3.3 появилась возможность менять размер. Файла нет и аддоны ничего не пишут туда скорее всего из-за того, что в файле \Personal\Global.cfg не выставлено значение user_mods_log_enable=1

     

  11. Привет. Не могу написать это на английском, но у меня есть идея для этого аддона.

    Почему бы дополнительно не логировать параметры события?

    j49ghgbugUI.png.5eb2c1d0291c5489c955806f06923433.png

    Я давно использую примерно такой код, когда надо посмотреть когда и с какими параметрами приходит событие:

      common.RegisterEventHandler(function(params)
        chat('EVENT_OBJECT_BUFFS_ELEMENT_CHANGED', params)
      end, 'EVENT_OBJECT_BUFFS_ELEMENT_CHANGED')

    В этом мне помогает неплохая функция advtostring и мой самодельный скрипт для отправки текста в чат.

    Если не хочется использовать мой скрипт, то я тут набросал код для чата:

      common.RegisterEventHandler(function(params)
        local time = common.GetLocalDateTime()
        local valuedText = common.CreateValuedText()
        common.SetTextValues(valuedText, {
          format = userMods.ToWString('<html color="0xffccc5b7" fontsize="14"><r name="time"/> [<r name="addon"/>]: <r name="event"/> <r name="params"/></html>'),
          time = {
            format = userMods.ToWString('<html><r name="h"/>:<r name="m"/>:<r name="s"/>.<r name="ms"/></html>'),
            h = common.FormatNumber(time.h, '2'),
            m = common.FormatNumber(time.min, '2'),
            s = common.FormatNumber(time.s, '2'),
            ms = common.FormatNumber(time.ms, '3')
          },
          addon = userMods.ToWString('EventLogger'),
          event = userMods.ToWString('EVENT_OBJECT_BUFFS_ELEMENT_CHANGED'),
          params = userMods.ToWString(string.format('<html>%s</html>', string.gsub(advtostring(params, false), '%c', {['\t'] = '  ', ['\n'] = '<br/>'})))
        })
        ChatLog:PushValuedText(valuedText)
      end, 'EVENT_OBJECT_BUFFS_ELEMENT_CHANGED')

    Надеюсь, ты сможешь это перевести, либо поймешь идею по картинке и коду 😉

  12. Выше дан ответ. Код полностью:

    local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
    local reaction = {}
    
    for _, event in ipairs( events ) do	
    	reaction[ event ] = function ( params )
    		LogWarning(event) -- Сюда подразумевалось выводить название ивента
    		
    		if params then
    			for key, value in pairs( params ) do
    				LogInfo( key, ": ", value )
    			end
    		end
    	end
    	
    	common.RegisterEventHandler( reaction[ event ], event )
    end

    Могу посоветовать воспользоваться функцией  advtostring() вот отсюда:

    Получаем такой код:

    local events = { ..., "EVENT_ADDON_LOAD_STATE_CHANGED", ... }
    local reaction = {}
    
    for _, event in ipairs( events ) do	
    	reaction[ event ] = function ( params )
    		LogInfo(event, ": ", advtostring(params))
    	end
    	
    	common.RegisterEventHandler( reaction[ event ], event )
    end

    Результат будет примерно такой:

    Info: addon CheckEvents: EVENT_ADDON_LOAD_STATE_CHANGED: {
    	loading = true,
    	unloading = false,
    	name = 'UserAddon/CheckEvents'
    }

     

  13. 17 часов назад, ZeleShnaider сказал:

    "Атаковать цель" приоритетнее чем "не вмешиваться", исходя из описания.

    Именно так.

    12 часов назад, logg сказал:

    Примерно такое же есть, еще пет у меня не бил в длительные контроли

    Задумка с контролями интересная, но, на мой взгляд, вполне достаточно текущего функционала

  14. AdvancedPetCommands

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

    Порадуйте своего любимого пета кнопкой, которая чуть прибавляет ему мозгов.

    Necromancer.jpg.07dac2898ce512ef0b1e02d3495a862f.jpgNecromancer2.jpg.1a246fb7aacc0b5842490110b2263965.jpg

    Пока кнопка активна (рамочка желтая есть), ваша зверушка начинает атаковать цели, которые атакуете вы, и понимает когда надо переключиться на другую.

    Достаточно удобно в компасах. Только будьте осторожны, эта кнопка выводит питомца из пассивного режима.

    /apc reset - сбрасывает позицию

    Если вдруг не знали, расширенный интерфейс команд включается так:

    Options.thumb.jpg.1a5d073bedd010282437725e83ce6c3b.jpg


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

     

  15. MwarHistoryBattleScoreFix

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

    [04.04.2019] В обновлении 10.0.00.81 исправили ошибку. Рекомендую отключить или удалить этот аддон.

    Исправление некорректного отображения счета боев доминиона.


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

     

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

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

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