hxp
2024-09-10 f355e99a5f181ca869bdddf79fec1a27f237d194
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
@@ -18,8 +18,6 @@
import PyDataManager
import ChConfig
import EventReport
import ChPyNetSendPack
import NetPackCommon
import PlayerFamilyParty
import ChPyNetSendPack
import ShareDefine
@@ -28,8 +26,12 @@
import CrossRealmMsg
import ChNetSendPack
import NetPackCommon
import PlayerGeTui
import PyGameData
import re
import time
import IpyGameDataPY
g_ChatMi = {}   # 离线聊天记录 {玩家ID:[信息]} 一个玩家最多8条
@@ -143,8 +145,6 @@
            if len(g_ChatMi[tagPlayerID]) > 8:
                g_ChatMi[tagPlayerID].pop(0)
                return
        PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName())
# 登录时将离线消息下发
def LoginChatMi(curPlayer):
@@ -184,10 +184,18 @@
def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick):
    ## 收到子服跨服世界频道聊天
    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(0, serverGroupID)
    if not zoneIpyData:
        return
    serverGroupIDList = zoneIpyData.GetServerGroupIDList()
    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
@@ -234,7 +242,8 @@
    extraValue = sendPack.GetExtraValue()
    extras = sendPack.GetExtras()
    curPlayer.ChatGong(content, extraValue, extras)
    #缓存
    DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
    return
@@ -272,6 +281,8 @@
    curPlayer.ChatFamily(content, extraValue, extras)
    #仙盟宴会答题
    PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick)
    #缓存
    DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
    return
@@ -431,7 +442,8 @@
    vipLv = player.GetVIPLv()  # 玩家vip等级
    GMLevel = player.GetGMLevel()
    job = player.GetJob()
    playerID = player.GetID()
    extraValueStr = ""
    # vip等级
    extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv
@@ -445,6 +457,15 @@
    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
@@ -469,3 +490,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