ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
@@ -18,16 +18,21 @@
import PyDataManager
import ChConfig
import EventReport
import ChPyNetSendPack
import NetPackCommon
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条
@@ -86,7 +91,7 @@
    curCache = None
    tagPlayerName = ""
    if tagPlayer == None:
        curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
        curCache = PlayerViewCache.FindViewCache(tagPlayerID)
        if not curCache:
            PlayerControl.NotifyCode(curPlayer, "CanootTalk10")
            return
@@ -98,7 +103,7 @@
        return
    
    if curCache:
        cacheDict = eval(curCache.GetPropData())
        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
        tagPlayerName = cacheDict["Name"]
        
    talkType = sendPack.GetTalkType()
@@ -160,6 +165,66 @@
        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 当前时间
@@ -172,7 +237,8 @@
    extraValue = sendPack.GetExtraValue()
    extras = sendPack.GetExtras()
    curPlayer.ChatGong(content, extraValue, extras)
    #缓存
    DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
    return
@@ -210,6 +276,8 @@
    curPlayer.ChatFamily(content, extraValue, extras)
    #仙盟宴会答题
    PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick)
    #缓存
    DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
    return
@@ -223,12 +291,6 @@
    # 跨服喇叭
    if SpeakerType == 2:
        pass
        #=======================================================================
        # playerName = PlayerControl.GetMergePlayerName(accID, playerName) # 转化为跨服的名字
        # dataMsg = [accID, 0, playerName, SpeakerType, Text, extraValue, extras]
        # MergeChildMsg.SendMergerChildToCenterStringData(ChConfig.Def_SendMergeLoudspeaker, dataMsg)
        # GameWorld.Log("发送跨服喇叭聊天: accID=%s,Text=%s" % (accID, Text), playerID)
        #=======================================================================
        
    else:
        #GameWorld.DebugLog("发送本服喇叭聊天: accID=%s,Text=%s" % (accID, Text), playerID)
@@ -288,83 +350,83 @@
# };
#===============================================================================
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)
#    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
@@ -383,7 +445,12 @@
    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()
    return extraValueStr
@@ -408,3 +475,77 @@
    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