Jump to content
Korean Random

PVirex

User
  • Content Count

    22
  • Joined

  • Last visited

  • Days Won

    2

Everything posted by PVirex

  1. а как насчет погрешности? вы уверены в точности данных? статистика дело такое... топкое
  2. Так что по итогу, подкрутки есть или нет?
  3. Добавлена поддержка локализаций: RU, EN Выбирается 1 раз при первом запуске и сохраняется в кеш. Для переопределения снести кеш или поменять/удалить ключ 'language'
  4. Добавил упаковку модов в zip из директории mods_unpack. Это повышает удобство при пересборке модпака, достаточно хранить все необходимые моды в таком виде, как они должны находиться в клиенте игры. При этом моды у которых не совпадает версия папки для модов с той, что в клиенте добавляться не будут
  5. Добавил кеш, теперь сохраняется последний указанный путь и выбранные модификации
  6. уже не работает, разрабы пофиксили походу, теперь при попытке это использовать кикает с севера. недавно проверял на общем тесте 1.8
  7. было в планах на будущее как и кеш, есть даже отработанная технология
  8. @tunut оххх, это тултип отдельная боль и страдания. Я не нашел нормального решения как сделать тултип для three и начал колхозить сам) вышло то, что есть. По идее, мне кажестся можно зафиксировать его справа или слева, но тут есть трудности, я подумаю что можно сделать. Не забудьте поделиться ссылкой на Ваш модпак, очень интересно, что вышло в оконечном результате. У меня есть планы на доработку)
  9. @tunut значит стоит не по стандартному пути, не в programdata. Я поправил, должна кнопка теперь разблокироваться при ручном выборе пути. Fixed at head revision
  10. @tunut а WGC стоит? или ты выбираешь путь до игры руками? мб и баг у меня где-то))) я воспроизвел, это баг. ты не используешь WGC. Поправлю минут через 10-20. Спаисбо за инфу
  11. Должно работать. Обрати внимание на версию клиентав constants.py, текущая версия на проде вот такая VERSION_CLIENT = 'v.1.8.0.1' Извини за долгий ответ, мне казалось никому не интересно и я не стал дописывать мануал Обнови бранч, я внес правки и поправил версию.
  12. Наоборот немного, инсталятор модификаций написанный на Python с помощью wxPython и запакованный в ехе с помощью pyinstaller
  13. 2.0.1 * убрана необходимость вносить ресурсы в main.spec 2.0.2.0 * добавлено сохранение в кеш последнего указанного пути и последних установленных модификаций 2.0.3.0 * добавил упаковку модов в zip из директории mods_unpack. Это повышает удобство при пересборке модпака, достаточно хранить все необходимые моды в таком виде, как они должны находиться в клиенте игры. При этом моды у которых не совпадает версия папки для модов с той, что в клиенте добавляться не будут 2.1.0.0 * добавлена поддержка локализаций с сохранением выбора в кеш
  14. Сборка исполняемого файла Коммитом от on Mar 5, 2020 добавил парсинг mods_config.json в mods_install.spec Таким образом, конечному пользователю нет необходимости вносить правки в mods_install.spec, что может плохо закончиться. Теперь все ресурсы берутся из конфига автоматически и запаковываются. Для сборки необходимо: Шаг 1: установить python и либы, можно использовать setup.bat Шаг 2: занести нужные моды в конфиг mods_config.json Шаг 3: запустить сборщик 9 апреля, добавил упаковку модов в zip из директории mods_unpack. Это повышает удобство при пересборке модпака, достаточно хранить все необходимые моды в таком виде, как они должны находиться в клиенте игры. Например: replays/mods/1.8.0.2/replays.wotmod battlehints/res_mods/1.8.0.2/scripts/client/gui/mods/mod_battlehints.pyc После запуска батника в директории: res/mods появятся архивы с названием корневой папки и полной вложенностью как в оригинале replays.zip и battlehints.zip. Останется только внести zip архивы в mods_config.json
  15. Всем привет. Начало этой эпопеи можно прочитать тут, там же есть демо версия exe. Если кратко, это довольно простой инсталятор написанный на Python 3, но мне кажется будет работать и на 2 без особых переделок. Сам проект возник как шуточный, демонстративный, но со временем меня затянул и я решил доделать до конца, т.е до рабочего прототипа. Я в курсе, что есть более профильные решения, возможно даже проще, но у меня была цель сделать это на Python) Ссылка на репозиторий. Текущая версия: 2.1.0.0 Окружение: Python 3.8.1 wxPython pyinstaller pip install wxpython pip install pyinstaller Сложно понять, с чего начать) Пожалуй начну с самого начала, а именно mods_install.py т.к именно с него осуществляется запуск. В модуле содержится информация о панелях и инициализация самого приложения. Для добавления новой необходимо сделать импорт и внести в PANEL_INFO по примеру. В common расположены основные константы и пути, а также общие функции. constants.py # для отладки и запуска из IDE необходимо в root создать пустой файл start_python без расширения, это необходимо для поиска абстрактного пути ресурсов g_PYTHON_START = True if os.path.isfile(os.path.join(os.getcwd(), 'start_python')) else False # константа используется для включения записи логов в текстовый файл, см LOG_FOLDER в path.py g_DEBUG = True if os.path.isfile(os.path.join(os.getcwd(), 'debug')) else False # версия инсталятора VERSION = '2.0' # Имя рамки TITLE = 'My personal installer {}'.format(VERSION) # Очень важная константа!!! берется из version.xml игрового клиента, если версии не совпадут с клиентской, поставить моды не получится. VERSION_CLIENT = 'v.1.7.1.2' # размер фрейма и панели, панель чуть меньше из-за особенностей отрисовки wxWidget SIZE_FRAME = (600, 660) SIZE_PANEL = (585, 625) # стиль фрейма FRAME_STYLE = wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL | wx.BORDER # список папок которые будут удалены при выборе опции "Удалить кеш игры" пользователем DROP_GAME_FOLDER = ['battle_results', 'clan_cache', 'custom_data', 'veh_cmp_cache', 'dossier_cache', 'web_cache'] # список папок которые будут удалены при выборе опции "Удалить кеш модификаций" пользователем DROP_XVM_FOLDER = ['xvm\\Hitlog', 'xvm\\cache', 'xvm\\custom_data', 'xvm\\statistics'] DEFAULT_LANG = 'RU' # важная настройка, распаковывает моды не в конкретную папку, а как есть в корень игры. Это тнужно если в модпаке содержатся моды как mods так # и в res_mods SET_IN_GAME_FOLDER = True path.py ICON_PATH = resource_path('res_image\\main.ico') MAIN_LOGO_600x100_PATH = resource_path('res_image\\logo_600_100.png') MAIN_LOGO_600x500_PATH = resource_path('res_image\\logo_600x500.png') WGC_DEFAULT_PATH = os.path.join(os.environ['PROGRAMDATA'], 'Wargaming.net', 'GameCenter', 'preferences.xml') NOT_PATH_DEFAULT = resource_path('res_image\\not_found.jpg') # путь до кеша игры PATH_TO_CACHE_WOT = os.path.join(os.environ['appdata'], 'Wargaming.net', 'WorldOfTanks') LOG_FOLDER = os.path.join(os.environ['appdata'], 'TEMP_INSTALLER_LOGS', 'INSTALLER_LOGS') g_MODS_CONFIG = json.load(open(resource_path('mods_config.json'), encoding='utf-8')) g_PRESET_SETTINGS = json.load(open(resource_path('stream_settings.json'), encoding='utf-8')) PRESET_NAMES = list(g_PRESET_SETTINGS.keys()) В директории core расположены базовые класса и механики. Важным нюансом является то, что все ресурсы обязаны находиться в директории res, это больше обусловлено механизмом работы exe собранным с помощью pyinstaller. Для доступа к любому не py файлу должен осуществляться через функцию common_utils.resource_path def resource_path(relative_path): """ Функция для получения пути к ресурсам, все не .py файлы обязаны храниться в директории res. Такая зависимость обусловлена особенностями упаковки с помощью pyinstaller, т.к root меняется при запуске из .ехе """ if not g_PYTHON_START: base_path = sys._MEIPASS else: base_path = os.path.abspath(".") return os.path.join(base_path, 'res', relative_path) Конфиги. Самым важным безусловно является mods_config.json, такой формат выбран для простоты использования, описать можно вот так: { "P0LIROID Mods": { "checkBox": true, // флаг если для группы нужен именно чекбокс а не радиобуттон "Просмотр попадний в ангаре": [ // имя модификации в селекторе "res_image/battle_hits_poliroid.jpg", // относительный путь в ресурсах, обратить внимание что директорию res не учитываем "mods/battlehints_poliroid.zip", // относительный путь в ресурсах, до самого мода, обязательно архив zip "Текстовое описание, опционально, если не нужно то поставить null или пустую строку" ], "Менеджер реплеев": [ "res_image/replays_manager_poliroid.jpg", "mods/replays_manager.zip", "Текстовое описание, опционально, если не нужно то поставить null или пустую строку" ], "Кастомизация танков": [ "res_image/cust_veh.jpg", "mods/branding_vehicle.zip", null ] }, "Мои моды": [ "res_image/мой мод.jpg", "mods/мой мод.zip", null] ], "Radio button": { "Mods 1": [ "res_image/мой мод 1.jpg", "mods/мой мод1.zip", null], "Mods 2": [ "res_image/мой мод 2.jpg", "mods/мой мод2.zip", null] } } preset.json - устанавливает флажки для указанных групп, можно сделать сколько угодно пресетов. { "P0LIROID": [ "Просмотр попадний в ангаре", // просто добавляем имена модов как есть "Менеджер реплеев" ] } Модуль логирования logger.py имеет несколько уровней логирования: общий лог и только gui. Такой подход будет полезен в будущем если захочется использовать дополнительные библиотеки, которые тоже используют logger. Доступны следующие уровни: from core.logger import logger logger.info(msg) logger.debug(msg) logger.warning(msg) logger.error(msg) logger.exception(msg) try: pass exception Exception as e: logger.exception(e.msg) Основной UI который виден пользователю находится в step_panel. В текущий момент там 6 панелей: приветствие, поиск игры, выбор модификаций, подтверждение выбора, дополнительные настройки, установка. Возможно в будущем уделю больше внимания верстке и основной логике, в принципе там ничего сложного нет, если вы посвящены в начальные тайны ООП на Python. Сборка в ехе осуществляется либой pyinstaller. # -*- mode: python ; coding: utf-8 -*- import os block_cipher = None path_cwd = os.getcwd() a = Analysis(['mods_install.py'], pathex=['E:\\my_project\\mod_installer_stage_2'], # путь до проекта binaries=[], datas=[('res/locales/RU/LC_MESSAGES/ru.mo', 'res/locales/RU/LC_MESSAGES')], # локализации помещены отдельно специально hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) # указываем относительный путь в проекте, полный путь до файла a.datas += [('res/res_image/battle_hits_poliroid.jpg', os.path.join(path_cwd, 'res', 'res_image', 'battle_hits_poliroid.jpg'), 'DATA')] a.datas += [('res/res_image/cust_veh.jpg', os.path.join(path_cwd, 'res', 'res_image', 'cust_veh.jpg'), 'DATA')] a.datas += [('res/res_image/logo_600_100.png', os.path.join(path_cwd, 'res', 'res_image', 'logo_600_100.png'), 'DATA')] a.datas += [('res/res_image/logo_600x500.png', os.path.join(path_cwd, 'res', 'res_image', 'logo_600x500.png'), 'DATA')] a.datas += [('res/res_image/not_found.jpg', os.path.join(path_cwd, 'res', 'res_image', 'not_found.jpg'), 'DATA')] a.datas += [('res/res_image/replays_manager_poliroid.jpg', os.path.join(path_cwd, 'res', 'res_image', 'replays_manager_poliroid.jpg'), 'DATA')] a.datas += [('res/res_image/main.ico', os.path.join(path_cwd, 'res', 'res_image', 'main.ico'), 'DATA')] a.datas += [('res/mods_config.json', os.path.join(path_cwd, 'res', 'mods_config.json'), 'DATA')] a.datas += [('res/stream_settings.json', os.path.join(path_cwd, 'res', 'stream_settings.json'), 'DATA')] a.datas += [('res/mods/battlehints_poliroid.zip', os.path.join(path_cwd, 'res', 'mods', 'battlehints_poliroid.zip'), 'DATA')] a.datas += [('res/mods/branding_vehicle.zip', os.path.join(path_cwd, 'res', 'mods', 'branding_vehicle.zip'), 'DATA')] a.datas += [('res/mods/replays_manager.zip', os.path.join(path_cwd, 'res', 'mods', 'replays_manager.zip'), 'DATA')] pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='Name EXE', debug=True, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, # если поставить True, то приложение будет запускаться с консолью, иногда удобно для отладки icon=os.path.join(path_cwd, 'res\\res_image\\main.ico')) Для сборки запустить build.bat
  16. Убедил, доделаю "фичи" которые планировал, сделаю документацию и комменты по коду и сделаю репазиторий публичным
  17. для начала я могу помочь желающим с сборками, а после внутреннего дозревания и реализации того, чего я еще не сделал открою доступ) Если честно то больше стыдно показывать исходники из-за быдло кода. Вот доведу до ума и открою, или когда пойму что больше не хочу этим заниматься
  18. Всем привет. В свое время я удачно познакомился с wxPython и во время исследования возможностей библиотеки, я решил сделать свой небольшой проект, а именно установщик модификаций. Первая версия, получилась красивой, но это было тупиковое развитие, я это понял слишком поздно и бросил проект. Спустя месяца 2, найдя в себе новые силы я взялся за stage 2 :) и к моему удивлению получилось довольно интересно, а самое главное быстро. На весь проект я потратил около 10 часов + на первый вариант 10-15 часов. В итоге получилось вот это: Шаг 1 - окно приветствия Шаг 2 - выбор папки с игрой, поиск танков осуществляется автоматически, вычитываем preferences.xml от Game center. По умолчанию выбирается current_game WOT Шаг 3 - выбор модов для установки, на каждый мод в списке есть тултип с скриншотом и текстовым описанием. Тултип появляется при наведении на нужный мод. Если нет картинки и текста, выводится дефолтное изображение. Панель адаптивная и вмещает в себя столько модов, сколько необходимо, вертикальный скроллбар появляется автоматически. Шаг 4 - отображение выбранных модификаций к установке Шаг 5 - дополнительные опции, можно Шаг 6 - подготовка клиента и установка модов. Прогресс бар тоже адаптивный, как и журнал событий. Установка выполняется в отдельном потоке, приложение не зависает. В итоге мы имеем инсталятор сделанный стандартными средствами, без wxWizard. wxPython единственная внешняя либа, все остальное из коробки. Упаковка в exe осуществляется при помощи pyinstaller, собранный ехе файл содержит в себе все необходимое и не требует установки, принцип простой: скачал > установил моды > удалил инсталятор. Никаких следов, записей в реестр не производится, в appdata создается temp папка, которая автоматом подчищается при штатном прекращении работы. В случае, если кому-то из мододелов или желающих сделать свой модпак это интересно, пишите в личку или сюда. Хочется чтобы проект жил, а не лег в репазитории. Для этой демо версии, я взял модификации от @POLIROID с его разрешения. Скачать демо версию можно тут, ссылка на VirusTotal тут Проект не коммерческий, ссылка на донат ведет сюда, а Youtube сюда Поделиться исходниками пока не готов) Спасибо за внимание. Отмечу, я не программист, просто мне нравится Python :)
  19. Если кому интересно: https://github.com/p-virex/parse_replay/blob/master/parse_replay.py by Python3
  20. Спасибо) уже сделал) правда это мод и там есть импорты из клиента, но да ладно
  21. Всем привет! Я уверен, что эта тема жеванная-пережеванная, НО, не судите строго, поиск по форуму (гуглу) не дал исчерпывающего ответа на мой вопрос. Как распарсить реплей и получить данные за бой? (урон, ники и т.д.) Координаты танков и прочее мне не надо. Есть такая подсказка, но не охота тратить время на написание своего парсера, я уверен есть готовый. https://wiki.vbaddict.net/pages/Data_Packets 404 ошибка :) python знаю хорошо, есть опыт Спасибо
×
×
  • Create New...