ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
@@ -14,7 +14,10 @@
import GameWorld
import PlayerSocial
import CrossBillboard
import CrossFamilyGCZ
import PlayerFamilyStore
import PlayerCompensation
import PlayerBourse
import GameWorldBoss
import PlayerSealDemon
@@ -23,13 +26,28 @@
import PyGameData
import CrossRealmPK
import AuctionHouse
import PlayerAssist
import GameRecData
import PlayerRecData
import PlayerViewCache
import GameWorldMineArea
import PyGameDataStruct
import PlayerPackData
import PlayerFuncTeam
import IpyGameDataPY
import PlayerCharm
import PlayerLove
import CommFunc
import time
def GetSavePyData():
    #存储数据前,一些功能业务数据先转化为存档数据
    CrossFamilyGCZ.OnSavePyData()
    pyGameDataMgr = GetPyGameDataManager()
    result = pyGameDataMgr.GetSaveData()
    GameWorld.DebugLog("GetSavePyData!! id = %s-%s"%(id(pyGameDataMgr), len(result)))
    GameWorld.Log("GetSavePyData!! id = %s-%s"%(id(pyGameDataMgr), len(result)))
    result = binascii.b2a_hex(result)
    #GameWorld.DebugLog("GetSavePyData!! result = %s-%s"%(result, len(result)))
    # 字节码在C++转化会发生错误must be string without null bytes, not str,但是可以正常保存,错误会在下次调用便宜接口才会触发
@@ -40,13 +58,58 @@
def LoadPyGameData(gameBuffer, pos):
    pyGameDataMgr = GetPyGameDataManager()
    GameWorld.Log("LoadPyGameData!!id = %s %s"%(id(pyGameDataMgr), len(gameBuffer)))
    return pyGameDataMgr.LoadGameData(gameBuffer, pos)
    pos = pyGameDataMgr.LoadGameData(gameBuffer, pos)
    #加载数据后,一些功能转化为功能业务数据
    CrossFamilyGCZ.OnLoadPyData()
    return pos
#玩家缓存管理,该类只做数据缓存存取,不写功能逻辑,防止重读脚本时功能逻辑脚本不生效
class PlayerViewCachePyManager(object):
#协助感谢表
class PlayerAssistThanksPyManager(object):
    
    def __init__(self):
        self.playerViewCachePyDict = {} # 玩家缓存 {playerID:tagPlayerViewCachePy, ...}
        self.allAssistThanksList = [] # 所有感谢 [tagDBAssistThanks, ...]
        self.playerThanksDict = {} # 玩家未感谢的 {playerID:[tagDBAssistThanks, ...], ...}
        self.assistPlayerThanksDict = {} # 协助玩家未接受感谢的协助 {assistPlayerID:[tagDBAssistThanks, ...], ...}
        return
    # 保存数据 存数据库和realtimebackup
    def GetSaveData(self):
        PlayerAssist.RemoveOutofdateAssistThanks()
        savaData = ""
        cntData = ""
        cnt = 0
        for dbData in self.allAssistThanksList:
            cnt += 1
            PlayerAssist.OnSaveAssistThanksData(dbData)
            savaData += dbData.getBuffer()
        GameWorld.Log("Save DBAssistThanks count :%s len=%s" % (cnt, len(savaData)))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    # 从数据库载入数据
    def LoadPyGameData(self, datas, pos, dataslen):
        cnt, pos = CommFunc.ReadDWORD(datas, pos)
        GameWorld.Log("Load DBAssistThanks count :%s" % cnt)
        for _ in xrange(cnt):
            dbData = PyGameDataStruct.tagDBAssistThanks()
            dbData.clear()
            pos += dbData.readData(datas, pos, dataslen)
            PlayerAssist.OnInitAssistThanksData(self, dbData)
        return pos
#协助表
class PlayerAssistPyManager(object):
    def __init__(self):
        self.allAssistDict = {} # 所有协助 {GUID:tagDBAssist, ...}
        self.playerAssistDict = {} # 玩家发布的协助 {playerID:[tagDBAssist, ...], ...}
        self.playerAssistingDict = {} # 玩家正在协助中的协助,只能存在一条 {playerID:tagDBAssist, ...}
        return
    
    # 保存数据 存数据库和realtimebackup
@@ -55,24 +118,33 @@
        cntData = ""
        cnt = 0
        
        for dbData in self.playerViewCachePyDict.values():
        for dbData in self.allAssistDict.values():
            if not dbData.IsSaveDB:
                continue
            cnt += 1
            savaData += dbData.getBuffer()
            
        GameWorld.Log("Save PlayerViewCachePy count :%s" % cnt)
        GameWorld.Log("Save DBAssist count :%s len=%s" % (cnt, len(savaData)))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    
    # 从数据库载入数据
    def LoadPyGameData(self, datas, pos, dataslen):
        cnt, pos = CommFunc.ReadDWORD(datas, pos)
        GameWorld.Log("Load PlayerViewCachePy count :%s" % cnt)
        GameWorld.Log("Load DBAssist count :%s" % cnt)
        
        for _ in xrange(cnt):
            dbData = PyGameDataStruct.tagPlayerViewCachePy()
            dbData = PyGameDataStruct.tagDBAssist()
            dbData.clear()
            pos += dbData.readData(datas, pos, dataslen)
            
            self.playerViewCachePyDict[dbData.PlayerID] = dbData
            PlayerAssist.OnInitAssistData(dbData, 1)
            self.allAssistDict[dbData.GUID] = dbData
            PlayerID = dbData.PlayerID
            if PlayerID not in self.playerAssistDict:
                self.playerAssistDict[PlayerID] = []
            playerAssistList = self.playerAssistDict[PlayerID]
            playerAssistList.append(dbData)
            
        return pos
    
@@ -91,13 +163,21 @@
        cntData = ""
        cnt = 0
        
        unSaveCnt = 0
        curTime = int(time.time())
        vaildSeconds = IpyGameDataPY.GetFuncCfg("AuctionHouse", 1) * 3600 * 24
        for recordDict in [self.myAuctionItemRecordDict, self.myBidItemRecordDict, self.familyAuctionItemRecordDict]:
            for recordList in recordDict.values():
                for dbData in recordList:
                    if vaildSeconds:
                        recordTime = GameWorld.ChangeTimeStrToNum(dbData.RecordTime)
                        if curTime - recordTime > vaildSeconds:
                            unSaveCnt += 1
                            continue
                    cnt += 1
                    savaData += dbData.getBuffer()
                    
        GameWorld.Log("Save AuctionRecord count :%s" % cnt)
        GameWorld.Log("Save AuctionRecord count :%s len=%s unSaveCnt=%s" % (cnt, len(savaData), unSaveCnt))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    
    # 从数据库载入数据
@@ -131,7 +211,7 @@
            cnt += 1
            savaData += dbData.getBuffer()
            
        GameWorld.Log("Save AuctionAttention count :%s" % cnt)
        GameWorld.Log("Save AuctionAttention count :%s len=%s" % (cnt, len(savaData)))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    
    # 从数据库载入数据
@@ -187,7 +267,7 @@
            cnt += 1
            savaData += dbData.getBuffer()
            
        GameWorld.Log("Save AuctionItem count :%s" % cnt)
        GameWorld.Log("Save AuctionItem count :%s len=%s" % (cnt, len(savaData)))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    
    # 从数据库载入数据
@@ -211,7 +291,23 @@
class PyGameDataManager(object):
    def __init__(self):
        self.PlayerViewCachePyManager = PlayerViewCachePyManager()
        self.DBPlayerPackDataManager = PlayerPackData.DBPlayerPackDataManager() # 该表GameServer只做内存处理,不从db取,也不发db入库,由db自行处理
        self.DBGameRecDataManager = GameRecData.DBGameRecDataManager()
        self.DBPyFuncTeamManager = PlayerFuncTeam.DBPyFuncTeamManager()
        self.DBPyFuncTeamMemManager = PlayerFuncTeam.DBPyFuncTeamMemManager()
        self.DBPlayerRecDataManager = PlayerRecData.DBPlayerRecDataManager()
        self.DBPyMineAreaAwardManager = GameWorldMineArea.DBPyMineAreaAwardManager()
        self.DBPyMineAreaRecordManager = GameWorldMineArea.DBPyMineAreaRecordManager()
        self.DBPyMineAreaItemManager = GameWorldMineArea.DBPyMineAreaItemManager()
        self.DBPyCoupleManager = PlayerLove.DBPyCoupleManager()
        self.DBPyUnNotifyLoveGiftRecManager = PlayerLove.DBPyUnNotifyLoveGiftRecManager()
        self.DBPyCharmValueRecManager = PlayerCharm.DBPyCharmValueRecManager()
        self.IntimacyManager = PlayerSocial.IntimacyManager()
        self.CrossPersonalCompensationManager = PlayerCompensation.CrossPersonalCompensationManager()
        self.CrossBillboardManager = CrossBillboard.CrossBillboardManager()
        self.PlayerAssistThanksPyManager = PlayerAssistThanksPyManager()
        self.PlayerAssistPyManager = PlayerAssistPyManager()
        self.PlayerViewCachePyManager = PlayerViewCache.PlayerViewCachePyManager()
        self.AuctionAttentionManager = AuctionAttentionManager()
        self.AuctionRecordManager = AuctionRecordManager()
        self.AuctionItemManager = AuctionItemManager()
@@ -232,6 +328,21 @@
    def GetSaveData(self):
        buff = ""
        buff += self.DBGameRecDataManager.GetSaveData()
        buff += self.DBPyFuncTeamManager.GetSaveData()
        buff += self.DBPyFuncTeamMemManager.GetSaveData()
        buff += self.DBPlayerRecDataManager.GetSaveData()
        buff += self.DBPyMineAreaAwardManager.GetSaveData()
        buff += self.DBPyMineAreaRecordManager.GetSaveData()
        buff += self.DBPyMineAreaItemManager.GetSaveData()
        buff += self.DBPyCoupleManager.GetSaveData()
        buff += self.DBPyUnNotifyLoveGiftRecManager.GetSaveData()
        buff += self.DBPyCharmValueRecManager.GetSaveData()
        buff += self.IntimacyManager.GetSaveData()
        buff += self.CrossPersonalCompensationManager.GetSaveData()
        buff += self.CrossBillboardManager.GetSaveData()
        buff += self.PlayerAssistThanksPyManager.GetSaveData()
        buff += self.PlayerAssistPyManager.GetSaveData()
        buff += self.PlayerViewCachePyManager.GetSaveData()
        buff += self.AuctionAttentionManager.GetSaveData()
        buff += self.AuctionRecordManager.GetSaveData()
@@ -252,6 +363,21 @@
        return buff
    
    def LoadGameData(self, gameBuffer, pos):
        pos = self.DBGameRecDataManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyFuncTeamManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyFuncTeamMemManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPlayerRecDataManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyMineAreaAwardManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyMineAreaRecordManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyMineAreaItemManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyCoupleManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyUnNotifyLoveGiftRecManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.DBPyCharmValueRecManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.IntimacyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.CrossPersonalCompensationManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.CrossBillboardManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        pos = self.PlayerAssistThanksPyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer))
        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))
@@ -278,6 +404,26 @@
        pyGameDataMgr = PyGameDataManager()
        PyGameData.g_pyGameDataManager = pyGameDataMgr
    return pyGameDataMgr
def GetCrossPersonalCompensationManager():
    # 跨服个人补偿邮件管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.CrossPersonalCompensationManager
def GetCrossBillboardManager():
    # 跨服排行榜管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.CrossBillboardManager
def GetPlayerAssistThanksPyManager():
    # 协助感谢表
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.PlayerAssistThanksPyManager
def GetPlayerAssistPyManager():
    # 协助表
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.PlayerAssistPyManager
def GetPlayerViewCachePyManager():
    # 拍卖记录表
@@ -339,6 +485,66 @@
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.familyStoreItemManager
def GetDBGameRecDataManager():
    # 通用记录表新管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBGameRecDataManager
def GetDBPlayerPackDataManager():
    # 玩家打包数据管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPlayerPackDataManager
def GetDBPyFuncTeamManager():
    # 功能队伍管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyFuncTeamManager
#def GetDBPyFuncTeamMemManager():
#    # 功能队伍成员管理
#    pyGameDataMgr = GetPyGameDataManager()
#    return pyGameDataMgr.DBPyFuncTeamMemManager
def GetDBPlayerRecDataManager():
    # 玩家记录管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPlayerRecDataManager
def GetDBPyMineAreaAwardManager():
    # 福地奖励结算管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyMineAreaAwardManager
def GetDBPyMineAreaRecordManager():
    # 福地矿物记录管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyMineAreaRecordManager
def GetDBPyMineAreaItemManager():
    # 福地矿物管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyMineAreaItemManager
def GetDBPyCoupleManager():
    # 伴侣管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyCoupleManager
def GetDBPyUnNotifyLoveGiftRecManager():
    # 未通知的赠送礼物记录
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyUnNotifyLoveGiftRecManager
def GetDBPyCharmValueRecManager():
    # 魅力管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.DBPyCharmValueRecManager
def GetIntimacyManager():
    # 亲密管理
    pyGameDataMgr = GetPyGameDataManager()
    return pyGameDataMgr.IntimacyManager
# 好友系统
def GetFriendManager():
    pyGameDataMgr = GetPyGameDataManager()