Jump to content
Korean Random

PVirex

User
  • Content Count

    22
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by PVirex


  1. 25.03.2020 в 16:35, ktulho сказал:

    Наверняка потребуется возможность выбора языка установки.

    Добавлена поддержка локализаций: RU, EN

    Выбирается 1 раз при первом запуске и сохраняется в кеш. Для переопределения снести кеш или поменять/удалить ключ 'language'

    • Upvote 3

  2. Добавил упаковку модов в zip из директории mods_unpack. Это повышает удобство при пересборке модпака, достаточно хранить все необходимые моды в таком виде, как они должны находиться в клиенте игры. При этом моды у которых не совпадает версия папки для модов с той, что в клиенте добавляться не будут

    • Upvote 3

  3. 1 минуту назад, ktulho сказал:

    Наверняка потребуется возможность выбора языка установки.

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


  4. @tunut оххх, это тултип отдельная боль и страдания. Я не нашел нормального решения как сделать тултип для three и начал колхозить сам) вышло то, что есть. По идее, мне кажестся можно зафиксировать его справа или слева, но тут есть трудности, я подумаю что можно сделать.

     

    Не забудьте поделиться ссылкой на Ваш модпак, очень интересно, что вышло в оконечном результате. У меня есть планы на доработку)

    • Upvote 2

  5. @tunut а WGC стоит? или ты выбираешь путь до игры руками? мб и баг у меня где-то)))

     

    я воспроизвел, это баг. ты не используешь WGC. Поправлю минут через 10-20. Спаисбо за инфу


  6. 23.03.2020 в 11:54, tunut сказал:

    а оно работает ?:\ все скачал, установил, скомпилировал без ошибок - а кнопка Далее (после выбора папки) не активна

     

      Скрыть содержимое

    spacer.png

     

    Должно работать. Обрати внимание на версию клиентав constants.py, текущая версия на проде вот такая

    VERSION_CLIENT = 'v.1.8.0.1'

    Извини за долгий ответ, мне казалось никому не интересно и я не стал дописывать мануал

    Обнови бранч, я внес правки и поправил версию.


  7. 5 минут назад, StranikS_Scan сказал:

    Это типа установщик модов, написанный на пайтоне, с компиляцией exe через wxPython?

    Наоборот немного, инсталятор модификаций написанный на Python с помощью wxPython и запакованный в ехе с помощью pyinstaller

    • Upvote 1

  8. 2.0.1

    * убрана необходимость вносить ресурсы в main.spec

    2.0.2.0

    * добавлено сохранение в кеш последнего указанного пути и последних установленных модификаций

    2.0.3.0

    добавил упаковку модов в zip из директории mods_unpack. Это повышает удобство при пересборке модпака, достаточно хранить все необходимые моды в таком виде, как они должны находиться в клиенте игры. При этом моды у которых не совпадает версия папки для модов с той, что в клиенте добавляться не будут

    2.1.0.0

    * добавлена поддержка локализаций с сохранением выбора в кеш


  9. Сборка исполняемого файла

    Коммитом от 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


  10. Всем привет. 

    Начало этой эпопеи можно прочитать тут, там же есть демо версия 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

     

    • Upvote 3

  11. 58 минут назад, yepev сказал:

    @PVirex это понятно, все с этим сталкиваются по началу) Но обычно если открыть код сразу же, то проект лучше приживается). Часто авторы сначала стесняются открыть код, а потом не находят пользователей на закрытый код и проект просто умирает. А если код был бы открыт изначально, то было бы больше шансов найти коллабораторов или хотя бы иногда получать коммиты со стороны)

     

    Открытый код привлекает сильнее) Не настаиваю, просто мое мнение)

    Убедил, доделаю "фичи" которые планировал, сделаю документацию и комменты по коду и сделаю репазиторий публичным

    • Upvote 2

  12. 3 минуты назад, yepev сказал:

    @PVirex, крутяк! Одобряю! Надеюсь надумаешь открыть исходники, так проект будет только живее) Успехов!

     

    Нас тут много не программистов, кто иногда что-то кодит для души и фана)

    для начала я могу помочь желающим с сборками, а после внутреннего дозревания и реализации того, чего я еще не сделал открою доступ)

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

    • Upvote 2

  13. Всем привет. 

    В свое время я удачно познакомился с wxPython и во время исследования возможностей библиотеки, я решил сделать свой небольшой проект, а именно установщик модификаций. Первая версия, получилась красивой, но это было тупиковое развитие, я это понял слишком поздно и бросил проект. Спустя месяца 2, найдя в себе новые силы я взялся за stage 2 :) и к моему удивлению получилось довольно интересно, а самое главное быстро. На весь проект я потратил около 10 часов + на первый вариант 10-15 часов.

    В итоге получилось вот это:

    Шаг 1 - окно приветствия

     

    image.thumb.png.8b3f6298e94d99725456e43f1a1c01d1.png

    Шаг 2 - выбор папки с игрой, поиск танков осуществляется автоматически, вычитываем preferences.xml от Game center. По умолчанию выбирается current_game WOT

    image.thumb.png.742d705f6ea8846387203e35ce082d00.png

    Шаг 3 - выбор модов для установки, на каждый мод в списке есть тултип с скриншотом и текстовым описанием. Тултип появляется при наведении на нужный мод. Если нет картинки и текста, выводится дефолтное изображение. Панель адаптивная и вмещает в себя столько модов, сколько необходимо, вертикальный скроллбар появляется автоматически.

    image.thumb.png.8ce5dbf613993396d751f7886115e4bd.png

    Шаг 4 - отображение выбранных модификаций к установке

    image.thumb.png.295f4115d9762aa3bb9569646ff21deb.png

    Шаг 5 - дополнительные опции, можно

    image.thumb.png.6afaa7d174114f482d108170d362aa7d.png

    Шаг 6 - подготовка клиента и установка модов. Прогресс бар тоже адаптивный, как и журнал событий. Установка выполняется в отдельном потоке, приложение не зависает.

    image.thumb.png.1dee4017f64a77a720cc7ca584b96d90.png

     

    В итоге мы имеем инсталятор сделанный стандартными средствами, без wxWizard. wxPython единственная внешняя либа, все остальное из коробки. 

    Упаковка в exe осуществляется при помощи pyinstaller, собранный ехе файл содержит в себе все необходимое и не требует установки, принцип простой:

    скачал > установил моды > удалил инсталятор. 

     

    Никаких следов, записей в реестр не производится, в appdata создается temp папка, которая автоматом подчищается при штатном прекращении работы.

     

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

     

    Для этой демо версии, я взял модификации от @POLIROID с его разрешения.

     

    Скачать демо версию можно тут, ссылка на VirusTotal тут Проект не коммерческий, ссылка на донат ведет сюда, а Youtube сюда Поделиться исходниками пока не готов)

     

    Спасибо за внимание.

     

    Отмечу, я не программист, просто мне нравится Python :)

     

     

    • Upvote 3

  14. Всем привет! Я уверен, что эта тема жеванная-пережеванная, НО, не судите строго, поиск по форуму (гуглу) не дал исчерпывающего ответа на мой вопрос. Как распарсить реплей и получить данные за бой? (урон, ники и т.д.) Координаты танков и прочее мне не надо.

    Цитата

    Первые 4 байта - сигнатура файла, вторые 4 байта - размер распакованного реплея без этих 8 байта. С 9-го байта тупо zlib-поток.

    Есть такая подсказка, но не охота тратить время на написание своего парсера, я уверен есть готовый. https://wiki.vbaddict.net/pages/Data_Packets 404 ошибка :)

    python знаю хорошо, есть опыт

     

    Спасибо

×
×
  • Create New...