Megagrob Posted January 28, 2016 Share Posted January 28, 2016 (edited) Ребята, вообщем у меня есть парочка проблем с событием входа в ангар и в бой. По событию 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 January 28, 2016 by Megagrob @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted January 28, 2016 Share Posted January 28, 2016 (edited) насчет второго используй 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 January 28, 2016 by Dark_Knight_MiX 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted January 28, 2016 Author Share Posted January 28, 2016 (edited) Dark_Knight_MiX, спасибо, помогло. Осталась первая проблема, по первичному входу в ангар Edited January 28, 2016 by Megagrob @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted January 28, 2016 Share Posted January 28, 2016 (edited) Проблема в том что по первому входу в ангар список пуст. По второму, выходу, в ангар уже всё норм.Может рано срабатывает мой скрипт, когда список контактов ещё пуст? Скорее всего. Попробуйте выполнять эти действия в момент загрузки ангара. Пример: import BigWorld from gui.prb_control.events_dispatcher import EventDispatcher _Old_LoadHangar = EventDispatcher.loadHangar def MyFunc(self): _Old_LoadHangar(self) ## ## ## EventDispatcher.loadHangar = MyFunc Не проверял, но, возможно, поможет. Edited January 28, 2016 by Kotyarko_O 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted January 28, 2016 Share Posted January 28, 2016 насчет первого может это подойдет 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 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted January 28, 2016 Author Share Posted January 28, 2016 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 Помогло. Эти варианты сработали. И при первом заходе и при последующих. Спасибо! @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted January 28, 2016 Share Posted January 28, 2016 мог и поискать, тут вон показано http://www.koreanrandom.com/forum/topic/25562-blacklist/?p=280783 @ Quote Link to comment Short link Share on other sites More sharing options...
ShuraBB Posted January 31, 2016 Share Posted January 31, 2016 (edited) Почему не используешь onAccountShowGUI ?Его можно аж 2мя способами использовать:На прямую:def onAccountShowGUI(ctx): print 'onAccountShowGUI'Или через PlayerEvents:from PlayerEvents import g_playerEventsg_playerEvents.onAccountShowGUI += new_onAccountShowGUIdef new_onAccountShowGUI(ctx): print 'onAccountShowGUI' Edited January 31, 2016 by ShuraBB 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted January 31, 2016 Share Posted January 31, 2016 Почему не используешь 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 способа выше тоже самое считай да и вообще способов много @ Quote Link to comment Short link Share on other sites More sharing options...
ShuraBB Posted January 31, 2016 Share Posted January 31, 2016 (edited) Так onAccountShowGUI для этого как раз и сделаноСмотри, проще и короче IMHO никак не получится ;-) Edited January 31, 2016 by ShuraBB @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted January 31, 2016 Share Posted January 31, 2016 Так onAccountShowGUI для этого как раз и сделано Смотри, проще и короче IMHO никак не получится ;-) простота не мое @ Quote Link to comment Short link Share on other sites More sharing options...
ShuraBB Posted January 31, 2016 Share Posted January 31, 2016 :-)))) @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted February 1, 2016 Share Posted February 1, 2016 @Megagrob, , У класса PlayerAvatar и PlayerAccount есть одинаковые методы. __init__ - инициализация классов. Тут все понятно. Если включить лог в дебаг-режим, там будет сообщение. onBecomePlayer - скорее всего выполняется когда экземпляр класса (объект) становится значением BigWorld.player(). Это событие, ЕМНИП и НЯП, происходит еще до начала загрузки соответствующего спейса или одновременно с ним. onBecomeNonPlayer - обратное событие. PlayerAvatar.onEnterWorld - игрок попал в "мир". Техника ЕМНИП прогружается позже. Это можно посмотреть в логе в дебаг-режиме. PlayerAvatar.onLeaveWorld - обратное событие. Часть методов классов PlayerAvatar и PlayerAccount вызываются из С, НЯП, поскольку их вызовов в питоне не находил. Вешать на эти методы отображение GUI не стоит. Его лучше вешать на загрузку боевого/ангарного интерфейса, точнее на его показ (populate). Так сказать "подобное к подобному". Одна из ключевых оптимизаций картохи за последнее время - они ускорили загрузку боя и интерфейса ... путем того что он стал грузиться не полностью сразу, а поэтапно. А загрузочный экран, как я понял, пропадает, когда загрузится боевая флешка, ему на замену. Ну все заметили, что иногда компоненты на экране появляются не сразу, а поочередно. Тут хрен разберешься, если честно, столько ненужного кода наворотили... Как будто платят разрабам "построчно". 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted February 1, 2016 Share Posted February 1, 2016 http://www.koreanrandom.com/forum/topic/29604-прошу-помощи-по-accountonbecomeplayer-и-playeravataronenterworld/?p=311244 @GPCracker тут то норм все, ошибок с GUI не должно быть @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted February 1, 2016 Share Posted February 1, 2016 тут то норм все, ошибок с GUI не должно бытьЕсли этот метод напрямую управляет GUI - то да, все должно быть ок. Я не использовал его пока, но смысл в принципе понятен. Но лично я повесил бы куда-нибудь на gui.Scaleform.Battle.Battle.afterCreate пост-скриптом (в смысле сначала оригинал, потом мой код). По крайней мере, это первое место, куда я попробовал бы запихнуть инициализацию GUI. @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted February 1, 2016 Share Posted February 1, 2016 Если этот метод напрямую управляет GUI - то да, все должно быть ок. Я не использовал его пока, но смысл в принципе понятен. Но лично я повесил бы куда-нибудь на gui.Scaleform.Battle.Battle.afterCreate пост-скриптом (в смысле сначала оригинал, потом мой код). По крайней мере, это первое место, куда я попробовал бы запихнуть инициализацию GUI. да я сам так использую, а автору темы подходит выше вариант, если только перед началом боя использовать @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted February 1, 2016 Share Posted February 1, 2016 да я сам так использую, а автору темы подходит выше вариант, если только перед началом боя использоватьКороче, вариантов как грязи после ливня. @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted February 1, 2016 Share Posted February 1, 2016 Короче, вариантов как грязи после ливня. ага @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.