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