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