Jump to content
Korean Random

Прошу помощи по Account.onBecomePlayer и PlayerAvatar.onEnterWorld


Megagrob

Recommended Posts

Ребята, вообщем у меня есть парочка проблем с событием входа в ангар и в бой.

По событию Account.onBecomePlayer получаю список друзей и игнора:

    usersStorage = storage.storage_getter('users')
    for user in usersStorage().all():
        if 'friend' in user.getTags():
            friends_list.append(user.getName());
            if user.isOnline():
                friends_present.append(user.getFullName())
        if 'muted' in user.getTags() or 'ignored' in user.getTags():
            ignore_list.append(user.getName());
            if user.isOnline():
                ignore_present.append(user.getFullName());

потом вывожу в системный канал сообщением.

Проблема в том что по первому входу в ангар список пуст. По второму, выходу, в ангар уже всё норм.

Так же если запускать эту часть кода отдельно, не по событию, но когда ангар полностью прогрузился, опять же всё норм.

Может рано срабатывает мой скрипт, когда список контактов ещё пуст?

 

Вторая проблема: Хочу вывести текст с помощью GUI.Text в начале боя, как только прогрузилась карта.

Обрабатываю PlayerAvatar.onEnterWorld:

pre_onEnterWorld = PlayerAvatar.onEnterWorld
def my_onEnterWorld(self, prereqs):
    pre_onEnterWorld(self, prereqs)
    .....
PlayerAvatar.onEnterWorld = my_onEnterWorld

как-бы работает, но текст у меня появляется ещё раньше, в окне загрузки BattleLoading, на последних секундах загрузки.

Ткните неуча лицом в код...

Edited by Megagrob
Link to comment
Short link
Share on other sites

насчет второго используй

from constants import ARENA_PERIOD # смотреть в scripts/common/constants
from Avatar import PlayerAvatar

def New_onArenaPeriodChange(self, period, periodEndTime, periodLength, periodAdditionalInfo):
    Old_onArenaPeriodChange(self, period, periodEndTime, periodLength, periodAdditionalInfo)
    if period == ARENA_PERIOD.PREBATTLE:
        print 'перед началом боя'


Old_onArenaPeriodChange = PlayerAvatar._PlayerAvatar__onArenaPeriodChange
PlayerAvatar._PlayerAvatar__onArenaPeriodChange = New_onArenaPeriodChange

дальше просто ставь callback на завершения GUI

Edited by Dark_Knight_MiX
  • Upvote 1
Link to comment
Short link
Share on other sites

Проблема в том что по первому входу в ангар список пуст. По второму, выходу, в ангар уже всё норм.

Может рано срабатывает мой скрипт, когда список контактов ещё пуст?

Скорее всего.

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

import BigWorld
from gui.prb_control.events_dispatcher import EventDispatcher

_Old_LoadHangar = EventDispatcher.loadHangar

def MyFunc(self):
    _Old_LoadHangar(self)
    ##
    ##
    ##

EventDispatcher.loadHangar = MyFunc

Не проверял, но, возможно, поможет.

Edited by Kotyarko_O
  • Upvote 1
Link to comment
Short link
Share on other sites

насчет первого может это подойдет

from gui.Scaleform.daapi.view.lobby.LobbyView import LobbyView
def NewLobbyView_populate(self):
     OldLobbyView_populate(self)
     # код

OldLobbyView_populate = LobbyView._populate
LobbyView._populate = NewLobbyView_populate

или

from gui.shared.utils.HangarSpace import _HangarSpace as HangarSpace
def New_HangarSpace(self):
     Old_HangarSpace(self)


HangarSpace = HangarSpace._HangarSpace__spaceDone
HangarSpace._HangarSpace__spaceDone = New_HangarSpace

или

from gui.Scaleform.daapi.view.lobby.hangar.Hangar import Hangar
def New_Hangar__updateAll(self):
     Old_Hangar__updateAll(self)


Old_Hangar__updateAll = Hangar._Hangar__updateAll
Hangar._Hangar__updateAll = New_Hangar__updateAll
  • Upvote 1
Link to comment
Short link
Share on other sites

import BigWorld
from gui.prb_control.events_dispatcher import EventDispatcher

_Old_LoadHangar = EventDispatcher.loadHangar

def MyFunc(self):
    _Old_LoadHangar(self)
    ##
    ##
    ##

EventDispatcher.loadHangar = MyFunc
from gui.Scaleform.daapi.view.lobby.LobbyView import LobbyView
def NewLobbyView_populate(self):
     OldLobbyView_populate(self)
     # код

OldLobbyView_populate = LobbyView._populate
LobbyView._populate = NewLobbyView_populate
from gui.Scaleform.daapi.view.lobby.hangar.Hangar import Hangar
def New_Hangar__updateAll(self):
     Old_Hangar__updateAll(self)


Old_Hangar__updateAll = Hangar._Hangar__updateAll
Hangar._Hangar__updateAll = New_Hangar__updateAll

Помогло. Эти варианты сработали. И при первом заходе и при последующих.

Спасибо!

Link to comment
Short link
Share on other sites

Почему не используешь onAccountShowGUI ?
Его можно аж 2мя способами использовать:

На прямую:
def onAccountShowGUI(ctx):
    print 'onAccountShowGUI'


Или через PlayerEvents:

from PlayerEvents import g_playerEvents
g_playerEvents.onAccountShowGUI += new_onAccountShowGUI

def new_onAccountShowGUI(ctx):
    print 'onAccountShowGUI'

Edited by ShuraBB
  • Upvote 1
Link to comment
Short link
Share on other sites

Почему не используешь onAccountShowGUI ?

Его можно аж 2мя способами использовать:

 

На прямую:

def onAccountShowGUI(ctx):

    print 'onAccountShowGUI'

 

 

Или через PlayerEvents:

 

from PlayerEvents import g_playerEvents

g_playerEvents.onAccountShowGUI += new_onAccountShowGUI

 

def new_onAccountShowGUI(ctx):

    print 'onAccountShowGUI'

3 способа выше тоже самое считай

да и вообще способов много

Link to comment
Short link
Share on other sites

@Megagrob, ,

У класса PlayerAvatar и PlayerAccount есть одинаковые методы.

__init__ - инициализация классов. Тут все понятно. Если включить лог в дебаг-режим, там будет сообщение.

onBecomePlayer - скорее всего выполняется когда экземпляр класса (объект) становится значением BigWorld.player(). Это событие, ЕМНИП и НЯП, происходит еще до начала загрузки соответствующего спейса или одновременно с ним.

onBecomeNonPlayer - обратное событие.

 

PlayerAvatar.onEnterWorld - игрок попал в "мир". Техника ЕМНИП прогружается позже. Это можно посмотреть в логе в дебаг-режиме.

PlayerAvatar.onLeaveWorld - обратное событие.

 

Часть методов классов PlayerAvatar и PlayerAccount вызываются из С, НЯП, поскольку их вызовов в питоне не находил.

Вешать на эти методы отображение GUI не стоит. Его лучше вешать на загрузку боевого/ангарного интерфейса, точнее на его показ (populate). Так сказать "подобное к подобному".

Одна из ключевых оптимизаций картохи за последнее время - они ускорили загрузку боя и интерфейса ... путем того что он стал грузиться не полностью сразу, а поэтапно. А загрузочный экран, как я понял, пропадает, когда загрузится боевая флешка, ему на замену. Ну все заметили, что иногда компоненты на экране появляются не сразу, а поочередно. Тут хрен разберешься, если честно, столько ненужного кода наворотили... Как будто платят разрабам "построчно".

  • Upvote 1
Link to comment
Short link
Share on other sites

тут то норм все, ошибок с GUI не должно быть

Если этот метод напрямую управляет GUI - то да, все должно быть ок. Я не использовал его пока, но смысл в принципе понятен. Но лично я повесил бы куда-нибудь на gui.Scaleform.Battle.Battle.afterCreate пост-скриптом (в смысле сначала оригинал, потом мой код). По крайней мере, это первое место, куда я попробовал бы запихнуть инициализацию GUI.
Link to comment
Short link
Share on other sites

Если этот метод напрямую управляет GUI - то да, все должно быть ок. Я не использовал его пока, но смысл в принципе понятен. Но лично я повесил бы куда-нибудь на gui.Scaleform.Battle.Battle.afterCreate пост-скриптом (в смысле сначала оригинал, потом мой код). По крайней мере, это первое место, куда я попробовал бы запихнуть инициализацию GUI.

да я сам так использую, а автору темы подходит выше вариант, если только перед началом боя использовать

Link to comment
Short link
Share on other sites

да я сам так использую, а автору темы подходит выше вариант, если только перед началом боя использовать

Короче, вариантов как грязи после ливня.
Link to comment
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...