| #!/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 PyGameData  | 
|   | 
| import re  | 
| import time  | 
| import IpyGameDataPY  | 
|   | 
|   | 
| g_ChatMi = {}   # ÀëÏßÁÄÌì¼Ç¼ {Íæ¼ÒID:[ÐÅÏ¢]} Ò»¸öÍæ¼Ò×î¶à8Ìõ  | 
|   | 
|   | 
| def ChangeVoiceChat(content):  | 
|     #»ñÈ¡ÓïÒôÎÄ×ֵıêʶ  | 
|     #ÓïÒôĬÈÏ¿ªÍ·±ê¼Ç<v=tick_length>  | 
|     pat = re.compile(r'<v=\d+_\d+>')  | 
|     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  | 
|   | 
| # µÇ¼ʱ½«ÀëÏßÏûϢϷ¢  | 
| 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):  | 
|     ## ÊÕµ½×Ó·þ¿ç·þÊÀ½çƵµÀÁÄÌì  | 
|     chatCrossType = IpyGameDataPY.GetFuncCfg("TalkCross", 1) # ¿ç·þÁÄÌ췶ΧÉ趨 0-È«·þ£»1-boss·ÖÇø£»2-¿ç·þ¾º¼¼³¡·ÖÇø  | 
|     if chatCrossType == 0:  | 
|         serverGroupIDList = []  | 
|     else:  | 
|         crossTypeMapDict = {1:ChConfig.Def_FBMapID_CrossPenglai, 2:ChConfig.Def_FBMapID_CrossRealmPK}  | 
|         if chatCrossType not in crossTypeMapDict:  | 
|             GameWorld.ErrLog("¿ç·þÁÄÌ췶ΧÅäÖôíÎó! chatCrossType=%s" % chatCrossType)  | 
|             return  | 
|         zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(crossTypeMapDict[chatCrossType], 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  | 
|     face = player.GetFace()  | 
|     extraValueStr = "%s|%s|%s|%s|%s" % (extraValueStr, coupleName, coupleJob, bridePriceMaxID, face)  | 
|     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 |