Jump to content
Korean Random
Yupi

[HOWTO] Как сделать свой мод на XFW

Recommended Posts

С чего начать днищу, которое никогда не делало моды, но хочет сделать с XFW?

 

Например идея для мода такая:

 

Когда бой закончился автоматически создаётся канал чата. Все кто был в бою попадают в этот канал. Типа канал послебоевого чата.

 

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

 

Дискасс!))

Edited by Mixaill
  • Upvote 5
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Сначала надо найти точку входа - метод, который вызывается в нужный тебе момент. Затем вешаешь на него событие через @registerEvent, или переопределяешь метод через @overrideMethod, в зависимости от того, нужно ли тебе менять поведение оригинального метода, или достаточно просто выполнить по событию свой код.

Далее уже делаешь реализацию своей логики.

В качестве примеров лучше всего смотреть на готовые реализации тут.

Например, autologon:

 

Обязательный блок с информацией о моде

""" XVM (c) www.modxvm.com 2013-2015 """
#####################################################################
# MOD INFO
XFW_MOD_INFO = {
    # mandatory
    'VERSION':       '3.1.0',
    'URL':           'http://www.modxvm.com/',
    'UPDATE_URL':    'http://www.modxvm.com/en/download-xvm/',
    'GAME_VERSIONS': ['0.9.9','0.9.10'],
    # optional
}
#####################################################################
imports

# imports
import traceback
import BigWorld

from gui.Scaleform.daapi.view.IntroPage import IntroPage

from gui.Scaleform.daapi.view.login import LoginView
from xfw import *
from xvm_main.python.logger import *

import xvm_main.python.config as config


Далее идут обработчики событий:

 

1. переопределяем метод IntroPage._IntroPage__showMovie - метод вызывается при начале проигрывания вступительной заставки. В нем мы проверяем опцию конфига 'login/skipIntro', и останавливаем видео при значении True

первый аргумент - ссылка на оригинальный метод

firsttime = True
@overrideMethod(IntroPage, '_IntroPage__showMovie')
def IntroPage_showMovie(base, self, movie):
    if config.get('login/skipIntro'):
        BigWorld.callback(0, self.stopVideo)
    return base(self, movie)
2. вешаем событие на метод LoginView.onSetOptions. Событие вызывается после вызова метода, так как аргумент декоратора prepend не указан, и равен по умолчанию False. В этом методе мы проверяем опцию 'login/autologin', и делаем автологин, если она установлена.

@registerEvent(LoginView, 'onSetOptions')
def LoginView_onSetOptions(self, optionsList, host):
    global firsttime
    if firsttime:
        firsttime = False
        if config.get('login/autologin'):
            BigWorld.callback(0, self.onDoAutoLogin)
3. переопределяем метод LoginView.as_setVersionS, в нем мы дописываем версию XVM к версии WoT на экране логина.

@overrideMethod(LoginView, 'as_setVersionS')
def LoginView_as_setVersionS(base, self, version):
    base(self, '{} | XVM {} (WoT {})'.format(version, config.get('__xvmVersion'), config.get('__wotVersion')))
  • Upvote 13
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

sirmax, напиши еще как правильно скачать XFW и откуда.

Edited by StranikS_Scan
  • Upvote 2
  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

Репозиторий xfw: https://bitbucket.org/XVM/xfw

Уже собранный можно скачать из ночников (колонка XFW), или же создать свой репозиторий на Bitbucket, и к нему подключить XFW как подрепозиторий, как это сделано в XVM. Из ночников проще, но обновлять надо будет вручную. Через сабрепу более удобно, но нужно будет настроить среду для компиляции (дока для XVM, для XFW нужно несколько ее переделать).

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Как найти точку входа? Существует ли список методов с описаниями?

Share this post


Link to post

Short link
Share on other sites

Как найти точку входа? Существует ли список методов с описаниями?

 

Это питон, там рулят импорты, эвенты и хуки. Достаточно изучить исходники в репозитарии на предметов, какие модули можно импортировать и что в них есть. К каким эвентам можно цепляться. И какие полезные методы можно хукать.

Share this post


Link to post

Short link
Share on other sites

Это питон, там рулят импорты, эвенты и хуки. Достаточно изучить исходники в репозитарии на предметов, какие модули можно импортировать и что в них есть. К каким эвентам можно цепляться. И какие полезные методы можно хукать.

А как же быть если в примерах никто нужный мне метод не юзал?

 

Спасибо. Инфу по обеим ссылкам уже детально изучил. Но так и не нашел ответ на свой вопрос.

 

Возьмем задачу которую описал ТС. Где искать модуль который отвечает за работу чата?

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Возьмем задачу которую описал ТС. Где искать модуль который отвечает за работу чата?

1. Поиск по слову "messenger" в декомпилированных исходниках, и дальнейшее изучение того, как это реализовано.

Довольно быстро находится класс ClientChat, в котором есть необходимые методы.

 

2. К entrypoint это никак не относится, тут точка входа должна быть по окончании боя. Тут уже есть несколько вариантов, надо для начала определить что нам нужно:

  1. выход в ангар после завершения боя

  2. выход в ангар до завершения боя

  3. окончание боя, после выхода в ангар до завершения боя

в зависимости от этого, нужно искать подходящее событие, или метод.

Share this post


Link to post

Short link
Share on other sites

1. Поиск по слову "messenger" в декомпилированных исходниках, и дальнейшее изучение того, как это реализовано.

Довольно быстро находится класс ClientChat, в котором есть необходимые методы.

 

2. К entrypoint это никак не относится, тут точка входа должна быть по окончании боя. Тут уже есть несколько вариантов, надо для начала определить что нам нужно:

  1. выход в ангар после завершения боя

  2. выход в ангар до завершения боя

  3. окончание боя, после выхода в ангар до завершения боя

в зависимости от этого, нужно искать подходящее событие, или метод.

Здорово. Спасибо!

И немного оффтопный вопрос. Реально ли настроить (переделать) XMQP под свой AMQP (RabbitMQ) сервер? В какую сторону копать?

Edited by STREJlA

Share this post


Link to post

Short link
Share on other sites

День потратил, облазил ClientChat и кучу других исходников.

Так и не получилось вызвать окно чата, такое как создается при вызове контекстного меню -> отправить сообщение

Единственное что получилось найти - BigWorld.player().createPrivate() Однако это не то, что нужно.

И в орионе уже все, что можно изучил. Не понимаю где можно еще искать.

Подскажите плз.

Share this post


Link to post

Short link
Share on other sites

Так и не получилось вызвать окно чата

ClientChat

BigWorld.player().createPrivate()

Абсолютно не там ищешь, если тебе нужно окно. Этот модуль отвечает за низкоуровневую обработку информации, а окно - это высокий уровень уже.

Share this post


Link to post

Short link
Share on other sites

Абсолютно не там ищешь, если тебе нужно окно. Этот модуль отвечает за низкоуровневую обработку информации, а окно - это высокий уровень уже.

Это намек на то, что двигаться нужно в направление gui?

Или же с actions script разбираться?

Share this post


Link to post

Short link
Share on other sites

Это намек на то, что двигаться нужно в направление gui?

Не, все через питон ходит все равно. В AS лезть смысла нет, если ты интерфейсы пилить не собираешься. А вот в обработчики заглянуть стоит.

Share this post


Link to post

Short link
Share on other sites

Не, все через питон ходит все равно. В AS лезть смысла нет, если ты интерфейсы пилить не собираешься. А вот в обработчики заглянуть стоит.

Добрался до \res\scripts\client\messenger\gui\Scaleform\channels

Может в этих дебрях чего найду...

Share this post


Link to post

Short link
Share on other sites

Научился делать всё что угодно, кроме того, что нужно =(

Ну это нормально. Мы тоже хотели сначала чат после боя сделать, а получился XVM... ;-)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Ну это нормально. Мы тоже хотели сначала чат после боя сделать, а получился XVM... ;-)

Смешно. Еще смешнее будет, когда я найду нужный метод и пойму, насколько все было элементарно.

 

А по факту спасайте - я уже реально всё, что можно попробовал.

Share this post


Link to post

Short link
Share on other sites

Ну я вряд ли смогу чем-то помочь, как раз все, что с чатом связано, я не изучал.

Share this post


Link to post

Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...