C.M. 62 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 Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #352404 Posted September 9, 2016 Корабли не нужны никому. 2 4 Quote Share this post Link to post Short link Share on other sites
yinx2002 0 #540170 Posted February 28 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 Share this post Link to post Short link Share on other sites