#!/usr/bin/python # -*- coding: GBK -*- # ##@package # # @todo: Íæ¼ÒÁÄÌ죬ÓïÒô # # @author: Alee # @date 2018-4-25 ÏÂÎç02:30:25 # @version 1.0 # # @note: # #--------------------------------------------------------------------- import GameWorld import IPY_GameServer import PlayerControl import PyDataManager import ChConfig import EventReport import PlayerFamilyParty import ChPyNetSendPack import ShareDefine import PlayerViewCache import CrossRealmPlayer import CrossRealmMsg import ChNetSendPack import NetPackCommon import PlayerGeTui import PyGameData import re import time import IpyGameDataPY g_ChatMi = {} # ÀëÏßÁÄÌì¼Ç¼ {Íæ¼ÒID:[ÐÅÏ¢]} Ò»¸öÍæ¼Ò×î¶à8Ìõ def ChangeVoiceChat(content): #»ñÈ¡ÓïÒôÎÄ×ֵıêʶ #ÓïÒôĬÈÏ¿ªÍ·±ê¼Ç pat = re.compile(r'') keyStrList = pat.findall(content) if not keyStrList: return content lIndex = content.index(keyStrList[0]) if lIndex !=0: #±ê¼Ç±ØÐëÔÚ¿ªÍ· return content return content[len(keyStrList[0]):] ## ÃÜÆµ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatMi(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkMi() tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(sendPack.GetTargetName()) if tagPlayer == None: PlayerControl.NotifyCode(curPlayer, "CanootTalk10") return # ºÚÃûµ¥¼ì²é if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): return talkType = sendPack.GetTalkType() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatMi(tagPlayer, talkType, content, extraValue, extras) PyDataManager.GetContactsManager().AddContactsBoth(curPlayer.GetID(), tagPlayer.GetID()) return ## ÃÜÆµÓÅ»¯(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatMiFix(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkMiFix() tagPlayerID = sendPack.GetPlayerID() tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) curCache = None tagPlayerName = "" if tagPlayer == None: curCache = PlayerViewCache.FindViewCache(tagPlayerID) if not curCache: PlayerControl.NotifyCode(curPlayer, "CanootTalk10") return else: tagPlayerName = tagPlayer.GetName() # ºÚÃûµ¥¼ì²é if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayerID, curPlayer): return if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) tagPlayerName = cacheDict["Name"] talkType = sendPack.GetTalkType() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() SendChatMi(curPlayer, tagPlayer, tagPlayerName, tagPlayerID, talkType, content, extraValue, extras) #curPlayer.ChatMi(tagPlayer, talkType, content, extraValue, extras) PyDataManager.GetContactsManager().AddContactsBoth(curPlayer.GetID(), tagPlayerID) return def SendChatMi(curPlayer, tagPlayer, tagPlayerName, tagPlayerID, talkType, content, extraValue, extras): global g_ChatMi sendPack = ChNetSendPack.tagTalkMi() sendPack.Clear() sendPack.TalkType = talkType #(BYTE TalkType)//0ΪĬÈÏ, 1Ϊ1¶Ô1ÁÄÌìÓà sendPack.SrcName = curPlayer.GetName() #(String SrcName)//size = SrcNameLen sendPack.SrcNameLen = len(sendPack.SrcName) #(BYTE SrcNameLen) sendPack.PlayerID = curPlayer.GetID() #(DWORD PlayerID) sendPack.ToNameLen = len(tagPlayerName) #(BYTE ToNameLen) sendPack.ToName = tagPlayerName #(String ToName)//size = ToNameLen sendPack.ToPlayerID = tagPlayerID #(DWORD ToPlayerID) sendPack.Len = len(content) #(WORD Len) sendPack.Content = content #(String Content)//size = Len sendPack.ExtraValue = extraValue #(DWORD ExtraValue)//¸½¼ÓÖµ sendPack.Extras = extras #(char Extras[256])//¸½¼ÓÖµÁбí NetPackCommon.SendFakePack(curPlayer, sendPack) if tagPlayer and not PlayerControl.GetIsTJG(tagPlayer): NetPackCommon.SendFakePack(tagPlayer, sendPack) else: # ÁôÑÔ ÉÏÏß֪ͨ£¬×î¶à8Ìõ,Ö±½Ó´æ´¢½á¹¹Ìå if tagPlayerID not in g_ChatMi: g_ChatMi[tagPlayerID] = [sendPack] else: g_ChatMi[tagPlayerID].append(sendPack) if len(g_ChatMi[tagPlayerID]) > 8: g_ChatMi[tagPlayerID].pop(0) return #PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName()) # µÇ¼ʱ½«ÀëÏßÏûϢϷ¢ def LoginChatMi(curPlayer): global g_ChatMi playerID = curPlayer.GetID() if playerID not in g_ChatMi: return chatList = g_ChatMi.pop(playerID) for chatPack in chatList: if not PyDataManager.GetContactsManager().FindContact(playerID, chatPack.PlayerID): # ÀëÏß˽ÁÄÌ«¶à£¬´ËÍæ¼Ò±»¼·³ö¶ÓÁÐ continue NetPackCommon.SendFakePack(curPlayer, chatPack) return ## ¹ú¼ÒƵ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatCountry(index, tick): ## ¿ç·þƵµÀ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() sendPack = IPY_GameServer.IPY_GTalkCountry() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() crossPlayerName = CrossRealmPlayer.GetCrossPlayerName(curPlayer) ## ·¢Ë͵½¿ç·þ·þÎñÆ÷£¬Ö±½ÓʹÓÿç·þbossµÄ·ÖÇøÅäÖà dataMsg = {"PlayerID":playerID, "Name":crossPlayerName, "Content":content, "ExtraValue":extraValue, "Extras":extras} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChatCrossWorld, dataMsg) return def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick): ## ÊÕµ½×Ó·þ¿ç·þÊÀ½çƵµÀÁÄÌì zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(0, serverGroupID) if not zoneIpyData: return serverGroupIDList = zoneIpyData.GetServerGroupIDList() CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChatCrossWorld, msgData, serverGroupIDList) return def CrossServerMsg_ChatCrossWorld(msgData): ## ÊÕµ½¿ç·þÊÀ½çƵµÀÁÄÌì playerID = msgData["PlayerID"] crossPlayerName = msgData["Name"] content = msgData["Content"] extraValue = msgData["ExtraValue"] extras = msgData["Extras"] sendPack = ChNetSendPack.tagTalkCountry() sendPack.Clear() sendPack.Name = crossPlayerName sendPack.NameLen = len(sendPack.Name) sendPack.PlayerID = playerID sendPack.Content = content sendPack.Len = len(sendPack.Content) sendPack.ExtraValue = extraValue sendPack.Extras = extras # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, sendPack) #curPlayer.ChatCountry(content, extraValue, extras) return ## ¹«Æµ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatGong(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkGong() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatGong(content, extraValue, extras) #»º´æ DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return ## ¶ÔƵ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatTeam(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkDui() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatTeam(content, extraValue, extras) return ## ¼Ò×寵µÀÁÄÌì # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatFamily(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if curPlayer.GetFamilyID() == 0: GameWorld.Log("¼Ò×寵µÀÁÄÌì·â°ü´íÎó,Íæ¼ÒûÓмÒ×å" , curPlayer.GetPlayerID()) return sendPack = IPY_GameServer.IPY_GTalkBang() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatFamily(content, extraValue, extras) #ÏÉÃËÑç»á´ðÌâ PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick) #»º´æ DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return ## pyÀ®°È£¬Ö§³Ö¿ç·þ def ChatPYSpeaker(curPlayer, chatInfoList): SpeakerType, Text, extraValue, extras = chatInfoList accID = curPlayer.GetAccID() playerName = curPlayer.GetName() playerID = curPlayer.GetPlayerID() # ¿ç·þÀ®°È if SpeakerType == 2: pass else: #GameWorld.DebugLog("·¢Ëͱ¾·þÀ®°ÈÁÄÌì: accID=%s,Text=%s" % (accID, Text), playerID) BroadCastPYSpeaker(accID, playerID, playerName, SpeakerType, Text, extraValue, extras) return ## ¹ã²¥À®°ÈÄÚÈÝ£¬Ö§³Ö¿ç·þ def BroadCastPYSpeaker(accID, playerID, playerName, SpeakerType, Text, extraValue, extras): if playerID == 0: player = GameWorld.GetPlayerManager().FindPlayerByAccID(accID) if player: playerID = player.GetPlayerID() speakerPack = ChPyNetSendPack.tagGCPYSpeakerContent() speakerPack.Clear() speakerPack.AccIDLen = len(accID) speakerPack.AccID = accID speakerPack.PlayerID = playerID speakerPack.NameLen = len(playerName) speakerPack.Name = playerName speakerPack.SpeakerType = SpeakerType speakerPack.TextLen = len(Text) speakerPack.Text = Text speakerPack.ExtraValue = extraValue speakerPack.Extras = extras # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for i in range(playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(i) if player == None or not player.GetInitOK(): continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, speakerPack) return #----------ÓïÒô´¦Àí------------------------------------------------------ # ÔÝ×ö³ÉÍêȫת·¢£¬Èç¹ûºóÐøIOѹÁ¦¹ý´ó¸Ä³Éֻת·¢»ù±¾ÐÅÏ¢ ÈçÓïÒôÀ´Ô´¡¢Ê±³¤ºÍΨһ±êÖ¾ # ÓïÒôÊý¾ÝÉÏ´«×¨ÃÅ·þÎñÆ÷£¬½ÓÊÕÓû§¿É¸ù¾ÝΨһ±êÖ¾ÇëÇóÏÂÔØ£¬¿ÉÉ趨Êý¾Ý±£Áôʱ³¤ #=============================================================================== # //B3 07 ÓïÒôÁÄÌì #tagCGVoiceChat # # struct tagCGVoiceChat # { # tagHead Head; # BYTE ChannelType; // 1 ÊÀ½ç 2 ÏÉÃË 3 ˽ÁÄ(ºÃÓÑ) 4 ¶ÓÎé -------²é¿´·â°ütagCMVoiceChat 5 ÇøÓò # BYTE TargetNameLen; # char TargetName[TargetNameLen]; //size = TargetNameLen # DWORD TargetID; // ˽ÁÄĬÈÏ·¢Íæ¼ÒID£¬Ã»ÓÐID²Å·¢Ãû³Æ # WORD Len; # BYTE Content[Len]; //size = Len # }; #=============================================================================== def OnVoiceChat(index, clientPack, tick): # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) # if not CheckTalk(curPlayer, tick): # return # # sendPack = ChPyNetSendPack.tagGCVoiceChat() # sendPack.Clear() # sendPack.ChannelType = clientPack.ChannelType # sendPack.SrcName = curPlayer.GetName() # sendPack.SrcNameLen = len(curPlayer.GetName()) # sendPack.PlayerID = curPlayer.GetID() # sendPack.Len = clientPack.Len # sendPack.Content = clientPack.Content # sendPack.Extras = GetTalkExtraValue(curPlayer) # sendPack.ExtraValue = len(sendPack.Extras) # # playerManager = GameWorld.GetPlayerManager() # if clientPack.ChannelType == ShareDefine.Def_ChannelChat_World: # # ÊÀ½çƵµÀ # curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer())) # elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Family: # # ¼Ò×寵µÀ # curFamily = curPlayer.GetFamily() # if curFamily == None: # return # for i in range(0, curFamily.GetCount()): # notifyMember = curFamily.GetAt(i) # notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) # # if notifyPlayer == None or not notifyPlayer.GetInitOK(): # continue # # if PlayerControl.GetIsTJG(notifyPlayer): # continue # #=================================================================== # # if notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID(): # # #²»°üÀ¨×Ô¼º # # continue # #=================================================================== # # NetPackCommon.SendFakePack(notifyPlayer, sendPack) # elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Team: # # ¶ÓÎé # curTeam = curPlayer.GetTeam() # if curTeam == None: # return # for index in xrange(curTeam.GetMemberCount()): # curMember = curTeam.GetMemberPlayer(index) # if not curMember or not curMember.GetPlayerID(): # continue # # #=================================================================== # # if curMember.GetPlayerID() == curPlayer.GetPlayerID(): # # #²»°üÀ¨×Ô¼º # # continue # #=================================================================== # # if PlayerControl.GetIsTJG(curMember): # continue # NetPackCommon.SendFakePack(curMember, sendPack) # # elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Private: # # ˽ÁÄ # tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(clientPack.TargetID) # if not tagPlayer: # tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(clientPack.TargetName) # if tagPlayer == None: # return # # # ºÚÃûµ¥¼ì²é # if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): # return # # sendPack.ToName = tagPlayer.GetName() # sendPack.ToNameLen = len(tagPlayer.GetName()) # sendPack.ToPlayerID = tagPlayer.GetID() # NetPackCommon.SendFakePack(tagPlayer, sendPack) # NetPackCommon.SendFakePack(curPlayer, sendPack) return ## »ñÈ¡ÁÄÌìÄÚÈݸ½¼ÓÖµ # @param player: ÁÄÌì¶ÔÏó # @return: ÁÄÌìÄÚÈݸ½¼ÓÖµ def GetTalkExtraValue(player): vipLv = player.GetVIPLv() # Íæ¼ÒvipµÈ¼¶ GMLevel = player.GetGMLevel() job = player.GetJob() playerID = player.GetID() extraValueStr = "" # vipµÈ¼¶ extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv # GM extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_GM)% (GMLevel > 0) # job extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_JOB)% job # ÆøÅÝ¿ò extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_BubbleBox) % PlayerControl.GetChatBubbleBox(player) # ·þÎñÆ÷×éID extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_ServerGroupID) % PlayerControl.GetPlayerServerGroupID(player) # µÈ¼¶ extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_LV) % player.GetLV() # °éÂÂÐÅÏ¢ coupleName, coupleJob, bridePriceMaxID = "", 1, 0 couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID) if couple: coupleName = couple.GetCoupleName(playerID) coupleJob = couple.GetCoupleJob(playerID) bridePriceMaxID = couple.BridePriceMaxID extraValueStr = "%s|%s|%s|%s" % (extraValueStr, coupleName, coupleJob, bridePriceMaxID) return extraValueStr ## ¸½¼ÓÐÅÏ¢µÄ³¤¶ÈÆ¥Åä # @param extraValueInfo: ¸½¼ÓÐÅÏ¢µÄ³¤¶È # @return: def GetTalkExtraValueStar(extraValueType): extraValueInfo = ShareDefine.Def_TalkExtraValue_LenDict.get(extraValueType) extraValueLen = extraValueInfo[1] - extraValueInfo[0] return "%0" + str(extraValueLen) + "d" def CheckTalk(curPlayer, tick): if PlayerControl.GetGMForbidenTalk(curPlayer): return False #¼ä¸ôʱ¼ä if tick - curPlayer.GetDictByKey(ChConfig.Def_TalkTick) < 1000: return False return True def DoTalkCache(familyID, name, playerID, content, extras): #ÏÉÃË¡¢ÊÀ½çƵµÀÁÄÌ컺´æ curTime = int(time.time()) saveInfo = [curTime, name, playerID, content, extras] if familyID: if familyID not in PyGameData.g_familyTalkCache: PyGameData.g_familyTalkCache[familyID] = [] else: maxCnt = IpyGameDataPY.GetFuncCfg('TalkCache', 2) if maxCnt and len(PyGameData.g_familyTalkCache[familyID]) >= maxCnt: del PyGameData.g_familyTalkCache[familyID][0] PyGameData.g_familyTalkCache[familyID].append(saveInfo) else: maxCnt = IpyGameDataPY.GetFuncCfg('TalkCache', 1) if maxCnt and len(PyGameData.g_worldTalkCache) >= maxCnt: del PyGameData.g_worldTalkCache[0] PyGameData.g_worldTalkCache.append(saveInfo) return def NotifyTalkCache(curPlayer): ##ÉÏÏß֪ͨ·ÇÍÑ»úÀëÏߺóµÄÁÄÌ컺´æ if PlayerControl.GetIsTJG(curPlayer): return playerID = curPlayer.GetPlayerID() unTJLogoffTime = PyGameData.g_unTJLogoffTime.get(playerID, 0) familyCacheList, worldCacheList = [], [] familyID = curPlayer.GetFamilyID() if familyID and familyID in PyGameData.g_familyTalkCache: for curTime, name, playerID, content, extras in PyGameData.g_familyTalkCache[familyID]: if curTime < unTJLogoffTime: continue contentInfo = ChPyNetSendPack.tagGCTalkCacheInfo() contentInfo.Clear() contentInfo.ChannelType = 2 contentInfo.Name = name contentInfo.NameLen = len(name) contentInfo.PlayerID = playerID contentInfo.Time = curTime contentInfo.Content = content contentInfo.Len = len(content) contentInfo.Extras = extras familyCacheList.append(contentInfo) for curTime, name, playerID, content, extras in PyGameData.g_worldTalkCache: if curTime < unTJLogoffTime: continue contentInfo = ChPyNetSendPack.tagGCTalkCacheInfo() contentInfo.Clear() contentInfo.ChannelType = 1 contentInfo.Name = name contentInfo.NameLen = len(name) contentInfo.PlayerID = playerID contentInfo.Time = curTime contentInfo.Content = content contentInfo.Len = len(content) contentInfo.Extras = extras worldCacheList.append(contentInfo) if familyCacheList: sendPack = ChPyNetSendPack.tagGCTalkCache() sendPack.Clear() sendPack.InfoList = familyCacheList sendPack.Count = len(sendPack.InfoList) NetPackCommon.SendFakePack(curPlayer, sendPack) if worldCacheList: sendPack = ChPyNetSendPack.tagGCTalkCache() sendPack.Clear() sendPack.InfoList = worldCacheList sendPack.Count = len(sendPack.InfoList) NetPackCommon.SendFakePack(curPlayer, sendPack) return