Jump to content
Korean Random
Megagrob

Вывод сообщений в боевой чат

Recommended Posts

Покажите, пожалуйста, как правильно выводить сообщения в боевой чат

Логика примерно такая (код ниже), ну или предложите правильный вариант

import time
from ChatManager import chatManager
from messenger import MessengerEntry
from messenger.gui.Scaleform.channels.bw_chat2 import battle_controllers

def send_message(message, dest = 'my', timewait = 1):
    message = message.encode('utf8', 'xmlcharrefreplace')
    time.sleep(timewait)
    
    if dest == 'team': battle_controllers.TeamChannelController(chatManager.battleTeamChannelID)._broadcast(message) #ChannelID = 0
    elif dest == 'common': battle_controllers.CommonChannelController(chatManager.battleCommonChannelID)._broadcast(message) #ChannelID = 1   
    #elif dest == 'squad': battle_controllers.SquadChannelController(???ChannelID???)._broadcast(message) #ChannelID для взвода == 1???
    elif dest == 'my': MessengerEntry.g_instance.gui.addClientMessage(message)  
    else: MessengerEntry.g_instance.gui.addClientMessage(message)

send_message('hello team', 'team')
send_message('привет', 'common')
send_message('arta - huy u rta!', 'common')

Вообщем идея такова: когда заходим в бой, мод ищет друзей и неадекватов из наших контактов. После отсчёта, нужно выдать в чат друзьям "Привет, <список|имя>", в team или common в зависимости от команды. Если для себя выводить, то мод нормально уже работает, а вот захотелось в чат выдавать Hello... Сутки уже мозги ломаю. В принципе 

battle_controllers.CommonChannelController(chatManager.battleCommonChannelID)._broadcast(message)

вполне рабочий. Но как бы всё обернуть в нормальную логику? И ещё как определять, что игрок во взводе с тобой, чтоб не отправлять ему Hello?

Обьясните, плиз, популярно.

 

Share this post


Link to post

Short link
Share on other sites

from messenger import MessengerEntry
from constants import PREBATTLE_TYPE
from messenger.m_constants import PROTO_TYPE
def isBattleChat():
    result = {'squad': None, 'team': None, 'common': None}
    channelsCtrl = MessengerEntry.g_instance.gui.channelsCtrl
    for controller in channelsCtrl.getControllersIterator():
        channel = controller.getChannel()
        if channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() == -130:
            result['common'] = controller
        elif channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() == -129:
            result['team'] = controller
        elif channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() in [-PREBATTLE_TYPE.SQUAD]:
            result['squad'] = controller
    return result

def team_arena_message(messages):
    commonChannel = isBattleChat()['team']
    return commonChannel.sendMessage(messages.encode('utf-8'))


def common_arena_message(messages):
    commonChannel = isBattleChat()['common']
    return commonChannel.sendMessage(messages.encode('utf-8'))

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

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Ок, спасибо. С чатом понятно.

А как быть с "isSquadMan()"?    В "BigWorld.player().arena.vehicles" такой инфы вроде нет. Как определить находящихся с тобой во взводе во время боя?

Share this post


Link to post

Short link
Share on other sites
def squad_arena_message(messages):
    commonChannel = isBattleChat()['squad']
    return commonChannel.sendMessage(messages.encode('utf-8'))

пробуй

Share this post


Link to post

Short link
Share on other sites
def squad_arena_message(messages):
    commonChannel = isBattleChat()['squad']
    return commonChannel.sendMessage(messages.encode('utf-8'))

пробуй

 

Ты не понял, мне наоборот НЕ нужно взводным никаких сообщений посылать.

Вот смотри. У меня есть (названия списков для понимания логики):

1. Список контактов = друзья и игнор => (contacts = friends_list + ignore_list)  (по спискам есть инфа offline/online)

2. Список игроков в бою, всех => battle_users_all

3. Список игроков из моего списка контактов, которые конкретно сейчас со мной в бою  => battle_users_present

Я выдаю сообщения в начале боя:

1. Если друзья в моей тиме (кроме взводных) - в командный чат, но если друзья есть и в тиме врага - тогда сразу в общий чат

2. Если в бою есть мои неадекваты - в общий чат, чтоб все знали их в лицо

3. Взводных не учитывать (battle_users_present - squad_users = battle_no_squad_users_present) - если кроме взводных никого нет - ничего не посылать в чат.

squad_arena_message(message) 

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

 

Короче мне нужно определить, или список игроков во взводе (squad_users), или проверку на нахождение в МОЁМ взводе (isSquadMan() вроде). По name или по id - хз.

 

Share this post


Link to post

Short link
Share on other sites

не помню я как проверку на взвод делать, но она есть, поищи в скриптах isSquadMan

Share this post


Link to post

Short link
Share on other sites

может так?

player = BigWorld.player()
arenaDP = g_sessionProvider.getArenaDP() #тут добавил
if player is not None:
    for key, vehicle in player.arena.vehicles.iteritems():
        ...
        # и тут добавил к коду
        if arenaDP.isSquadMan(key):
            squad_list_ids.append(key) #список vehicle_id
        #

если

player.arena.vehicles = {40874170: {'isAlive': True, 'accountDBID': 7465479, 'isPrebattleCreator': True, 'isTeamKiller': False,

в key, я та понимаю, будут значения vehicleID ?

тоесть

40874170, ...

проверить бы в работе взвода, но явных ошибок мод не выдаёт

 

В трене, без взвода:

if arenaDP.isSquadMan(key):  результат squad_list_ids = []
if not arenaDP.isSquadMan(key): результат squad_list_ids = [40874170, ...]

а будет оно проверять состоит игрок только в моём взводе или это для всех взводов?  не знаю

Edited by Megagrob

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 BigWorld
from gui.battle_control import g_sessionProvider
from gui.battle_control.avatar_getter import getPlayerVehicleID

# так
def isSquadPlayer():
    return g_sessionProvider.getArenaDP().isSquadMan(getPlayerVehicleID())

# или
def isSquadPlayer():
    return g_sessionProvider.getArenaDP().isSquadMan(BigWorld.player().playerVehicleID)
    
        
if isSquadPlayer():
    print 'isSquadMan'
else:
    print 'not isSquadMan'

пробуй

Edited by Dark_Knight_MiX
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

а чем твой код отличается от моего, выложенного ранее?

arenaDP = g_sessionProvider.getArenaDP()
if arenaDP.isSquadMan(VehicleID): #проверка
    squad_list_ids.append(VehicleID) #заполняем список ID`s взводных

Вот часть моего кода:

кстати, отвечая на свой же вопрос из предыдущего поста - key - это и будет VehicleID игроков перебираемые в цикле

#тут код получения списка контактов, друзей и неадекватов
...
#дальше перебираем всех игроков в бою 
player = BigWorld.player()
arenaDP = g_sessionProvider.getArenaDP()
if player is not None:
    for key, vehicle in player.arena.vehicles.iteritems():
        #находим присутствующих друзей и неадекватов в бою
        ...
        #находим совзводных
        if arenaDP.isSquadMan(key):    #key = VehicleID игрока в бою
            squad_list_ids.append(key) #список vehicle_id совзводных

Вопрос ещё вот в чём

g_sessionProvider.getArenaDP().isSquadMan(VehicleID)

что делает? Проверяет находится ли игрок с VehicleID во взводе вообще, или в моём? Или нужно выполнить именно:

.isSquadMan(мой VehicleID)

и получу список своих совзводных?

ПС: проверю в рандоме

Edited by Megagrob

Share this post


Link to post

Short link
Share on other sites

да, вроде так

просто то что я тебе выше показал короче и смысл тот же

Edited by Dark_Knight_MiX

Share this post


Link to post

Short link
Share on other sites
for key, vehicle in player.arena.vehicles.iteritems():
    if arenaDP.isSquadMan(key):
        squad_list_ids.append(key)

в списке squad_list_ids действительно будут VehicleID всех совзводных, в т.ч и мой.

 

Dark_Knight_MiX, спасибо за помощь.

Share this post


Link to post

Short link
Share on other sites

Не буду плодить лишних тем, так что спрошу тут.

Вообщем мод почти готов, тестю. Мод выводит сообщения о присутствии в бою друзей и неадекватов, а также избранных (водомесов, из файла).

Так же может отсылать автоматические сообщения в чат (для троллинга Жова, например). + небольшая ангарная часть.

Но как-то хочется большего... Хотелось бы вариант с отображением пометки в ушах команд, или подсветки, или подчёркивания

Чисто на питоне можно сделать? Или здесь только флеш? И если стоит XVM...он же свою флеху ставит на уши.

Если это проблематично, то может ещё какой вариант есть? Как последний вариант, остаётся только по GUI.Text?

как быть, подскажите. Спс

Edited by Megagrob

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 messenger import MessengerEntry
from constants import PREBATTLE_TYPE
from messenger.m_constants import PROTO_TYPE
def isBattleChat():
    result = {'squad': None, 'team': None, 'common': None}
    channelsCtrl = MessengerEntry.g_instance.gui.channelsCtrl
    for controller in channelsCtrl.getControllersIterator():
        channel = controller.getChannel()
        if channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() == -130:
            result['common'] = controller
        elif channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() == -129:
            result['team'] = controller
        elif channel.getProtoType() is PROTO_TYPE.BW_CHAT2 and channel.getClientID() in [-PREBATTLE_TYPE.SQUAD]:
            result['squad'] = controller
    return result

 

Что-то мне это напоминает...

Share this post


Link to post

Short link
Share on other sites

@Ekspoint,

Насчет isBattleChat()

isBattleChat()["squad"].sendMessage("test".encode("utf8"))

AttributeError: 'NoneType' object has no attribute 'sendMessage'

хотя с ["team"] работает. Проверяю в реальном бою, находясь во взводе

Share this post


Link to post

Short link
Share on other sites

from messenger import MessengerEntry
from messenger.m_constants import BATTLE_CHANNEL
from messenger.ext.channel_num_gen import getClientID4Prebattle
from messenger.ext.channel_num_gen import getClientID4BattleChannel
        

def getBattleChatControllers():
    teamChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.TEAM.name)
    squadChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.SQUAD.name) 
    commonChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.COMMON.name)
    team = MessengerEntry.g_instance.gui.channelsCtrl.getController(teamChannelClientID)
    squad = MessengerEntry.g_instance.gui.channelsCtrl.getController(squadChannelClientID)
    common = MessengerEntry.g_instance.gui.channelsCtrl.getController(commonChannelClientID)	
    return {'team': team, 'common': common,'squad': squad}
getBattleChatControllers()["squad"].sendMessage("test".encode("utf8"))

код GPCracker

Share this post


Link to post

Short link
Share on other sites

@Ekspoint

Все равно

 AttributeError: 'NoneType' object has no attribute 'sendMessage'

Вот часть кода 

def isBattleChat():
    teamChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.TEAM.name)
    squadChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.SQUAD.name) 
    commonChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.COMMON.name)
    team = MessengerEntry.g_instance.gui.channelsCtrl.getController(teamChannelClientID)
    squad = MessengerEntry.g_instance.gui.channelsCtrl.getController(squadChannelClientID)
    common = MessengerEntry.g_instance.gui.channelsCtrl.getController(commonChannelClientID)	
    return {'team': team, 'common': common,'squad': squad}

isBattleChat()["squad"].sendMessage(self.json_config["notifications"]["texts"]["squad"].replace("{{shells-procent}}", str(self.json_config["default"])).encode('utf8'))

Share this post


Link to post

Short link
Share on other sites

 

@Ekspoint

Все равно

 AttributeError: 'NoneType' object has no attribute 'sendMessage'
from constants import PREBATTLE_TYPE
from messenger import MessengerEntry
from messenger.m_constants import BATTLE_CHANNEL
from messenger.ext.channel_num_gen import getClientID4Prebattle
from messenger.ext.channel_num_gen import getClientID4BattleChannel
        

def getBattleChatControllers():
    squadChannelClientID = getClientID4Prebattle(PREBATTLE_TYPE.SQUAD)
    teamChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.TEAM.name)
    commonChannelClientID = getClientID4BattleChannel(BATTLE_CHANNEL.COMMON.name)
    team = MessengerEntry.g_instance.gui.channelsCtrl.getController(teamChannelClientID)
    squad = MessengerEntry.g_instance.gui.channelsCtrl.getController(squadChannelClientID)
    common = MessengerEntry.g_instance.gui.channelsCtrl.getController(commonChannelClientID)	
    return {'team': team, 'common': common,'squad': squad}

@Wanket, ща ок?

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