Megagrob 5 Posted February 7, 2016 Покажите, пожалуйста, как правильно выводить сообщения в боевой чат Логика примерно такая (код ниже), ну или предложите правильный вариант 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? Обьясните, плиз, популярно. Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312836 Posted February 7, 2016 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')) дальше думаю понял что куда вписывать 2 Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #312849 Posted February 7, 2016 Ок, спасибо. С чатом понятно. А как быть с "isSquadMan()"? В "BigWorld.player().arena.vehicles" такой инфы вроде нет. Как определить находящихся с тобой во взводе во время боя? Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312850 Posted February 7, 2016 def squad_arena_message(messages): commonChannel = isBattleChat()['squad'] return commonChannel.sendMessage(messages.encode('utf-8')) пробуй Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #312863 Posted February 7, 2016 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 - хз. Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312864 Posted February 7, 2016 не помню я как проверку на взвод делать, но она есть, поищи в скриптах isSquadMan Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #312866 Posted February 7, 2016 (edited) может так? 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 February 8, 2016 by Megagrob Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312894 Posted February 7, 2016 Нет, не то, найду покажу, проверка всего в одну строчку Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312921 Posted February 8, 2016 (edited) 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 February 8, 2016 by Dark_Knight_MiX 1 Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #312929 Posted February 8, 2016 (edited) а чем твой код отличается от моего, выложенного ранее? 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 February 8, 2016 by Megagrob Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #312935 Posted February 8, 2016 (edited) да, вроде так просто то что я тебе выше показал короче и смысл тот же Edited February 8, 2016 by Dark_Knight_MiX Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #312994 Posted February 8, 2016 for key, vehicle in player.arena.vehicles.iteritems(): if arenaDP.isSquadMan(key): squad_list_ids.append(key) в списке squad_list_ids действительно будут VehicleID всех совзводных, в т.ч и мой. Dark_Knight_MiX, спасибо за помощь. Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #313214 Posted February 11, 2016 (edited) Не буду плодить лишних тем, так что спрошу тут. Вообщем мод почти готов, тестю. Мод выводит сообщения о присутствии в бою друзей и неадекватов, а также избранных (водомесов, из файла). Так же может отсылать автоматические сообщения в чат (для троллинга Жова, например). + небольшая ангарная часть. Но как-то хочется большего... Хотелось бы вариант с отображением пометки в ушах команд, или подсветки, или подчёркивания Чисто на питоне можно сделать? Или здесь только флеш? И если стоит XVM...он же свою флеху ставит на уши. Если это проблематично, то может ещё какой вариант есть? Как последний вариант, остаётся только по GUI.Text? как быть, подскажите. Спс Edited February 12, 2016 by Megagrob Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #313666 Posted February 14, 2016 Есть идейка как сделать в ушах, в лс напиши подробно Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #313902 Posted February 16, 2016 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 Что-то мне это напоминает... Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #313919 Posted February 16, 2016 Что-то мне это напоминает... ну да, твое Quote Share this post Link to post Short link Share on other sites
Wanket 3 #334961 Posted June 29, 2016 @Ekspoint, Насчет isBattleChat() isBattleChat()["squad"].sendMessage("test".encode("utf8")) AttributeError: 'NoneType' object has no attribute 'sendMessage' хотя с ["team"] работает. Проверяю в реальном бою, находясь во взводе Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #334963 Posted June 29, 2016 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 Quote Share this post Link to post Short link Share on other sites
Wanket 3 #334985 Posted June 29, 2016 @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')) Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #334989 Posted June 30, 2016 @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, ща ок? 1 Quote Share this post Link to post Short link Share on other sites