Перейти к содержимому

Фото

API для модов (WoWS ModsAPI)


  • Чтобы отвечать, сперва войдите на форум
1 ответ в теме

#1 C.M.

C.M.

    Content Manager

  • Content Manager
  • 12 783 сообщений

Опубликовано 08 Сентябрь 2016 - 23:05

Разработчики опубликовали первую информацию по API для модов в World of Warships.
 

Это сообщение будет редактироваться и дополняться по мере поступления информации

 
Содержание:
 
Введение, общее описание API для модов

Flash API

Python API

Введение, общее описание API для модов
 
ModsAPI - это Sandbox, максимально изолированный от остальных частей клиента, но работающий на тех же технологиях, что и другие части.
ModsAPI Flash и ModsAPI Python - две части API, которые могут работать независимо друг от друга. Каждая из них выполняет роль загрузчика модификации, а так же предоставляет доступ к данным клиента и функциям управления им.
Общая изолированность API, а также примененные технологии позволяют "на лету" загружать и выгружать моды. ModsAPI устроен таким образом, что ошибки в модах ни коим образом не сказываются на общей работоспособности клиента(громкое заявление - прим. рекдактора)

PythonAPI обеспечивает загрузку/выгрузку кода модиификации, написанной на языке Python, а так же перечень функций для получения данных из клиента и взаимодействия с FlashAPI.

FlashAPI обеспечивает загрузку/выгрузку на изолированную сцену модификации, написанной на ActionScript 3, а так же перечень функций для взаимодействия с Flash-сценой и PythonAPI.
 
Прикрепленный файл  ModsAPI Scheme.png   17,7 Кб   2 раз скачано

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":
 
Прикрепленный файл  1.png   18,41 Кб   2 раз скачано
 
Теперь в папке "HelloWorld" создадим пустой файл "Main.py", откроем его в любом редакторе и напишем следующее:
 

API_VERSION = 'API_v1.0'

print 'Hello World!'

Прикрепленный файл  2.png   2,77 Кб   3 раз скачано
 
Запустим клиент, дождемся его загрузки и после этого закроем его. Откроем файл "python.log", в нем увидим примерно следующее:
 
Прикрепленный файл  3.png   4 Кб   3 раз скачано
 
Итак, наш первый мод готов и работает!
 
ModsAPI Flash HelloWorld
 
Для создания Flash-части мода нам понадобится Flash IDE. Это может быть "Adobe Flash Professional" или "FlashDevelop".
Создадим пустой AS3 проект и в зависимости от выбранной IDE добавим к проекту внешнюю SWC-библиотеку, актуальную версию которой можно взять из ModsSDK: https://share.wargam...t/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);
        }
    }
}

Запустим клиент и убедимся, что он работает:
 
Прикрепленный файл  4.png   563,63 Кб   4 раз скачано
 
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
Доступные методы:

  • callbacks
    • callbacks.perTick(func)
    • callbacks.callback(dt, func, *args, **kw)
    • callbacks.cancel(handle)
  • events
    • events.onFlashReady
    • events.onSFMEvent
    • events.onReceiveShellInfo
    • events.onBattleStarted
    • events.onBattleQuit
  • flash
    • flash.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()
  • customPorts
    • customPorts.addCustomPort(portName, portDisplayName = 'Персональный', isPremium = False, peculiarities = None)
    • customPorts.removeCustomPort(portName)
  • contentSDK
    • contentSDK.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 - зарезервированный аргумент. На данный момент равен True

flash (описание)

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 - имя, идентификатор загруженного порта

Изменено: C.M., 08 Сентябрь 2016 - 23:17

  • 5

#2 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 545 сообщений
  • Nick: SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 09 Сентябрь 2016 - 23:59

Корабли не нужны никому.
  • -2





0 пользователей читают эту тему

0 зарегистрированных, 0 гостей, 0 невидимых

© Mr 13