From b081d6f889a35197f94e72cf37800015d9943512 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 31 七月 2023 16:35:04 +0800
Subject: [PATCH] 9788 【BT9】【后端】成就系统(新增成就类型164~175) hygame2 冲突

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py |  337 +++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 247 insertions(+), 90 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
index d274d2c..110ce43 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
+++ b/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()
@@ -142,7 +147,7 @@
                 g_ChatMi[tagPlayerID].pop(0)
                 return
         
-        PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName())
+        #PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName())
 
 # 登录时将离线消息下发
 def LoginChatMi(curPlayer):
@@ -160,6 +165,74 @@
         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 当前时间
@@ -172,7 +245,8 @@
     extraValue = sendPack.GetExtraValue()
     extras = sendPack.GetExtras()
     curPlayer.ChatGong(content, extraValue, extras)
-    
+    #缓存
+    DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
     return
 
 
@@ -210,6 +284,8 @@
     curPlayer.ChatFamily(content, extraValue, extras)
     #仙盟宴会答题
     PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick)
+    #缓存
+    DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras)
     return
 
 
@@ -223,12 +299,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 +358,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
 
 
@@ -375,7 +445,8 @@
     vipLv = player.GetVIPLv()  # 玩家vip等级
     GMLevel = player.GetGMLevel()
     job = player.GetJob()
-
+    playerID = player.GetID()
+    
     extraValueStr = ""
     # vip等级
     extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv
@@ -385,6 +456,18 @@
     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
 
 
@@ -409,3 +492,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
\ No newline at end of file

--
Gitblit v1.8.0