Перейти к содержимому
Для публикации в этом разделе необходимо провести 1 боёв.
MedvedevTD

ModsAPI How-To

В этой теме 7 комментариев

Рекомендуемые комментарии

11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

 

В обычном состоянии клиента 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":

4f4acd308e6dfe2edd8b13ae9c40fcd1.png

Теперь в папке "HelloWorld" создадим пустой файл "Main.py", откроем его в любом редакторе и напишем следующее:

API_VERSION = 'API_v1.0'

 

  

 

print 'Hello World!'

d9fd0a757e04c7538c64b47f6b6effc0.png

Запустим клиент, дождемся его загрузки и после этого закроем его. Откроем файл "python.log", в нем увидим примерно следующее:

bcc905b628dbdb78e110c6a6fc8e5876.png

Итак наш первый мод готов и работает!

 

 

  • Плюс 8

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

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
     
    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, border:0px;float:none;margin:0px;padding:0px;vertical-align:baseline;width:auto;font-weight:bold;color:rgb(51,102,153);background:none;">Number):void
        {
            super.updateStage(width, height);
        }
    }
}

 

Изменено пользователем MedvedevTD
  • Плюс 3

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

Напишем наш простой Flash-мод:

 

package
     
    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, border:0px;float:none;margin:0px;padding:0px;vertical-align:baseline;width:auto;font-weight:bold;color:rgb(51,102,153);background:none;">Number):void
        {
            super.updateStage(width, height);
        }
    }
}

Запустим клиент и убедимся, что он работает:

cd81082e2b6c0b474b21166f4e3d898a.png

Поздравляю! Вы создали свой первый мод с использованием ModsAPI.

  • Плюс 3

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

FlashAPI

Методы доступные для потомков класса ModBase:

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 - функция-обработчик коллбека

Примечание:

Функция может быть вызвана без параметров. Таким образом удалятся все коллбеки, на которые был подписан мод.


StageModule

Данный модуль предоставляет моду интерфейс для работы со 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.

  • Плюс 4

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

 

  • 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 - имя, идентификатор загруженного порта
Изменено пользователем MedvedevTD
  • Плюс 4

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

 

Общее описание системы.

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

ModsAPI Flash и ModsAPI Python - две части API, которые могут работать независимо друг от друга. Каждая из них выполняет роль загрузчика модификации, а так же предоставляет доступ к данным клиента и функциям управления им.

Общая изолированность API, а так же примененные технологии позволяют "на лету" загружать и выгружать моды. ModsAPI устроено таким образом, что ошибки в модах ни коим образом не сказываются на общей работоспособности клиента.

4aab58da52729241b843c728ffeaacd8.png

263f09a677a338621f689c4488c3f295.png

ac622e9912cf3415d19799c63f8150bf.png

 

  • Плюс 9

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
11 196
[WG] MedvedevTD
6 491 публикация
6 003 боя

Рассказать о публикации


Ссылка на публикацию
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации новых ответов.

  • Сейчас на странице   0 пользователей

    Эту страницу никто не просматривает.

×