Jump to content
Korean Random
denis79513

Отправка личных сообщений, создание взвода/роты

Recommended Posts

>Вы имели в виду onAccountShowGUI и onAccountBecomeNonPlayer?

Нет именно:

onAccountShowGUI - событие когда в ангаре

onAvatarBecomePlayer - событие когда в бою

 

 

Если под процессом имеется ввиду поток тогда

 

import threading
from PlayerEvents import g_playerEvents

class Controller:
    
    def __init__(self):
        self.__available = threading.Event()
        self.__available.clear()
        self.__thread = threading.Thread(target=self.__mainLoop)
        self.__thread.setDaemon(True)
        self.__thread.start()
        g_playerEvents.onAccountBecomePlayer += self.__onAccountBecomePlayer
        g_playerEvents.onAccountBecomeNonPlayer += self.__onAccountBecomeNonPlayer
        
    def __mainLoop(self):
        while True:
            self.__available.wait()
            # This code works only when the player is PlayerAccount
    
    def __onAccountBecomePlayer(self):
        self.__available.set()
        
    def __onAccountBecomeNonPlayer(self):
        self.__available.clear()

g_ctrl = Controller()
 

 

Либо функциональная реализация

import threading
from PlayerEvents import g_playerEvents

def mainLoop():
    while True:
        available.wait()
        # This code works only when the player is PlayerAccount

def onAccountBecomePlayer():
    available.set()
    
def onAccountBecomeNonPlayer():
    available.clear()

available = threading.Event()
available.clear()

thread = threading.Thread(target=mainLoop)
thread.setDaemon(True)
thread.start()

g_playerEvents.onAccountBecomePlayer += onAccountBecomePlayer
g_playerEvents.onAccountBecomeNonPlayer += onAccountBecomeNonPlayer

 

Отлично, собрал из этого то, что нужно, спасибо) 

А как насчет события выхода из игры? 

 

 

UPD: Нашел connectionManager.onDisconnected, в принципе мне подходит и его юзаю, но в нем уже недоступен BigWorld.player(),  я так понимаю в этот момент он уже уничтожился.

Может есть какое событие до connectionManager.onDisconnected в котором player еще существует?

Edited by denis79513

Share this post


Link to post

Short link
Share on other sites

>но в нем уже недоступен BigWorld.player()

А зачем его там запрашивать? При первом запуске сохранил, при отключении сбросил и все.

 

>А как насчет события выхода из игры?

Можно использовать def fini(): в корне скрипта

Вот тебе пища для ума: ;-)

from PlayerEvents import g_playerEvents
from ConnectionManager import connectionManager

def init():
	connectionManager.onConnected += Connected
	connectionManager.onDisconnected += Disconnected
	test = TestEvents()
	print '*   Main. Init'

def fini():
	print '*   Main. Fini'

def Connected():
	print '*   Main. Подключение к серверу'

def Disconnected():
	print '*   Main. Отключение от сервера'
	
def onAccountBecomePlayer():
	print '*   Main. Подготовка ко входу в ангар'

def onAccountShowGUI(ctx):
	print '*   Main. Игрок в ангаре'

def onAccountBecomeNonPlayer():
	print '*   Main. Игрок вышел из ангара'

def onAvatarBecomePlayer():
	print '*   Main. Игрок в бою'

print '*   Tестовый мод загружен'

class TestEvents():
	def __init__(self):
		g_playerEvents.onAccountShowGUI += self.onAccountShowGUI
		g_playerEvents.onAccountBecomePlayer += self.onAccountBecomePlayer
		g_playerEvents.onAccountBecomeNonPlayer += self.onAccountBecomeNonPlayer
		g_playerEvents.onAvatarBecomeNonPlayer += self.onAvatarBecomeNonPlayer
		g_playerEvents.onBattleResultsReceived += self.onReceiveBattleResult
		print '*   TestEvents. Init'

	def onAccountBecomePlayer(self):
		print '*   TestEvents. Подготовка ко входу в ангар'

	def onAccountShowGUI(self, ctx):
		print '*   TestEvents. Игрок в ангаре'

	def onAccountBecomeNonPlayer(self):
		print '*   TestEvents. Игрок вышел из ангара'

	def onAvatarBecomePlayer(self):
		print '*   TestEvents. Игрок в бою'

	def onAvatarBecomeNonPlayer(self):
		print '*   TestEvents. Игрок вышел из боя'

	def onReceiveBattleResult(self, isActiveVehicle, results):
		print '*   TestEvents. Результаты боя получены'

Edited by ShuraBB
  • 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

>я смог как-то проверять состоит ли игрок в каком то формировании или нет

В бою:

from gui.battle_control import g_sessionProvider

AccountID = BigWorld.player().databaseID

g_sessionProvider.getCtx().isSquadMan(accID=AccountID)

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

Если под процессом имеется ввиду поток тогда

 

import threading
from PlayerEvents import g_playerEvents

class Controller:
    
    def __init__(self):
        self.__available = threading.Event()
        self.__available.clear()
        self.__thread = threading.Thread(target=self.__mainLoop)
        self.__thread.setDaemon(True)
        self.__thread.start()
        g_playerEvents.onAccountBecomePlayer += self.__onAccountBecomePlayer
        g_playerEvents.onAccountBecomeNonPlayer += self.__onAccountBecomeNonPlayer
        
    def __mainLoop(self):
        while True:
            self.__available.wait()
            # This code works only when the player is PlayerAccount
    
    def __onAccountBecomePlayer(self):
        self.__available.set()
        
    def __onAccountBecomeNonPlayer(self):
        self.__available.clear()

g_ctrl = Controller()
 

 

Либо функциональная реализация

import threading
from PlayerEvents import g_playerEvents

def mainLoop():
    while True:
        available.wait()
        # This code works only when the player is PlayerAccount

def onAccountBecomePlayer():
    available.set()
    
def onAccountBecomeNonPlayer():
    available.clear()

available = threading.Event()
available.clear()

thread = threading.Thread(target=mainLoop)
thread.setDaemon(True)
thread.start()

g_playerEvents.onAccountBecomePlayer += onAccountBecomePlayer
g_playerEvents.onAccountBecomeNonPlayer += onAccountBecomeNonPlayer

 

 

Вы тут немного перепутали с событиями. available.set() устанавливает флаг в true, что значит, что available.wait() начинает ждать пока available не станет false.

 

Делаю так:

def mainLoop():
    while True:
        available.wait()
        #do_something

def inHangar(self):
    available.clear()

def inBattle():
    available.set()

available = threading.Event()

thread = threading.Thread(target=mainLoop)
thread.setDaemon(True)
available.set()
thread.start()

g_playerEvents.onAccountShowGUI += inHangar
g_playerEvents.onAvatarBecomePlayer += inBattle

Но все равно что-то не так работает, цикл не повторяется

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

>available.set() устанавливает флаг в true, что значит, что available.wait() начинает ждать пока available не станет false

.wait() выходит из состояния ожидания когда происходит .set() и "засыпает" когда .clear()

Тебе-же нужно было чтобы работало в ангаре? 

Многопоточные вычисления.pdf

Share this post


Link to post

Short link
Share on other sites

>available.set() устанавливает флаг в true, что значит, что available.wait() начинает ждать пока available не станет false

.wait() выходит из состояния ожидания когда происходит .set() и "засыпает" когда .clear()

Тебе-же нужно было чтобы работало в ангаре? 

 

Ок, читал англоязычный вариант, не так перевел, пасиб

Share this post


Link to post

Short link
Share on other sites

>available.set() устанавливает флаг в true, что значит, что available.wait() начинает ждать пока available не станет false

.wait() выходит из состояния ожидания когда происходит .set() и "засыпает" когда .clear()

Тебе-же нужно было чтобы работало в ангаре? 

 

 

Смотрите, я вызываю available.set() при событии events.GUICommonEvent.LOBBY_VIEW_LOADED, при этом после available.wait() ставлю задержку на 10 секунд:

def mainLoop():
    while True:
        available.wait()
        time.sleep(10)
        ....

Но когда ангар прогрузился, код уже выполнился, значит и events.GUICommonEvent.LOBBY_VIEW_LOADED и onAccountShowGUI срабатывают до прогрузки ангара, что придумать? 

Share this post


Link to post

Short link
Share on other sites

g_playerEvents.onAccountShowGUI срабатывает в самом начале загрузки ангара, просто onAccountShowGUI - когда ангар загружен полностью.

Что ты вообще пытаешься делать?

Share this post


Link to post

Short link
Share on other sites

g_playerEvents.onAccountShowGUI срабатывает в самом начале загрузки ангара, просто onAccountShowGUI - когда ангар загружен полностью.

Что ты вообще пытаешься делать?

 

Решил проблему. Осталось последнее, насчет SystemMessages.pushMessage().

Как сделать, чтобы сообщение появлялось один раз при входе в игру и все время висело зафиксированным внизу после всех уведомлений? Ну по идее можно его добавлять каждый раз при входе в ангар но тогда много копий, к чему этот мусор. 

И второй вопрос, если в текст pushMessage вставить ссылку <a href=""></a> почему она не работает?

Edited by denis79513

Share this post


Link to post

Short link
Share on other sites

тут еще много интересного

 

Просто ссылка типа <a href='URL'> генерит обычное событие с именем 'URL' Которое нужно скормить своему обработчику событий.

Edited by ShuraBB
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Ребятки, хелп в 9.17 перестало работать

prbDispatcher = g_prbLoader.getDispatcher()
prbDispatcher.doSelectAction(PrbAction(actionName=PREBATTLE_ACTION_NAME.SQUAD), callback=test)

Ошибок не возникает, но взвод не создается.

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


Что-то нарыл, вот так в 9.17 можно отправить приглашения, но вот взвод создавать ни в какую не хочет(

entity = prbDispatcher.getEntity()
entity.request(SendInvitesCtx([73730118], "Message"))

Share this post


Link to post

Short link
Share on other sites

Товарищи, хотел сделать автоматическое принятие приглашений, не подскажете какое событие возникает, когда приходит приглашение во взвод, а также интересует событие, когда все игроки взвода готовы, подскажете куда копать ну или ткните носом)

Share this post


Link to post

Short link
Share on other sites
from gui.prb_control.entities.base.ctx import PrbAction
from gui.prb_control.dispatcher import g_prbLoader
from gui.battle_control.requests.context import SendInvitesCtx
from gui.prb_control.settings import PREBATTLE_ACTION_NAME
from adisp import process
import BigWorld

def sendInvites(accountsToInvite):
    dispatcher = g_prbLoader.getDispatcher()
    entity = None
    if dispatcher is not None:
        entity = dispatcher.getEntity()       
    entity.request(SendInvitesCtx(accountsToInvite), '')
    
    
@process
def doSelect(prebattelActionName):
    yield g_prbLoader.getDispatcher().doSelectAction(PrbAction(prebattelActionName))
    sendInvites([30287518])
       

doSelect(PREBATTLE_ACTION_NAME.SQUAD)

почему выходит ошибка

[ERROR] (scripts/client/gui/prb_control/entities/base/unit/entity.py, 455): Handler not found (SendInvitesCtx(ids = [30287518], comment = , waitingID = , requestType = 1),)

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...