From 6c3c051cbd9c08e03735ac90c3ab88091ef15866 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期二, 16 七月 2019 17:12:41 +0800 Subject: [PATCH] 8104 子 【前端】【主干】聊天系统优化 / 【后端】【主干】聊天系统优化 --- ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 156 ++++++++++++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 1 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py | 67 +++++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 156 ++++++++++++++++++++++ 5 files changed, 379 insertions(+), 3 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index de47a18..cc089ea 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -6773,6 +6773,162 @@ #------------------------------------------------------ +# B3 11 聊天缓存通知 #tagGCTalkCache + +class tagGCTalkCacheInfo(Structure): + ChannelType = 0 #(BYTE ChannelType)// 1 世界 2 仙盟 + NameLen = 0 #(BYTE NameLen) + Name = "" #(String Name)//size = SrcNameLen + PlayerID = 0 #(DWORD PlayerID) + Time = 0 #(DWORD Time) + Len = 0 #(WORD Len) + Content = "" #(String Content)//size = Len + Extras = "" #(char Extras[256])//附加值列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen) + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len) + self.Extras,_pos = CommFunc.ReadString(_lpData, _pos,256) + return _pos + + def Clear(self): + self.ChannelType = 0 + self.NameLen = 0 + self.Name = "" + self.PlayerID = 0 + self.Time = 0 + self.Len = 0 + self.Content = "" + self.Extras = "" + return + + def GetLength(self): + length = 0 + length += 1 + length += 1 + length += len(self.Name) + length += 4 + length += 4 + length += 2 + length += len(self.Content) + length += 256 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteBYTE(data, self.ChannelType) + data = CommFunc.WriteBYTE(data, self.NameLen) + data = CommFunc.WriteString(data, self.NameLen, self.Name) + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteDWORD(data, self.Time) + data = CommFunc.WriteWORD(data, self.Len) + data = CommFunc.WriteString(data, self.Len, self.Content) + data = CommFunc.WriteString(data, 256, self.Extras) + return data + + def OutputString(self): + DumpString = ''' + ChannelType:%d, + NameLen:%d, + Name:%s, + PlayerID:%d, + Time:%d, + Len:%d, + Content:%s, + Extras:%s + '''\ + %( + self.ChannelType, + self.NameLen, + self.Name, + self.PlayerID, + self.Time, + self.Len, + self.Content, + self.Extras + ) + return DumpString + + +class tagGCTalkCache(Structure): + Head = tagHead() + Count = 0 #(WORD Count) + InfoList = list() #(vector<tagGCTalkCacheInfo> InfoList)//size = Count + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB3 + self.Head.SubCmd = 0x11 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temInfoList = tagGCTalkCacheInfo() + _pos = temInfoList.ReadData(_lpData, _pos) + self.InfoList.append(temInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB3 + self.Head.SubCmd = 0x11 + self.Count = 0 + self.InfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 2 + for i in range(self.Count): + length += self.InfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + InfoList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagGCTalkCache=tagGCTalkCache() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTalkCache.Head.Cmd,m_NAtagGCTalkCache.Head.SubCmd))] = m_NAtagGCTalkCache + + +#------------------------------------------------------ # B5 04 拍卖行新上架拍品 #tagGCAddAuctionItemInfo class tagGCAddAuctionItem(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index 5cbad3a..12d0d56 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -174,6 +174,7 @@ #守卫人皇 PlayerFamilySWRH.OnLogin(curPlayer) PlayerTalk.LoginChatMi(curPlayer) + PlayerTalk.NotifyTalkCache(curPlayer) PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID()) #活动 GameWorldActionControl.OnPlayerLogin(curPlayer) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py index 1d267d8..8bd9d39 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py +++ b/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 @@ -29,7 +27,12 @@ import ChNetSendPack import NetPackCommon import PlayerGeTui +import PyGameData + import re +import time +import IpyGameDataPY + g_ChatMi = {} # 离线聊天记录 {玩家ID:[信息]} 一个玩家最多8条 @@ -234,7 +237,8 @@ extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatGong(content, extraValue, extras) - + #缓存 + DoTalkCache(0, curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return @@ -272,6 +276,8 @@ curPlayer.ChatFamily(content, extraValue, extras) #仙盟宴会答题 PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick) + #缓存 + DoTalkCache(curPlayer.GetFamilyID(), curPlayer.GetName(), curPlayer.GetPlayerID(), content, extras) return @@ -469,3 +475,58 @@ 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): + ##上线通知聊天缓存 + sendPack = ChPyNetSendPack.tagGCTalkCache() + sendPack.Clear() + sendPack.InfoList = [] + familyID = curPlayer.GetFamilyID() + if familyID and familyID in PyGameData.g_familyTalkCache: + for curTime, name, playerID, content, extras in PyGameData.g_familyTalkCache[familyID]: + 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 + sendPack.InfoList.append(contentInfo) + elif PyGameData.g_worldTalkCache: + for curTime, name, playerID, content, extras in PyGameData.g_worldTalkCache: + 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 + sendPack.InfoList.append(contentInfo) + sendPack.Count = len(sendPack.InfoList) + NetPackCommon.SendFakePack(curPlayer, sendPack) + return \ No newline at end of file diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py index 3debd06..c5a7150 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py @@ -107,3 +107,5 @@ g_crossFBFuncLinePlayerCountInfo = {} # 跨服副本功能线路人数信息,本服缓存 {mapID:{funcLineID:[playerCount], ...}, ...} +g_familyTalkCache = {} #{familyID:[[time,content,extras],..]} +g_worldTalkCache = [] #[[time,name, playerID, content,extras],..] \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index de47a18..cc089ea 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -6773,6 +6773,162 @@ #------------------------------------------------------ +# B3 11 聊天缓存通知 #tagGCTalkCache + +class tagGCTalkCacheInfo(Structure): + ChannelType = 0 #(BYTE ChannelType)// 1 世界 2 仙盟 + NameLen = 0 #(BYTE NameLen) + Name = "" #(String Name)//size = SrcNameLen + PlayerID = 0 #(DWORD PlayerID) + Time = 0 #(DWORD Time) + Len = 0 #(WORD Len) + Content = "" #(String Content)//size = Len + Extras = "" #(char Extras[256])//附加值列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.ChannelType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen) + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len) + self.Extras,_pos = CommFunc.ReadString(_lpData, _pos,256) + return _pos + + def Clear(self): + self.ChannelType = 0 + self.NameLen = 0 + self.Name = "" + self.PlayerID = 0 + self.Time = 0 + self.Len = 0 + self.Content = "" + self.Extras = "" + return + + def GetLength(self): + length = 0 + length += 1 + length += 1 + length += len(self.Name) + length += 4 + length += 4 + length += 2 + length += len(self.Content) + length += 256 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteBYTE(data, self.ChannelType) + data = CommFunc.WriteBYTE(data, self.NameLen) + data = CommFunc.WriteString(data, self.NameLen, self.Name) + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteDWORD(data, self.Time) + data = CommFunc.WriteWORD(data, self.Len) + data = CommFunc.WriteString(data, self.Len, self.Content) + data = CommFunc.WriteString(data, 256, self.Extras) + return data + + def OutputString(self): + DumpString = ''' + ChannelType:%d, + NameLen:%d, + Name:%s, + PlayerID:%d, + Time:%d, + Len:%d, + Content:%s, + Extras:%s + '''\ + %( + self.ChannelType, + self.NameLen, + self.Name, + self.PlayerID, + self.Time, + self.Len, + self.Content, + self.Extras + ) + return DumpString + + +class tagGCTalkCache(Structure): + Head = tagHead() + Count = 0 #(WORD Count) + InfoList = list() #(vector<tagGCTalkCacheInfo> InfoList)//size = Count + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xB3 + self.Head.SubCmd = 0x11 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temInfoList = tagGCTalkCacheInfo() + _pos = temInfoList.ReadData(_lpData, _pos) + self.InfoList.append(temInfoList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xB3 + self.Head.SubCmd = 0x11 + self.Count = 0 + self.InfoList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 2 + for i in range(self.Count): + length += self.InfoList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + InfoList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagGCTalkCache=tagGCTalkCache() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTalkCache.Head.Cmd,m_NAtagGCTalkCache.Head.SubCmd))] = m_NAtagGCTalkCache + + +#------------------------------------------------------ # B5 04 拍卖行新上架拍品 #tagGCAddAuctionItemInfo class tagGCAddAuctionItem(Structure): -- Gitblit v1.8.0