From 3a995ca6bc096918388d9474897eeb0e604351ed Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 22 十一月 2019 10:55:24 +0800
Subject: [PATCH] 8346 【恺英】【后端】协助系统(增加DB协助表)

---
 ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py |  192 ++++++++++++++++++++++++++++++++++++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py    |   48 ++++++++++++
 2 files changed, 240 insertions(+), 0 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
index fe34525..49cdefa 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
@@ -42,6 +42,46 @@
     GameWorld.Log("LoadPyGameData!!id = %s %s"%(id(pyGameDataMgr), len(gameBuffer)))
     return pyGameDataMgr.LoadGameData(gameBuffer, pos)
 
+#协助表
+class PlayerAssistPyManager(object):
+    
+    def __init__(self):
+        self.playerAssistDict = {} # 所有协助 {GUID:tagDBAssist, ...}
+        self.familyAssistDict = {} # 仙盟协助缓存 {familyID:[tagDBAssist, ...], ...}
+        return
+    
+    # 保存数据 存数据库和realtimebackup
+    def GetSaveData(self):
+        savaData = ""
+        cntData = ""
+        cnt = 0
+        
+        for dbData in self.playerAssistDict.values():
+            cnt += 1
+            savaData += dbData.getBuffer()
+            
+        GameWorld.Log("Save DBAssist count :%s" % cnt)
+        return CommFunc.WriteDWORD(cntData, cnt) + savaData
+    
+    # 从数据库载入数据
+    def LoadPyGameData(self, datas, pos, dataslen):
+        cnt, pos = CommFunc.ReadDWORD(datas, pos)
+        GameWorld.Log("Load DBAssist count :%s" % cnt)
+        
+        for _ in xrange(cnt):
+            dbData = PyGameDataStruct.tagDBAssist()
+            dbData.clear()
+            pos += dbData.readData(datas, pos, dataslen)
+            
+            self.playerAssistDict[dbData.GUID] = dbData
+            familyID = dbData.FamilyID
+            if familyID not in self.familyAssistDict:
+                self.familyAssistDict[familyID] = []
+            familyAssistList = self.familyAssistDict[familyID]
+            familyAssistList.append(dbData)
+            
+        return pos
+    
 #玩家缓存管理,该类只做数据缓存存取,不写功能逻辑,防止重读脚本时功能逻辑脚本不生效
 class PlayerViewCachePyManager(object):
     
@@ -211,6 +251,7 @@
 
 class PyGameDataManager(object):
     def __init__(self):
+        self.PlayerAssistPyManager = PlayerAssistPyManager()
         self.PlayerViewCachePyManager = PlayerViewCachePyManager()
         self.AuctionAttentionManager = AuctionAttentionManager()
         self.AuctionRecordManager = AuctionRecordManager()
@@ -232,6 +273,7 @@
 
     def GetSaveData(self):
         buff = ""
+        buff += self.PlayerAssistPyManager.GetSaveData()
         buff += self.PlayerViewCachePyManager.GetSaveData()
         buff += self.AuctionAttentionManager.GetSaveData()
         buff += self.AuctionRecordManager.GetSaveData()
@@ -252,6 +294,7 @@
         return buff
     
     def LoadGameData(self, gameBuffer, pos):
+        pos = self.PlayerAssistPyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
         pos = self.PlayerViewCachePyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
         pos = self.AuctionAttentionManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
         pos = self.AuctionRecordManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
@@ -279,6 +322,11 @@
         PyGameData.g_pyGameDataManager = pyGameDataMgr
     return pyGameDataMgr
 
+def GetPlayerAssistPyManager():
+    # 协助表
+    pyGameDataMgr = GetPyGameDataManager()
+    return pyGameDataMgr.PlayerAssistPyManager
+
 def GetPlayerViewCachePyManager():
     # 拍卖记录表
     pyGameDataMgr = GetPyGameDataManager()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py
index 383f78c..70c0a92 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py
@@ -15,6 +15,198 @@
 from ctypes import (Structure, memset, memmove, sizeof, addressof, create_string_buffer, string_at)
 import CommFunc
 
+# 协助表 #tagDBAssist
+class tagDBAssist(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('GUID', ctypes.c_char * 40),
+        ('FamilyID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('Job', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('RealmLV', ctypes.c_ubyte),
+        ('AssistType', ctypes.c_ubyte),
+        ('AssistValue1', ctypes.c_ulong),
+        ('AssistValue2', ctypes.c_ulong),
+        ('AssistValue3', ctypes.c_ulong),
+        ('AssistValue4', ctypes.c_ulong),
+        ('AssistValue5', ctypes.c_ulong),
+        ('AssistDataLen', ctypes.c_ushort),
+        ('AssistData', ctypes.c_char_p),
+        ('FinishTime', ctypes.c_char * 19),
+        ('AssistState', ctypes.c_ubyte),
+        ('AssistPlayerLen', ctypes.c_ushort),
+        ('AssistPlayer', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.GUID = ''
+        self.FamilyID = 0
+        self.PlayerID = 0
+        self.PlayerName = ''
+        self.Job = 0
+        self.LV = 0
+        self.RealmLV = 0
+        self.AssistType = 0
+        self.AssistValue1 = 0
+        self.AssistValue2 = 0
+        self.AssistValue3 = 0
+        self.AssistValue4 = 0
+        self.AssistValue5 = 0
+        self.AssistDataLen = 0
+        self.AssistData = ''
+        self.FinishTime = ''
+        self.AssistState = 0
+        self.AssistPlayerLen = 0
+        self.AssistPlayer = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            return -1
+        if len(buf) < pos + self.getLength():
+            return -1
+        self.clear()
+        self.GUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Job, pos = CommFunc.ReadBYTE(buf, pos)
+        self.LV, pos = CommFunc.ReadWORD(buf, pos)
+        self.RealmLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.AssistType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.AssistValue1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AssistValue2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AssistValue3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AssistValue4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AssistValue5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AssistDataLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.AssistDataLen)
+        self.AssistData = ctypes.c_char_p(tmp)
+        self.FinishTime, pos = CommFunc.ReadString(buf, pos, 19)
+        self.AssistState, pos = CommFunc.ReadBYTE(buf, pos)
+        self.AssistPlayerLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.AssistPlayerLen)
+        self.AssistPlayer = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.GUID)
+        buf = CommFunc.WriteDWORD(buf, self.FamilyID)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName)
+        buf = CommFunc.WriteBYTE(buf, self.Job)
+        buf = CommFunc.WriteWORD(buf, self.LV)
+        buf = CommFunc.WriteBYTE(buf, self.RealmLV)
+        buf = CommFunc.WriteBYTE(buf, self.AssistType)
+        buf = CommFunc.WriteDWORD(buf, self.AssistValue1)
+        buf = CommFunc.WriteDWORD(buf, self.AssistValue2)
+        buf = CommFunc.WriteDWORD(buf, self.AssistValue3)
+        buf = CommFunc.WriteDWORD(buf, self.AssistValue4)
+        buf = CommFunc.WriteDWORD(buf, self.AssistValue5)
+        buf = CommFunc.WriteWORD(buf, self.AssistDataLen)
+        buf = CommFunc.WriteString(buf, self.AssistDataLen, self.AssistData)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 19, self.FinishTime)
+        buf = CommFunc.WriteBYTE(buf, self.AssistState)
+        buf = CommFunc.WriteWORD(buf, self.AssistPlayerLen)
+        buf = CommFunc.WriteString(buf, self.AssistPlayerLen, self.AssistPlayer)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.AssistDataLen
+        length += sizeof(ctypes.c_char) * 19
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += self.AssistPlayerLen
+        return length
+
+    def outputString(self):
+        output = '''// 协助表 #tagDBAssist:
+            GUID = %s,
+            FamilyID = %s,
+            PlayerID = %s,
+            PlayerName = %s,
+            Job = %s,
+            LV = %s,
+            RealmLV = %s,
+            AssistType = %s,
+            AssistValue1 = %s,
+            AssistValue2 = %s,
+            AssistValue3 = %s,
+            AssistValue4 = %s,
+            AssistValue5 = %s,
+            AssistDataLen = %s,
+            AssistData = %s,
+            FinishTime = %s,
+            AssistState = %s,
+            AssistPlayerLen = %s,
+            AssistPlayer = %s,
+            ADOResult = %s,
+            '''%(
+                self.GUID,
+                self.FamilyID,
+                self.PlayerID,
+                self.PlayerName,
+                self.Job,
+                self.LV,
+                self.RealmLV,
+                self.AssistType,
+                self.AssistValue1,
+                self.AssistValue2,
+                self.AssistValue3,
+                self.AssistValue4,
+                self.AssistValue5,
+                self.AssistDataLen,
+                self.AssistData,
+                self.FinishTime,
+                self.AssistState,
+                self.AssistPlayerLen,
+                self.AssistPlayer,
+                self.ADOResult,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGUID(self,Str):
+        if len(Str)<=40:
+            self.GUID = Str
+        else:
+            self.GUID = Str[:40]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetFinishTime(self,Str):
+        if len(Str)<=19:
+            self.FinishTime = Str
+        else:
+            self.FinishTime = Str[:19]
+            
+            
 # 玩家数据查看缓存表Py #tagPlayerViewCachePy
 class tagPlayerViewCachePy(Structure):
     _pack_ = 1

--
Gitblit v1.8.0