Jump to content
Korean Random

Search the Community

Showing results for '"hello world"'.

  • Search By Author

Content Type


Forums

  • Games
    • Armored Warfare
    • War Thunder
    • World of Warplanes
    • World of Warships
    • World of Tanks
    • WoT Mods
    • Games
  • General
    • Live Streaming and Video Production
    • Game Development and Game Engines
    • Programming and Development
    • Software: OS, Drivers and other programs
    • Computers, Devices and Hardware
    • DIY & Hand-Made
    • Culture & Media
    • General Discussions / Chit-Chat
  • Korean Random
    • About Korean Random
  • Тестовый клуб's Раздел 1
  • Тестовый клуб's Раздел 2

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


City


Interests


Instagram


Nick


Skype

  1. Всем привет! Решил недавно сделать мод, которому нужна сессионная статистика, гуглил, смотрел этот форум, но всё равно не нашёл ничего про "азы". Видел исходники xvm, но остаются открытыми например следующие вопросы: Насколько я понял, моды используют скрипты игры, которые можно посмотреть тут, но есть ли способ их подключения к PyCharm-у, кроме как писать мод в root папке? Как будут работать пути импортов в таком случае? В xvm есть import BigWorld,откуда он импортится и можно ли почитать его api? Тестирование мода возможно только итеративным процессом? А-ля дописал скрипт - скомпилировал - закинул в /mods/version - перезапустил игру? Куда пойдут логи модов и как можно их потом прочитать? Как итоговый .py скрипт нужно компилировать в .wotmod? Можно ли подключить мод как .py? В общем вопросы уровня как сделать hello world в этой всей системе инструментов, а дальше можно уже копипастить существующий код. Буду очень рад увидеть ссылки на подобные гайды (если я их просто не нашёл) или же ответы на вопросы выше. Заранее всем спасибо!
  2. @AndreasMelone Check out this thread. It has a lot of useful links to examples. Check search: "Hello World"
  3. Разработчики опубликовали первую информацию по API для модов в World of Warships. Это сообщение будет редактироваться и дополняться по мере поступления информации Содержание: Введение, общее описание API для модовModsAPI Python HelloWorld ModsAPI Flash HelloWorld Flash API Data Bridge Module Stage Module Python API callbacks events flash customPorts Введение, общее описание API для модов ModsAPI - это Sandbox, максимально изолированный от остальных частей клиента, но работающий на тех же технологиях, что и другие части. ModsAPI Flash и ModsAPI Python - две части API, которые могут работать независимо друг от друга. Каждая из них выполняет роль загрузчика модификации, а так же предоставляет доступ к данным клиента и функциям управления им. Общая изолированность API, а также примененные технологии позволяют "на лету" загружать и выгружать моды. ModsAPI устроен таким образом, что ошибки в модах ни коим образом не сказываются на общей работоспособности клиента(громкое заявление - прим. рекдактора) PythonAPI обеспечивает загрузку/выгрузку кода модиификации, написанной на языке Python, а так же перечень функций для получения данных из клиента и взаимодействия с FlashAPI. FlashAPI обеспечивает загрузку/выгрузку на изолированную сцену модификации, написанной на ActionScript 3, а так же перечень функций для взаимодействия с Flash-сценой и PythonAPI. ModsAPI — это изолированная среда. Моды, загруженные с помощью ModsAPI изолированы от остального клиента. Это необходимо для: Поддержания работоспособности мода из версии в версию Уменьшения вероятности «сломать» клиент Защиты от злоумышленного использования В обычном состоянии клиента ModsAPI неактивно. Для его активации необходимо в любой папке клиента создать пустой файл "PnFModsLoader.py", а рядом с ним папку "PnFMods". В папке "PnFMods" должны храниться папки с модами. В самом простом случае мод может состоять всего из одного файла: "Main.py". В итоге простейший мод может лежать по следующему пути: "<папка_с_игрой>/res_mods/<версия_игры>/PnFMods/MyMod/Main.py". ModsAPI состоит из двух частей: Python и Flash. Python-часть отвечает за загрузку "Main.py", а Flash-часть загружает специально подготовленные "Main.swf". Python и Flash части мода работают изолированно от игрового клиента. Для получения и отправки различных данных используется предоставленный интерфейс. ModsAPI Python HelloWorld Создадим в папке "res_mods/<версия_игры>" папку "PnFMods" и пустой файл "PnFModsLoader.py". В папке "PnFMods" создадим папку для нашей модификации "HelloWorld": Теперь в папке "HelloWorld" создадим пустой файл "Main.py", откроем его в любом редакторе и напишем следующее: API_VERSION = 'API_v1.0' print 'Hello World!' Запустим клиент, дождемся его загрузки и после этого закроем его. Откроем файл "python.log", в нем увидим примерно следующее: Итак, наш первый мод готов и работает! ModsAPI Flash HelloWorld Для создания Flash-части мода нам понадобится Flash IDE. Это может быть "Adobe Flash Professional" или "FlashDevelop". Создадим пустой AS3 проект и в зависимости от выбранной IDE добавим к проекту внешнюю SWC-библиотеку, актуальную версию которой можно взять из ModsSDK: https://share.wargaming.net/d/351652a5fa/ (as3_library/wows_library.swc) После подключения библиотеки нам необходимо создать "Document Class", опять же в зависимости от выбранной IDE способ создания может различаться. Например после создания проекта в FlashDevelop такой класс уже будет создан и нам нужно будет его лишь немного доработать. Вот код-заготовка для Flash-части мода: package { import lesta.api.ModBase; public class Main extends ModBase { public function Main() { super(); } override public function init():void { super.init(); } override public function fini():void { super.fini(); } override public function updateStage(width:Number, height:Number):void { super.updateStage(width, height); } } } Напишем наш простой Flash-мод: package { import lesta.api.ModBase; import flash.text.TextField; import flash.text.TextFormat; public class Main extends ModBase { private var tf:TextField = new TextField(); public function Main() { super(); } override public function init():void { super.init(); var format:TextFormat = new TextFormat(); format.size = 40; gameAPI.stage.addChild(tf); tf.defaultTextFormat = format; tf.text = "Hello World!"; tf.textColor = 0xFF0000; tf.width = 250; } override public function fini():void { super.fini(); } override public function updateStage(width:Number, height:Number):void { super.updateStage(width, height); } } } Запустим клиент и убедимся, что он работает: FlashAPI Методы доступные для потомков класса ModBase ModBase - это базовый класс, который должны наследовать все Flash моды. Если главный класс мода не наследуется от ModBase, то ModsAPI игнорирует такой мод. ModBase наследуется от базового класса Sprite. Список полей класса ModBase: public var gameAPI:GameAPI // точка доступа к GameAPI protected var stageWidth:Number // текущая ширина Stage protected var stageHeight:Number // текущая высота Stage Список методов класса ModBase: public function init():void // данная функция вызывается после добавления мода на Stage public function fini():void // данная функция вызывается перед удалением мода со Stage public function updateStage(_stageWidth:Number, _stageHeight:Number):void // вызывается при изменении размеров Stage protected function log(...args):void // функция для логирования в python.log Data Bridge Module gameAPI.data.call(methodName:String, params:Array):void gameAPI.data.addCallBack(methodName:String, func:Function):void gameAPI.data.removeCallBack(methodName:String = null, callBack:Function = null):void StageModule gameAPI.stage.addChild(child:displayObject):displayObject gameAPI.stage.addChildAt(child:displayObject, index:int):displayObject gameAPI.stage.removeChild(child:displayObject):displayObject gameAPI.stage.removeChildAt(index:int):displayObject gameAPI.stage.width():Number gameAPI.stage.height():Number Data Bridge Module (описание) Данный модуль позволяет моду передавать или получать данные в/из Python. call Метод позволяет передать в Python информацию. Входные параметры: methodName:String - имя коллбэка, на который подписан Python. params:Array - массив передаваемых в Python параметров addCallBack Добавляет коллбэк для получения информации из Python'a. Входные параметры: methodName:String - имя коллбэка, на который будет подписан Flash func:Function - функция-обработчик коллбека removeCallBack Удаляет коллбэк для получения информации из Python'a. Входные параметры: methodName:String - имя коллбэка, на который будет подписан Flash func:Function - функция-обработчик коллбека Примечание: Функция может быть вызвана без параметров. Таким образом удалятся все коллбеки, на которые был подписан мод. Stage Module (описание) Данный модуль предоставляет моду интерфейс для работы со Stage. addChild Добавляет DispalyObject на Stage. Входные параметры: child:displayObject - DisplayObject, который должен быть добавлен на StageВозвращаемое значение: DisplayObject, который был добавлен на Stage. addChildAt Добавляет DispalyObject на определенный слой Stage'a. Входные параметры: child:displayObject - DisplayObject, который должен быть добавлен на Stage index:int - порядковый номер слоя, на который должен быть добавлен DisplayObject Возвращаемое значение: DisplayObject, который был добавлен на Stage. removeChild Удаляет DispalyObject со Stage. Входные параметры: child:displayObject - DisplayObject, который должен быть удален со Stage index:int Возвращаемое значение: DisplayObject, который был удален со Stage. removeChildAt Очищает выбранный слой на Stage. Входные параметры: index:int - порядковый номер слоя, с которого должен быть удален DisplayObject.Возвращаемое значение: DisplayObject, который был удален со Stage. width Возвращает ширину Stage. Возвращаемое значение: Number, ширина Stage. height Возвращает высоту Stage. Возвращаемое значение: Number, высота Stage. PythonAPI Доступные методы: callbackscallbacks.perTick(func) callbacks.callback(dt, func, *args, **kw) callbacks.cancel(handle) eventsevents.onFlashReady events.onSFMEvent events.onReceiveShellInfo events.onBattleStarted events.onBattleQuit flashflash.call(methodName, args = None) flash.addExternalCallback(command, function) flash.removeExternalCallback(command = None, function = None) flash.loadFlashMod(modName) flash.loadPyMod(modName) flash.reloadMod(modName, needToReloadPy = False) flash.unloadMod(modName, needToUnloadPy = False) flash.getModsStatus() customPortscustomPorts.addCustomPort(portName, portDisplayName = 'Персональный', isPremium = False, peculiarities = None) customPorts.removeCustomPort(portName) contentSDKcontentSDK.registerShipMod(shipName) contentSDK.extractSources(modName, shipName, callback = None) callbacks (описание) perTick Данная функция вызывает функцию, переданную в качестве параметра каждый тик. Входные параметры: func - Python-функцияВозвращаемое значение: handle - уникальный идентификатор, используемый для остановки вызова функции по тику. callback Данная функция позволяет вызвать другую функцию с определенной задержкой и параметрами. Входные параметры: dt - время в милисекундах, через которое вызвоется функция func func - функция, которая вызовется *args - все non-keyword параметры, которые передадутся в функцию func **kw - все keyword параметры, которые передадутся в функцию func Возвращаемое значение: handle - уникальный идентификатор, используемый для остановки вызова функции по тику. cancel Данная функция отменяет действие, которые должны будут выполнить функции выше (вызов функции каждый тик или вызов функции с задержкой). Входные параметры: handle - уникальный идентификатор, полученный от функций perTick или callback.events (описание) Эвенты вызываются извне и передают различные параметры в функции, которые на данные эвенты подписаны. Пример подписи на эвент: events.eventName(myEventHandlerFunc) onFlashReady Данный эвент срабатывает сразу после загрузки и инициализации Flash-части мода (при её наличии). Параметры эвента: modName - имя мода, Flash-часть которого была загружена onSFMEvent Данный эвент срабатывает при возникновении различных событий в SFM-машине. Например показ и скрытие различных окон, нажатия на некоторые кнопки и т.д и т.п. Параметры эвента: eventName - имя SFM эвента eventData - параметры SFM эвента onReceiveShellInfo Данный эвент срабатывает при получении игроком информации о попадании (снарядом/торпедой) в чужой корабль. Параметры эвента: victimID - идентификатор атакованного shooterID - идентификатор атакующего ammoId - тип снаряда matId - тип материала, в который было попадание shotID - идентификатор выстрела booleans - пока не определено damage - кол-во нанесенного урона shotPosition - точки пападания yaw - пока не определено hlinfo - пока не определено onBattleStarted Данный эвент срабатывает при начале боя, после 30-секундного отсчета. onBattleQuit Данный эвент срабатывает после окончания боя. Параметры эвента: arg - зарезервированный аргумент. На данный момент равен Trueflash (описание) call Данный метод вызывает коллбек, на который должны быть подписаны функции во Flash. Параметры функции: methodName - имя, ключ коллбека args = None - массив аргументов addExternalCallback Данный метод добавляет функцию обработчик для указанного коллбека. Параметры функции: methodName - имя, ключ коллбека function - функция-обработчик коллбека removeExternalCallback Данный метод прекращает работу функции-обработчика коллбека. Параметры функции: methodName = None - имя, ключ коллбека function = None - функция-обработчик коллбека Примечание: При вызове данной функции без параметров будет полностью очищен список функций-обработчиков для текущего мода. loadFlashMod Данный метод загружает Flash-часть мода, если она не была загружена ранее, либо была выгружена. Параметры функции: modName - имя, идентификатор мода loadPyMod Данный метод загружает Python-часть мода, если она не была загружена ранее, либо была выгружена. Данный метод так же загрузит Flash-часть мода. Параметры функции: modName - имя, идентификатор мода reloadMod Данный метод перезагружает мод. Параметры функции: modName - имя, идентификатор мода needToReloadPy = False - нужно ли перезагрузить Python-часть мода unloadMod Данный метод выгружает мод. Параметры функции: modName - имя, идентификатор мода needToUnloadPy = False - нужно ли выгружать Python-часть мода getModsStatus Данный метод возвращает список модов и их статус. Возвращаемое значение Словарь (dict) следующего вида: { 'modName': isLoaded # загружен ли мод } customPorts (описание) addCustomPort Данный метод добавляет в меню выбора порта новый порт. Параметры функции: portName - имя, идентификатор порта, должен совпадать с именем space'a и png-иконки порта portDisplayName = 'Персональный' - отображаемое имя порта isPremium = False - премиумность порта peculiarities = None - массив особенностей порта (напр. "peculiarities = [ 'arpeggio' ]") removeCustomPort Данный метод удаляет из меню выбора порта новый порт. Параметры функции: portName - имя, идентификатор загруженного порта
  4. Есть повторяемая проблема обфускации кода. Шаги: Иерархия папок: -modTest --res\scripts\client\gui\mods ---mod_test.py --meta.xml mod_test.py: # -*- coding: utf-8 -*- print('Hello world') Через PjOrion делаю Bytecode->Obfuscate->Compile py-file и выбираю mod_test.py >>> Obfuscating... Please wait the completion message! >>> Compile obfuscated file 'mod_test.py' [0.03 seconds] Собираю в .wotmod файл, кидаю в mods чистого клиент танков. Запускаю игру, в лог выводится /------------------------------------------------------------------------------------------\ WorldOfTanks(x86) 0.0.0.0 (compiled at 07:18:44 Jul 8 2021) starting on Sat Jul 31 02:15:09 2021 2021-07-31 02:15:09.864: INFO: [Config] Command line: C:/Games/World_of_Tanks_RU/win32/WorldOfTanks.exe "" 2021-07-31 02:15:11.778: INFO: [SOUND] Start loading Main task 2021-07-31 02:15:11.778: INFO: [SOUND] Start loading Mod task 2021-07-31 02:15:11.779: INFO: [Scaleform] Create Scaleform Manager... 2021-07-31 02:15:11.854: INFO: Scaleform initialized 2021-07-31 02:15:11.867: INFO: [Scaleform] Scaleform Manager created. 2021-07-31 02:15:11.867: INFO: Unbound initialized 2021-07-31 02:15:12.469: INFO: WOT-Transmission initialization completed! 2021-07-31 02:15:12.471: INFO: You are in the __main__ module, use a WOT-Transmission menu command to work with the client 2021-07-31 02:15:12.472: INFO: ===================================================================================== 2021-07-31 02:15:12.568: TRACE: monkeyPatchOpen: BWUtil.monkeyPatchOpen: Patching open() True 2021-07-31 02:15:12.570: INFO: [Config] Default encoding set to utf-8 2021-07-31 02:15:12.572: TRACE: revertPatchedOpen: BWUtil.revertPatchedOpen: Reverting open() 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Release Client - Content Type: sd 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Checking C:/Games/World_of_Tanks_RU/res_mods/1.13.0.1/: mods not found 2021-07-31 02:15:12.610: INFO: [PY_DEBUG] Checking C:/Games/World_of_Tanks_RU/mods/1.13.0.1/: mods found 2021-07-31 02:15:12.611: INFO: [PY_DEBUG] Mod package 'c:/games/world_of_tanks_ru/mods/1.13.0.1/mod.testmod_0.0.1.wotmod' loaded 2021-07-31 02:15:14.530: INFO: [Scaleform] Create GUI Component: 'empty' 2021-07-31 02:15:14.530: INFO: [Scaleform] Change Owner on GUI Component: 'empty' -> 'loading_screen.gui' 2021-07-31 02:15:14.542: INFO: [Scaleform] Create GUI Component: 'FlashGUIComponent' 2021-07-31 02:15:14.542: INFO: [Scaleform] Change Owner on GUI Component: 'FlashGUIComponent' -> 'gui/flash/gameLoadingApp.swf' 2021-07-31 02:15:14.543: INFO: [gui.Scaleform.game_loading] Build: RELEASE 07:18:44 Jul 8 2021. Version: 2.8.0 2021-07-31 02:15:14.544: INFO: [gui.Scaleform.game_loading] App Startup 2021-07-31 02:15:14.616: DEBUG: [helpers.uniprof.regions] Region is entered: label=offline.game_loading, color=0xCE2606 2021-07-31 02:15:14.730: INFO: [gui.Scaleform.game_loading] Registering graphics settings 2021-07-31 02:15:14.747: INFO: [gui.Scaleform.game_loading] Preloading Resources 2021-07-31 02:15:23.843: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.844: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.845: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:23.846: WARNING: [web.web_client_api] Do not use "required" and "default" at the same time! 2021-07-31 02:15:24.022: INFO: [Scaleform] Create GUI Component: 'FlashGUIComponent' 2021-07-31 02:15:24.022: INFO: [Scaleform] Change Owner on GUI Component: 'FlashGUIComponent' -> 'gui/flash/waitingTransitionsApp.swf' 2021-07-31 02:15:24.745: INFO: Hello world После чего игра крашится без каких либо дополнительных ошибок. Тот же самый мод скомпиленный без обфускации игру не крашит, hello world выводит В чём может быть проблема?
  5. Например есть такой Hello World: https://gitlab.com/xvm/xfw/xfw-example-actionscript Полезный, потому что основан на XFW и по сути это готовый способ стартануть быстрее всего, не набивая шишки от незнания куда податься. Дока лежит тут: https://gitlab.com/xvm/xfw/xfw-documentation (самая свежая, но немного не удобочитаемая). И тут: https://xfw.readthedocs.io/ru/latest/ она же, но не уверен насчёт свежести. И немножко по практике можно почитать тут: Про некоторые остальные вопросы можно поскрести информацию тут: И ещё есть такой пример Hello World в ангарном окошке: Логи питона идут в python.log в папке с игрой. Ещё можно научить мод писать свой лог куда надо, как XVM пишет свой xvm.log .wotmod - это просто .zip архив. Т.е. в него нужно положить готовый мод с сохранением путей. Во время разработки не обязательно каждый раз всё ложить в .wotmod, можно держать файлики в res_mods. Да, в https://xfw.readthedocs.io/ru/latest/2.getting_started/index.html#id4 смотри информацию про структуру простейшего мода и далее по тексту.
  6. я кошковод есть linux, не так всё просто %) и... говнища для компиляции swf в винде сама научилась подтягиваться? уважение винде, разве что верю, что возможно так и есть, но... те кто сталкивался с билдами стороннего знают что почти никогда так просто не бывает. (У мну "тяжелый" случай чтобы "просто попробовать" - линукс. Не со зла, просто так нравится). Хотя, тулзы для реверса swf прекрасно свиристели, когда имел радость их пользовать. Питон - из коробки "для народа" @yepev // offtop hello world не соберется у 99% пользователей винды, статистикой не обладаю, но *опой чую, хотя, казалось бы, что за люди без турбопаскаля то Даже если "Вы/вы/ты", уважаемый @yepev перечислите сборную _хотя бы (де)компиляторов/интерпретаторов для сборки xvm прям тут, без разбора муток travis - поклонюсь в ноги. Уверен, что адресату понятно. Сторонним читателям может и нет; готов развернуть детали чуть позже. Вкратце - данная болезнь есть у XVM, не вижу причин спорить (как и оснований у меня, скажем, требовать чтобы оно под никсами вообще работало). Готов, временами, помочь с совместимостью, это да. в очередной раз пролистнул... Верю, что работает. И ** точка Никаких обид; сам я, просто, имел насколько полезный, настолько и неприятный опыт общения с подобными "немыми" скриптами... Берегите печень! =) ~~~~~~~~ лютый оффтоп выше ~~~~~~~~ По проблеме отлючения "боевой" части XVM может кто сказать, есть знающие homo?
  7. Привет всем еще раз! Наверное надоел уже, так что простите) Для меня всегда самым сложным было настроить среду разработки и конфиги, когда чем-то новым начинаешь заниматься и ничего не понятно как-то невесело неделю разбираться во всём чтобы написать хоть что-то. Так что я до сих пор пытаюсь запустить под танками хоть какой-то код, и до сих пор безуспешно. Сформулировал еще несколько вопросов, буду рад если кто-то ответит: Старый hello world с форума закидываю в res_mods (со всеми папками) и происходит ничего. Понимаю что за 5 лет многое должно было измениться, возможно у кого-то есть актуальная версия? Есть ли вообще примеры готовых модов (чем меньше, тем лучше), кроме xvm, в .wotmod или структуре для закидывания в /res_mods, которые можно посмотреть? Пробовал с помощью ориона декомпилировать моды которыми раньше пользовался - все не работают. По поводу XFW так и не понял, он давно добавлен в клиент игры и можно уже писать код с его использованием, или нужно скачивать и компилировать вместе с ним? И если второе, то откуда же его можно скачать и какие именно файлы нужны. Нашел доку про .wotmod, там написано что минимум должно быть /package.wotmod/res /scripts /client /gui /mods /mod_example.pyс. Если этого достаточно, знает ли кто-то пример минимального .py файла, который можно скомпилировать в .pyc или наоборот, который можно так закинуть в .wotmod, чтобы что-то работало? Понимаю что вопросы могут казаться глупыми и очевидными, но у меня не работает ничего. Есть сорсы xvm, понятно как с их примером что-то написать, но я нигде на форуме на нашел простейшей инструкции типа Написать в mod_example.py print("Hello") Скомпилировать один файл в .pyc Закинуть этот файл в /res_mods/0.x.x.x/scripts/client/gui/mods После запуска игры в python.log появится сам текст Сижу, пытаюсь что-то найти, куда-то закинуть файл что-бы что-то работало, но не могу сделать то, что делается 2 минуты, потому что понятия не имею как эти базовые шаги надо делать
  8. # -*- coding: utf-8 -*- from gui.SystemMessages import SM_TYPE from gui.SystemMessages import pushMessage from gui.Scaleform.daapi.view.lobby.LobbyView import LobbyView class EventHook(object): def __init__(self): self.__handlers = [] def __iadd__(self, handler): self.__handlers.append(handler) return self def __isub__(self, handler): if handler in self.__handlers: self.__handlers.remove(handler) return self def fire(self, *args, **keywargs): for handler in self.__handlers: handler(*args, **keywargs) def clearObjectHandlers(self, inObject): for theHandler in self.__handlers: if theHandler.im_self == inObject: self -= theHandler class HookMethod(object): def __init__(self): self.log = self.log_exception self.registerEvent = self.hook_decorator(self.register_event) self.overrideMethod = self.hook_decorator(self.override_method) self.overrideClassMethod = self.hook_decorator(self.override_classmethod) self.overrideStaticMethod = self.hook_decorator(self.override_staticmethod) def logtrace(self, func=None): import traceback, sys print '=' * 20 + ' [ekspointCore] - detected error start '.upper() + '=' * 20 if func: logging = [] etype, value, tb = sys.exc_info() co_filename = func.func_code.co_filename.replace('\\', '/') filename = co_filename.split('/')[co_filename.count('/')].replace('.pyc', '').replace('.py', '') if co_filename.count('/') else co_filename for scriptName in sys.modules.keys(): if filename in scriptName: scriptDir = str(sys.modules[scriptName]).split('from')[1].replace(' ', '').replace('>', '').replace("'", '') for values in traceback.format_exception(etype, value, tb): if func.func_code.co_filename in values: values = ' File "%s", line %d, in %s\n' % (scriptDir, tb.tb_lineno, func.func_code.co_name) logging.append(values) count = len(logging) - 1 logging[count] = logging[count].replace('\n', '') print ''.join(logging) else: traceback.print_stack() print '=' * 20 + ' [ekspointCore] - detected error stop '.upper() + '=' * 21 def event_handler(self, func, prepend, e, m, *a, **k): try: if prepend: e.fire(*a, **k) r = m(*a, **k) else: r = m(*a, **k) e.fire(*a, **k) return r except: self.logtrace(func) def override_handler(self, func, orig, *a, **k): try: return func(orig, *a, **k) except: self.logtrace(func) def log_exception(self, func): def exception(*a, **k): try: return func(*a, **k) except: self.logtrace(func) return exception def hook_decorator(self, func): def decorator1(*a, **k): def decorator2(handler): func(handler, *a, **k) return decorator2 return decorator1 def override(self, cls, method, newm): orig = getattr(cls, method) if type(orig) is not property: setattr(cls, method, newm) else: setattr(cls, method, property(newm)) def register_event(self, handler, cls, method, prepend = False): evt = '__event_%i_%s' % (1 if prepend else 0, method) if hasattr(cls, evt): e = getattr(cls, evt) else: newm = '__orig_%i_%s' % (1 if prepend else 0, method) setattr(cls, evt, EventHook()) setattr(cls, newm, getattr(cls, method)) e = getattr(cls, evt) m = getattr(cls, newm) l = lambda *a, **k: self.event_handler(handler, prepend, e, m, *a, **k) l.__name__ = method setattr(cls, method, l) e += handler def override_method(self, handler, cls, method): orig = getattr(cls, method) newm = lambda *a, **k: self.override_handler(handler, orig, *a, **k) newm.__name__ = method self.override(cls, method, newm) def override_staticmethod(self, handler, cls, method): orig = getattr(cls, method) newm = staticmethod(lambda *a, **k: self.override_handler(handler, orig, *a, **k)) self.override(cls, method, newm) def override_classmethod(self, handler, cls, method): orig = getattr(cls, method) newm = classmethod(lambda *a, **k: self.override_handler(handler, orig, *a, **k)) self.override(cls, method, newm) hookMethod = HookMethod() show = True @hookMethod.registerEvent(LobbyView, '_populate') @hookMethod.log def populate(self): global show if show: show = False pushMessage(u'<font color="#D042F3">Hello world</font>', SM_TYPE.GameGreeting) # если в классе то так class Hello(object): def __init__(self): self.show = True hookMethod.registerEvent(LobbyView, '_populate')(hookMethod.log(self.populate)) def populate(self, base_self): if self.show: self.show = False pushMessage(u'Mod Informations<br>Version 0.1<br>Site: koreanrandom.com', SM_TYPE.GameGreeting) Hello() Скомпилируешь и закинь файл .pyc в res_mods/версия_игры/scripts/client/gui/mods Правда это сообщение, если нужно с окном, то могу написать, главное ответь в теме,если актуально ещё
  9. Hi ! I try to make a simple "Hello world!" into the python.log. I can't do anything. The XFW loader don't find my package into C:\Games\World_of_Tanks_EU\res_mods\mods\packages. Also i tried to use the example on Gitlab -> https://gitlab.com/xvm/xfw/xfw-example-actionscript But it doesnt load either. It seems the documentation https://gitlab.com/xvm/xfw/xfw-documentation isn't updated because i saw XFW package declaration in JSON format. Anyone has a updated default template ? (i prefer python function overload as action script)
  10. Моды работыют, спс. Поможешь с PHP? Поможешь собрать подстанову? <html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p>Hello World</p>'; ?> </body> </html> Пишет хрень. Hello World '; ?>
  11. Добавьте строку import BigWorld в начало модуля и будет ОК. Это древняя штука у них, появилась несколько лет назад после очередной оптимизации нативного пайтона. Научного объяснения этому я не знаю, но думаю это связано с памятью и областями видимости и исполнения кода. То что сам скрипт и обфускация кода тут не причем, это очевидно. Модуль без проблем работает в обычным пайтоне. # -*- coding: utf-8 -*- import BigWorld print('Hello world')
  12. Всем привет ! Можно пример "Hello World" ? К примеру в бою хочу наблюдать эту надпись в заданных координатах экрана (в % соотношении естесно) Что для этого нужно ? Только пайтон или же плюсом пойдут всякие XML, JSON ? Естественно мне потребуется доступ к GUI клиента - нужны классы/методы. val str = "hello world" GUI.print(str,x,y) К примеру GUI найден - какие дальнейшие действия после написания кода, куда его пихать, с чем ему взаимодействовать. Какие нужны зависимости для PyCharm или другой какой IDE для полноценной работы (создание игровых модов) P.S. Гуглом, похоже, пользоваться не умею :) Тут я нахожу скорее всего устаревшие ответы где указано что для доступа к классам/методам движка используются заглушки (этж не контролируемый гемор чесслово) + если избежать этого нужно преобрести BigWorld. В кабинете разработчика нашел только запросы с серверов для приложений. Вообщем я к чему: Если я создаю приложение под ведроид - мне требуется IDE (AS3), куча зависимостей, библиотек, доступ к стору и прочая лабуда. То есть если я напишу код на java/kotlin/c# и запущу на ведре то.... то я тупо не запущу :) потому что требуется все вышеперечисленное.
  13. Флэшки - это готовые flash-компоненты, чтобы проще было делать gui? Ну вот как-то до сих пор не нашёл, хотя весь день тут сижу) В том числе в ссылке только пример пайтон скрипта, но не написано что с ним делать чтобы он начал использоваться. В той же теме с примером hello world последнее сообщение как раз про пайтон остается не отвеченным уже больше года..
  14. Спрашиваю еще про hello world) В офф. примере (https://gitlab.com/xvm/xfw/xfw-example-actionscript) не понятно как и чем компилировать, написано только куда положить результат + только as3 В этом примере ( , первый ответ) есть и питон и as3 и написано чем компилить, но появляются следующие вопросы: В примере подключают wg.swf, но в примере XFW есть только другие файлы https://gitlab.com/xvm/xfw/xfw-example-actionscript/-/tree/master/swc. Это библиотека изменилась, или wg.swf надо брать где-то в другом месте? В примере используют FlashDevelop, это логично для as3 файлов, но не для py, особенно если в моде только py файлы. Это FlashDeveloper без проблем компилит и python тоже или с ним что-то отдельно нужно делать? В доке описана структура проекта (https://gitlab.com/xvm/xfw/xfw-documentation/-/blob/master/2.getting_started/index.rst), но совершенно не понятно где брать скелетон или хотя бы файлы самого xfw, которые используются как это всё компилить. Единственное, что похоже на xfw либу это https://gitlab.com/xvm/xfw/xfw-buildscript-library, но тут просто пара неизвестных файлов. Как вообще вы пишете свои моды? Где берете скелетон, как компилируете и тестируете? Как-то даже странно, что за столько лет существования форума нет (наверное) ни одного полноценного текстового примера или видоса про создание мода от установки нужных инструментов до проверки результата. Даже по установке модов наверное видосы есть)
  15. from gui import SystemMessages from messenger import MessengerEntry from constants import PREBATTLE_TYPE from messenger.m_constants import PROTO_TYPE, LAZY_CHANNEL class CommonChannelCriteria(object): def filter(self, channel): return channel.getName() == LAZY_CHANNEL.COMMON ctrl = MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) ctrl.sendMessage(u"Hello World!".encode('utf-8'))
  16. Он тут совершенно не нужен.... from gui import SystemMessages def onAccountShowGUI(ctx): alert = 'Hello World!' SystemMessages.pushMessage(alert, type=SystemMessages.SM_TYPE.Warning) Все
  17. Как правильно компилировать мод и чтобы он запускался только в ангаре? Сделал функцию и нужно чтобы она стартовала ток в ангаре, получился такой код: import locale import time from gui import SystemMessages from messenger import MessengerEntry from constants import PREBATTLE_TYPE from messenger.m_constants import PROTO_TYPE, LAZY_CHANNEL from Avatar import PlayerAvatar from Account import PlayerAccount while True: message = u'Hello World! All be back!' if(MessengerEntry.g_instance.gui._GUIDecorator__currentScope == 2): time.sleep(20) class CommonChannelCriteria(object): def filter(self, channel): return channel.getName() == LAZY_CHANNEL.COMMON ctrl = MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) ctrl.sendMessage(message.decode('ascii').encode('utf-8')) Но при загрузке, танки зависают, в чём может быть проблема?
  18. @dimank26 попробуйте так: import locale from gui import SystemMessages from messenger import MessengerEntry from constants import PREBATTLE_TYPE from messenger.m_constants import PROTO_TYPE, LAZY_CHANNEL message = u'Hello World' class CommonChannelCriteria(object): def filter(self, channel): return channel.getName() == LAZY_CHANNEL.COMMON ctrl = MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) ctrl.sendMessage(message.decode(locale.getdefaultlocale()[1]).encode('utf-8'))
  19. Правильно. А в коде обращаетесь к объекту messenger, которого нет: ctrl = messenger.MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) Попробуйте: ctrl = MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) PS Хотя посмотрел еще раз код. Попробуйте так: from gui import SystemMessages from messenger import MessengerEntry from constants import PREBATTLE_TYPE from messenger.m_constants import PROTO_TYPE, LAZY_CHANNEL message = u'Hello World' class CommonChannelCriteria(object): def filter(self, channel): return channel.getName() == LAZY_CHANNEL.COMMON ctrl = MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) ctrl.sendMessage(message.encode('utf-8'))
  20. MessengerEntry Код: import BigWorld from gui import SystemMessages from messenger import MessengerEntry from constants import PREBATTLE_TYPE from messenger.m_constants import PROTO_TYPE message = u'Hello World' class CommonChannelCriteria(object): def filter(self, channel): return channel.getName() == messenger.m_constants.LAZY_CHANNEL.COMMON ctrl = messenger.MessengerEntry.g_instance.gui.channelsCtrl.getControllerByCriteria(CommonChannelCriteria()) ctrl.sendMessage(message.encode('utf-8'))
  21. я там фигни понаписывал, с целью хотя бы увидеть что оно пытается работать. я уже поисправлял. FAQ как писать моды Элементарный Пример 1 скачайте себе PjOrion -- где то тут http://www.koreanrandom.com/forum/topic/15280-pjorion-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%B4%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%84/ 2 запустите PjOrion и в нем напишите функцыональность мода на языке python (хаха это самое простое) например напишите туды текст из одной строки print 'Hello world' 3 скомпилируйте CTRL-F9 оно спросит - а куда сохранить? - сохраните куда нибудь, главное чтоб имя начиналось на mod_ (например mod_hello.py) компилятор создаст .pyc файло (например mod_hello.pyс) 4 скопируйте мод mod_hello.pyс в директорию [...путь к танчикам... .\res_mods\...версия ... \scripts\client\gui\mods например C:\Games\World_of_Tanks\res_mods\0.9.14.1\scripts\client\gui\mods 5 запустите танчики и оно должно начать работать работа примера заключается в том что в файл C:\Games\python.log будет напечатана строка INFO: Hello world Ура! тоесть когда танчики запускаются, происходит исполнение мода mod_hello.pyс печатается строка, которая попадает в лог -------------------------- ну а дальше пример mod_hello.py надо усложнять, наворачивать, добавлять всякие нужные команды.. исходный пример содержит код, который выполнится один раз при запуске танчиков. что как бы не очень полезно. когда в игре происходит какое нибудь событие, оно вызывает стандартную функцию. эту стандартную функцию можно перенаправить, чтобы выполнялся Нужный Код. вот тут есть хороший пример http://www.koreanrandom.com/forum/topic/31287-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2-%D0%B1%D0%BE%D1%8F/ краткие пояснения: - когда танчики стартуют, мод запускается. - создается функция BF_new_afterCreate - внизу две строчки производят перенаправление стандартной функции Battle.afterCreate на Свою Написанную функцию BF_new_afterCreate - теперь когда начинается Бой, оно всегда начинает вызывать функцию BF_new_afterCreate - оригинальная стандартная функция сохранена в BF_orig_afterCreate, - новая написанная функция вызывает стандартную - потом она делает то что нам нужно вообщем разработка мода состоит в том чтобы узнать какую функцию перехватывать и натулить туда своего кода, который делает чо то полезное. --------------- ОШИБКИ Если в тексте мода будут всякие ошибки, то танчики могут воще не запустицца, а в файле C:\Games\python.log будут всякие сообщения об ошибках что то типо ERROR: [EXCEPTION] (scripts/client/game.py, 184): Traceback (most recent call last): File "scripts/client/game.py", line 155, in init File "scripts/client/gui/shared/personality.py", line 329, in init File "scripts/client/gui/mods/__init__.py", line 17, in init File "scripts/client/gui/mods/__init__.py", line 64, in _findValidMODs File "scripts/common/Lib/importlib/__init__.py", line 37, in import_module File "stata1", line 24, in <module> AttributeError: 'NoneType' object has no attribute 'arena' --------------------------------- усложняем КАК НАПИСАТЬ СВОЙ МОД ОЛЕНЕМЕР берем за основу http://www.koreanrandom.com/forum/topic/31287-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2-%D0%B1%D0%BE%D1%8F/ итак, когда танчики стартуют, происходит подмена функции Battle.afterCreate теперь во время начала каждой битвы будет вызывацца наш код из BF_new_afterCreate глобальный объект BigWorld.player().arena.vehicles.values() содержит список всех участников боя. перебираем список. pl['name'] даст нам имя игрока pl['accountDBID'] даст нам ID игрока в базе каргаминга например игрок warboss86 имеет ID 1008410489 шлем http запрос на ссайт варгаминга http://worldoftanks.com/en/community/accounts/[ID игрока]-[имя игрока] например http://worldoftanks.com/en/community/accounts/1008410489-warboss86 парсим полученный html table class="t-personal-data и видим что он полное днище - процент побед 46.95% и так узнаем данные всех остальных игроков из боя. сохраняем этот список позора и унижения. в моде также надо переопределить вывод игроков. это функция ..... [скоро допишу] програмируем код, чтобы вместо [ИмяИгрока - имя танчика] печаталось [ИмяИгрока - %побед% имя танчика] %побед% мы будем брать из сохраненного списка ------------- вот так все просто ------------
  22. 1. Нужно ставить в клиент серверную часть, чтобы игровой клиент мог принимать подключения от Sublime. 2. Клиентскую часть на Sublime, как я понял, ты уже развернул, раз меню появилось. 3. У Sublime есть своя внутренняя консоль, вызывается через Ctrl+~, ЕМНИП. Если что-то в плагине идет не так - там будут логи. 4. Не нужно брать сходу скрипты. Тестируется все довольно просто. 4.1. Коннектимся к клиенту. Состояние не важно, главное чтобы он прогрузился. 4.2. Открываем в Sublime лог-файл или лог-панель. Там должен появиться весь лог, если параметр fetch_logs включен (ЕМНИП он включен по дефолту). 4.3. Создаем пустой файлик, где мы будем писать наш скрипт. Пишем туда что-то типа "print 'Hello world!'". 4.4. Запускаем это дело. В лог-файле/лог-панели должна появиться строка "Hello world!". 4.5. PROFIT. 5. Некоторые скрипты интегрируются в клиент на стадии загрузки, поэтому их запуск через терминал без ручной интеграции (контролируемая интеграция) невозможен. 6. Из пункта 5 следует, что терминал используется для отладки модулей с использованием их ручной интеграции или проверки работоспособности каких-то кусков кода. Готовые скрипты следует отлаживать уже нормальным методом (устанавливать как мод). В последствии (если скрипт такое нормально воспримет) можно управлять состоянием этого скрипта через терминал, как и любым другим модулем картофана или пользовательским модом. Если конечно вы знаете, что надо делать.
  23. Все отображает спасибо Только text = urlopen('Hello World').read() заменил на return self.flashObject.as_setText('<font color="#FFFFFF">Hello World</font>')
  24. Есть способы защиты, которые сводятся к тому, что для того, чтобы декомпилировать надо потратить.. год (на самый простой скрипт). В целом - "недекомпилируемым кодом" можно назвать такой код, затраты на декомпиляцию которого больше чем затраты на создание с нуля оригинального кода (как человеко-часы, так и финансовые). Для примера http://dropmefiles.com/dYmbg Исходник: print 'Hello World!' LOAD_CONST 'Hello World!' PRINT_ITEM PRINT_NEWLINE LOAD_CONST None RETURN_VALUE попытайся декомпилировать..;) Можно назвать этот скрипт недекомпилируемым? А некоторые защиты основываются на дозагрузке некоторой части скрипта (примерно как это реализовано в варпаке)..
  25. @ribbed парсеру очень плохо от чего-то более сложного, чем hello world Markdown Рендер в Typora ansel_typora.pdf Рендер в wgmods https://wgmods.net/1942/
×
×
  • Create New...