Jump to content
Korean Random
Polyacov_Yury

[Сломан в 1.10][Чинить не планирую] Настраиваемое боевое радиальное меню команд

Recommended Posts

21 минуту назад, Polyacov_Yury сказал:

В комплекте поставки мода их куча. Инструкция о том, что и как - в шапке темы. Если что-то не понятно - пишите, разъясню и обновлю шапку.

Ну Ок, как называется стандартный конфиг. В папке с конфигураций куча пользовательских конфигураций но мне не нужны замены всего радиального меню, мне необходимо заменить лишь 2-3 значения. Я не смог найти стандартный конфиг.

Share this post


Link to post

Short link
Share on other sites
2 минуты назад, Lost сказал:

Ну Ок, как называется стандартный конфиг. В папке с конфигураций куча пользовательских конфигураций но мне не нужны замены всего радиального меню, мне необходимо заменить лишь 2-3 значения. Я не смог найти стандартный конфиг.

А он в код вшит :) И выглядит вот так:

{
    "meta": "Стандартные сообщения",
    "hotkeyOnly": [
        {
            "command": "RELOADINGGUN",
            "hotKey": ["KEY_C"]
        }
    ]
}

Опять же, в шапке всё написано. Мод умный. Если чего-то нет - подтягиваются стандартные значения.

Share this post


Link to post

Short link
Share on other sites

По идее - да, без проблем. Архив перезалит, можете скачать и проверить :)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Стало мне скучно немного вечерком. Всё, кроме КамоСелектора, обновил под текущий патч. Насчёт того, сломается ли что-то из-за микропатча - не знаю, будем посмотреть.

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Спустя долгое время, шапки топиков были обновлены.

Все моды (кроме КамоСелектора :P) работают на версии 1.2. Качайте и пользуйтесь на здоровье :)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Искренне прошу прощения. Вылез баг в сборщике архивов. Когда начали поступать сообщения об инциденте, я сначала не поверил. Папки, которые и в Beyond Compare, и в WinRar отображались как mods/1.4.0.0/, распаковывались как /mods/1.4.0.0_/. Причиной явился закравшийся в конец файла, в котором указана текущая версия игры, символ окончания строки, который попал в названия папок и, соответственно, в архивы. Все обновленные ранее архивы с модами были перепакованы с нуля и перезалиты. Приношу извинения за неудобства.

 

P.S. Если кому-то лень перекачивать - просто переименуйте папку mods/1.4.0.0_/ в mods/1.4.0.0/, согласившись на слияние папок и замену файлов. Содержимое архивов до и после инцидента, если не считать имя папки, полностью идентичное.

Share this post


Link to post

Short link
Share on other sites
4 часа назад, sergbodr сказал:

Привет! А убрать "Специально для wotspeak.ru" можно?

Мод делался изначально по заказу, благодаря которому у меня сейчас в ноутбуке не 6 гигов оперативы, а 12. Поэтому разве что если кто-то сможет переплюнуть :)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Всем, у кого лагает данный мод.

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

Спасибо, что показали недавно добавленный ответ на него, он проливает чуть больше света на происходящее, но я всё ещё не понимаю, что там конкретно творится - в плане, что там такого можно делать лагучего. Разве что шалит обработчик нажатия клавиш...

 

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

Работа с конфигами мне в основном нравится, только не очень понятно приписывание слова "Menu" к названиям секций, да и секция tankSpecific выглядит более чем избыточно.. В любом случае, я по уже сложившейся традиции сделаю так, что вы, как пользователь, не должны будете сидеть и конфиги править. Мод при первом запуске сам всё сделает.

 

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

 

И да, я вряд ли смогу выкатить переработанную версию раньше выхода 1.6.1.0, который произойдёт во вторник. Эта неделя у меня более-менее расписана вся вплоть до воскресенья, а в понедельник у меня пары. А даже если и успею - один фиг придержу. Лучше покатаю лишнюю пару боёв да отвалившийся функционал половлю лишний раз.

  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

Итак, товарищи пользователи.

 

Спустя два дня интенсивного кодинга и два вечера не менее интенсивной мигрени (вчера и сегодня) я переписал весь код мода практически с нуля.

Ужался он всего на 25 строк, но это не отменяет того факта, что всякие нелогичности были из него вышлифованы.

Оставался маленький проблема - почему-то после переписывания не хотели работать команды по горячей клавише (как выяснилось, я в одном месте тупо получал BigWorld.target().id, не проверив сначала, а не None ли мне вернули). Ради отладки я натыкал принтов в код и пошёл в очередной бой на общем тесте. И почти тут же словил нехилые фризы. Бой и без меня его турбослили со счётом 2:11 ко второй минуте, так что я даже не переживаю.

Полез смотреть. Увидел кучу-кучу-кучу по кругу выводящихся одних и тех же объектов и фалломорфировал. Полез снова в код.

И что же я вижу в обработчике горячих клавиш?

        commandsList = self.selectedCommands.get('hotkeyOnly', [])  # получить список команд из блока hotkeyOnly
        menuConf, _ = self.findBestFitConf()  # найти подходящую к текущей ситуации конфигурацию самого меню
        if menuConf is not None:  # если такая есть:
            commandsList.extend(menuConf.get(state, []))  # в зависимости от state, определяемого тем, на что я смотрю, добавить к этому списку остальные команды
        for command in commandsList:  # для каждой команды в получившемся списке
            if command and command.handleKeys(command.hotKeys, event.key):  # если команда не пустая и были прожаты соответствующие ей клавиши
                command.onCustomAction(target.id if target is not None else None, True)  # пнуть команду, мол, работай.

Подвох не видно на первый взгляд, да? Вот и я его не видел несколько патчей.

А подвох заключается в том, что при каждом нажатии любой клавиши в список hotkeyOnly складывался текущий список команд радиалки.

Сколько примерно раз за бой ты нажимаешь на клавиатуру за бой, анон? Вот. Каждое нажатие - плюс минимум 6 объектов, которые надо проверить.

За несколько боёв их набиралось достаточное количество, чтобы начать вызывать проблемы.

 

Фикс вышел на три символа. Приписать "[:]" к первой строке в приведённом кусочке. То есть - создавать копию списка hotkeyOnly, которая автоматически удалится после завершения работы обработчика, вместо того, чтобы в памяти висеть и разрастаться.

 

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

 

P.S. Посмотрел git blame по строкам, отвечавшим за обработку горячих клавиш. Они были неизменными с момента изначального написания мода. По крайней мере, в моём гит-репозитории, созданном 11.12.2016 года, код "в начале времён" уже лежит с багом.

Так что утечка памяти и производительности при нажатии клавиш была в моде в течение почти 3 (ТРЁХ) лет. Но почему-то узнал я о ней относительно недавно...

 

P.P.S. Перезагрузка конфига (достаточно было просто открыть окно настроек) помогала, потому что при перезагрузке "память" мода - а вместе с ней - и блок hotkeyOnly - полностью очищается и считывается из конфиг-файлов заново. Список с кучей копий одних и тех же команд тупо удаляло, поэтому производительность возвращалась.

  • Upvote 3

Share this post


Link to post

Short link
Share on other sites
9 hours ago, Polyacov_Yury said:

За несколько боёв их набиралось достаточное количество, чтобы начать вызывать проблемы.

Это называется "утечка памяти". Не используй list для статических контейнеров, для них существует тип tuple. Не используй mutable object в качестве default value.

Quote

Правило представления: Храните знания в данных так, чтобы логика программы была тупой и надёжной. Философия Unix.

Если сваливать всю сложность в логику, то со временем можно заблудиться в коде. Чем проще логика, тем проще отлаживать программу. А для отладки типов данных существуют unit-тесты.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
1 час назад, GPCracker сказал:

Это называется "утечка памяти".

Я знаю, как это называется. Пост для юзеров написан в понятных им "терминах".

1 час назад, GPCracker сказал:

Не используй list для статических контейнеров, для них существует тип tuple.

Предлагаешь нагромоздить конвертацию в кортежи в ридер JSON-конфигов? Мысль, конечно, неплохая. Но применить можно не везде. А у меня всё же код довольно сильно унифицирован из-за (и благодаря) используемому PYmodsCore ConfigInterface API.

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

1 час назад, GPCracker сказал:

Не используй mutable object в качестве default value.

Не путай. Одно дело - писать data.get(key, []). Совершенно другое - def func(val=[]): return. То, о чём ты говоришь - это как раз второе. Первое же - вполне приемлемая (и, насколько я знаю, pythonic'ная) однострочная замена конструкции

val = []
if key in data:
	val = data[key]

 

1 час назад, GPCracker сказал:

Если сваливать всю сложность в логику, то со временем можно заблудиться в коде. Чем проще логика, тем проще отлаживать программу. А для отладки типов данных существуют unit-тесты.

Почитал. Как говорится, коротко о том, почему я с таким стажем до сих пор считаю себя джуном: на слово "юнит-тест" у меня реакция однозначная: "ШТОЭТА?". Да и не очень понятно, как я их к Танкам прикручу, со всем нашим манки-патчингом через overrideMethod.

Edited by Polyacov_Yury
shadowing name from outer scope: dict

Share this post


Link to post

Short link
Share on other sites

Polyacov_Yury, если ты напишешь этот мод по новому и он не будет лагать, я просто расцелую ваши ноги, наверно я один из первых кто обратился с данной проблемой по этому моду ещё на сайте вотспик, потому что именно там я его нашёл и он жуть как мне понравился)
Сделайте пожалуйста и вся вселенная будет вам Благодарна!

Edited by PitbullMTB

Share this post


Link to post

Short link
Share on other sites

 

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

@PitbullMTB так обновлен уже ЯндексДиск.

@Polyacov_Yury а вот тут GoogleDrive нет обновления твоих модов.

 

Спасибо тебе за новость и автору, сейчас будем тестить мой любимый мод!)

Edited by PitbullMTB

Share this post


Link to post

Short link
Share on other sites

@Polyacov_Yury А вы не знаете случайно, можно ли сделать так чтобы после смерти танка вот этот макрос и дальше продолжал работать по хоткею
{
            "title": "Команда оленей!",
            "icon": "No",
            "text": "{randPart}",
            "chatMode": "Team",
            "variants": [
                "Тут неважно какой текст"
            ],
            "hotKey": ["KEY_NUMPAD9"]

 

p.s. спасибо за починку мода, работает как швейцарские часы!!!)))

Edited by PitbullMTB

Share this post


Link to post

Short link
Share on other sites

 

9 часов назад, PitbullMTB сказал:

Polyacov_Yury, если ты напишешь этот мод по новому и он не будет лагать, я просто расцелую ваши ноги, наверно я один из первых кто обратился с данной проблемой по этому моду ещё на сайте вотспик, потому что именно там я его нашёл и он жуть как мне понравился)
Сделайте пожалуйста и вся вселенная будет вам Благодарна!

 

:smile:

 

9 часов назад, Xotabych сказал:

@PitbullMTB так обновлен уже ЯндексДиск.

@Polyacov_Yury а вот тут GoogleDrive нет обновления твоих модов.

 

Хоттабыч, не перепостивай ссылки, плис. Сказать юзерам, что в шапке ссылка актуальна, вполне достаточно.

И да, я про ГДрайв в курсе. Я просто ещё на новой машине не настроил заливку архивов, а это, в свою очередь, потребует правки ВСЕХ ссылок на ГДрайв. Надо найти, могу ли я сделать так, чтобы мой телефон не закачивал их в себя, но при этом я всё ещё мог их просто в папку Драйва положить и получить перманентные пермалинки...

 

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

@Polyacov_Yury А вы не знаете случайно, можно ли сделать так чтобы после смерти танка вот этот макрос и дальше продолжал работать по хоткею
{
            "title": "Команда оленей!",
            "icon": "No",
            "text": "{randPart}",
            "chatMode": "Team",
            "variants": [
                "Тут неважно какой текст"
            ],
            "hotKey": ["KEY_NUMPAD9"]

 

p.s. спасибо за починку мода, работает как швейцарские часы!!!)))

Да, можно. Добавляете в нужный блок строчку

"inPostmortem": true

P.S. Это хорошо :)

 

И да, я только что архив перезалил. Буквожор буквы в конфигах поел немного (Юра криво написал регулярку для расстановки пробелов после запятых) :D

  • Upvote 1

Share this post


Link to post

Short link
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...