C.M. Posted September 8, 2016 Share Posted September 8, 2016 (edited) Разработчики опубликовали первую информацию по 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 Методы доступные для потомков класса ModBaseModBase - это базовый класс, который должны наследовать все 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 - имя, идентификатор загруженного порта Edited September 8, 2016 by C.M. 5 @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted September 9, 2016 Share Posted September 9, 2016 Корабли не нужны никому. 3 4 @ Quote Link to comment Short link Share on other sites More sharing options...
yinx2002 Posted February 28, 2024 Share Posted February 28, 2024 I need , look like above document is pretty out of date, the screenshots show the game directory structrure is different than current. I recently has dug into wows mod developing , but cannot find the AS3 swc libary for building the swf file. @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.