#!/usr/bin/python # -*- coding: GBK -*- # ##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py # @todo: # # @author: Alee # @date 2017-8-21 ÏÂÎç02:06:00 # @version 1.0 # # @note: pyÊý¾Ý±£´æuser¿â£¬ÏÈÔÚRegistPySaveDataÖÐ×¢²á£¬±£´æÊ±µ÷ÓöÔÓ¦º¯Êý£¬mongo½ÓÊÕ´¦Àí # #--------------------------------------------------------------------- import GameWorld import PlayerSocial import PlayerFamilyStore import PlayerBourse import GameWorldBoss import PlayerSealDemon import PlayerXMZZ import binascii import PyGameData import CrossRealmPK import AuctionHouse import PyGameDataStruct import CommFunc def GetSavePyData(): pyGameDataMgr = GetPyGameDataManager() result = pyGameDataMgr.GetSaveData() GameWorld.DebugLog("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£¬µ«ÊÇ¿ÉÒÔÕý³£±£´æ£¬´íÎó»áÔÚÏ´ε÷ÓñãÒ˽ӿڲŻᴥ·¢ # ÔÝʱ¸Ä³É×Ö·û´®·µ»Ø£¬ÔÝÎÞ½â¾ö·½°¸ return str(len(result)) + "|" + result def LoadPyGameData(gameBuffer, pos): pyGameDataMgr = GetPyGameDataManager() GameWorld.Log("LoadPyGameData!!id = %s %s"%(id(pyGameDataMgr), len(gameBuffer))) return pyGameDataMgr.LoadGameData(gameBuffer, pos) #Íæ¼Ò»º´æ¹ÜÀí£¬¸ÃÀàÖ»×öÊý¾Ý»º´æ´æÈ¡£¬²»Ð´¹¦ÄÜÂß¼­£¬·ÀÖ¹ÖØ¶Á½Å±¾Ê±¹¦ÄÜÂß¼­½Å±¾²»ÉúЧ class PlayerViewCachePyManager(object): def __init__(self): self.playerViewCachePyDict = {} # Íæ¼Ò»º´æ {playerID:tagPlayerViewCachePy, ...} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for dbData in self.playerViewCachePyDict.values(): cnt += 1 savaData += dbData.getBuffer() GameWorld.Log("Save PlayerViewCachePy count :%s" % cnt) 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) for _ in xrange(cnt): dbData = PyGameDataStruct.tagPlayerViewCachePy() dbData.clear() pos += dbData.readData(datas, pos, dataslen) self.playerViewCachePyDict[dbData.PlayerID] = dbData return pos #ÅÄÂô¼Ç¼¹ÜÀí£¬¸ÃÀàÖ»×öÊý¾Ý»º´æ´æÈ¡£¬²»Ð´¹¦ÄÜÂß¼­£¬·ÀÖ¹ÖØ¶Á½Å±¾Ê±¹¦ÄÜÂß¼­½Å±¾²»ÉúЧ class AuctionRecordManager(object): def __init__(self): self.myAuctionItemRecordDict = {} # ÎÒµÄÅÄÆ·¼Ç¼ {playerID:[tagDBAuctionRecord, ...], ...} self.myBidItemRecordDict = {} # ÎҵľºÅļǼ {playerID:[tagDBAuctionRecord, ...], ...} self.familyAuctionItemRecordDict = {} # ÏÉÃËÅÄÆ·¼Ç¼ {familyID:[tagDBAuctionRecord, ...], ...} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for recordDict in [self.myAuctionItemRecordDict, self.myBidItemRecordDict, self.familyAuctionItemRecordDict]: for recordList in recordDict.values(): for dbData in recordList: cnt += 1 savaData += dbData.getBuffer() GameWorld.Log("Save AuctionRecord count :%s" % cnt) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load AuctionRecord count :%s" % cnt) for _ in xrange(cnt): dbData = PyGameDataStruct.tagDBAuctionRecord() dbData.clear() pos += dbData.readData(datas, pos, dataslen) AuctionHouse.AddNewAuctionRecord(dbData) return pos #ÅÄÂô¹Ø×¢¹ÜÀí£¬¸ÃÀàÖ»×öÊý¾Ý»º´æ´æÈ¡£¬²»Ð´¹¦ÄÜÂß¼­£¬·ÀÖ¹ÖØ¶Á½Å±¾Ê±¹¦ÄÜÂß¼­½Å±¾²»ÉúЧ class AuctionAttentionManager(object): def __init__(self): self.playerAttentionDict = {} # Íæ¼Ò¹Ø×¢ÅÄÂôÆ·ID {playerID:tagDBAuctionAttention, ...} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for dbData in self.playerAttentionDict.values(): cnt += 1 savaData += dbData.getBuffer() GameWorld.Log("Save AuctionAttention count :%s" % cnt) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load AuctionAttention count :%s" % cnt) for _ in xrange(cnt): dbData = PyGameDataStruct.tagDBAuctionAttention() dbData.clear() pos += dbData.readData(datas, pos, dataslen) self.playerAttentionDict[dbData.PlayerID] = dbData AuctionHouse.OnLoadAuctionAttentionDataEx(dbData) return pos def __InitAuctionAttentionAttrEx(self, attentionData): ## ³õʼ»¯ÅÄÂô¹Ø×¢ÊµÀý¸½¼ÓÊôÐÔ setattr(attentionData, "AttentionItemIDList", []) if attentionData.AttentionInfo.startswith("[") and attentionData.AttentionInfo.endswith("]"): attentionData.AttentionItemIDList = eval(attentionData.AttentionInfo) return #ÅÄÂôÎïÆ·Êý¾Ý»º´æ£¬¸ÃÀàÖ»×öÊý¾Ý»º´æ´æÈ¡£¬²»Ð´¹¦ÄÜÂß¼­£¬·ÀÖ¹ÖØ¶Á½Å±¾Ê±¹¦ÄÜÂß¼­½Å±¾²»ÉúЧ class AuctionItemManager(): def __init__(self): self.allAuctionItemDict = {} # ËùÓÐÅÄÆ·×ֵ仺´æ {ItemGUID:tagDBAuctionItem, ...} self.allAuctionItemByEndTimeList = [] # ¸ù¾Ý½áÊøÊ±¼äÅÅÐòµÄËùÓÐÅÄÆ·»º´æ [tagDBAuctionItem, ...] self.worldAuctionItemList = [] # È«·þÅÄÆ·ÁÐ±í»º´æ [tagDBAuctionItem, ...] self.worldAuctionItemQueryDict = {} # È«·þÅÄÆ·¹ýÂ˲éѯ»º´æ£¬Ìí¼ÓÅÄÆ·Ê±ÖØÖà {(job, (itemType, ...), itemClassLV, (itemID, ...)):[tagDBAuctionItem, ...], ...} self.familyAuctionItemDict = {} # ÏÉÃËÅÄÆ·ÁÐ±í»º´æ£¬°üº¬×ªÒƵ½È«·þµÄÏÉÃËÅÄÆ· {familyID:[tagDBAuctionItem, ...], ...} self.sysBuyoutItemByTimeList = [] # ϵͳһ¿Ú¼ÛÅÄÆ·°´Ê±¼äÅÅÐò»º´æ [tagDBAuctionItem, ...] self.nowBiddingAuctionItemDict = {} # Íæ¼Òµ±Ç°ÊÇ×î¸ß¾º¼ÛµÄÅÄÆ·£¬º¬ËùÓÐÅÄÆ· {playerID:[tagDBAuctionItem, ...], ...} self.hisBiddingAuctionItemDict = {} # Íæ¼ÒÔø¾­²ÎÓë¹ý¾º¼ÛµÄÅÄÆ·£¬º¬ËùÓÐÅÄÆ· {playerID:[tagDBAuctionItem, ...], ...} self.myAuctionItemDict = {} # Íæ¼ÒÅÄÂôÖеÄÎïÆ· £¬²»°üº¬ÏÉÃËÅÄÆ·£¬ÓÉǰ¶Ë½çÃæ×ÔÐÐÕûºÏÊý¾Ý {playerID:[tagDBAuctionItem, ...], ...} self.myAttentionItemDict = {} # Íæ¼Ò¹Ø×¢ÖеÄÎïÆ· £¬²»°üº¬ÏÉÃËÅÄÆ·£¬ÓÉǰ¶Ë½çÃæ×ÔÐÐÕûºÏÊý¾Ý£¬Ö»±£´æÔÚÏßµÄÍæ¼Ò£¬ÀëÏßÇå³ý£¬ÉÏÏß²»Í¬²½£¬ÓÉǰ¶Ë²éѯ {playerID:[tagDBAuctionItem, ...], ...} self.worldAuctionItemCountDict = {} # È«·þÅÄÆ·ÎïÆ·ID¶ÔÓ¦¼þÊýͳ¼Æ {itemID:¼þÊý, ...} self.worldAuctionJobEquipCountDict = {} # È«·þÅÄÆ·Ö°Òµ×°±¸¶ÔÓ¦¼þÊýͳ¼Æ {(Ö°Òµ,½×,ÑÕÉ«,ÊÇ·ñÌ××°):¼þÊý, ...} self.worldAuctionReplenishTimeDict = {} # È«·þÅÄÆ·¶¯Ì¬ÉϼÜÀúÊ·´¦Àíʱ¼ä {cfgID:time, ...} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for dbData in self.allAuctionItemDict.values(): cnt += 1 savaData += dbData.getBuffer() GameWorld.Log("Save AuctionItem count :%s" % cnt) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load AuctionItem count :%s" % cnt) for _ in xrange(cnt): dbData = PyGameDataStruct.tagDBAuctionItem() dbData.clear() pos += dbData.readData(datas, pos, dataslen) self.allAuctionItemDict[dbData.ItemGUID] = dbData AuctionHouse.OnLoadAuctionItemDataEx(dbData) AuctionHouse.OnLoadAuctionItemDataOK() return pos # ¸öÈËÉç½»Ïà¹Ø±í # ºÃÓÑ±í£¬³ðÈË±í£¬×î½üÁªÏµÈË£¬ºÚÃûµ¥£¬ËÄÕÅ±í¹«ÓõÄÉç½»ÐÅÏ¢±í class PyGameDataManager(object): def __init__(self): self.PlayerViewCachePyManager = PlayerViewCachePyManager() self.AuctionAttentionManager = AuctionAttentionManager() self.AuctionRecordManager = AuctionRecordManager() self.AuctionItemManager = AuctionItemManager() self.crossPKUnNotifyOverInfo = CrossRealmPK.CrossPKUnNotifyOverInfoManager() self.crossPKBillboard = CrossRealmPK.CrossPKBillboardManager() self.XMZZManager = PlayerXMZZ.XMZZManager() self.sealDemonManager = PlayerSealDemon.SealDemonManager() self.bossAttentionManager = GameWorldBoss.BossAttentionManager() self.bourseItemLastPriceManager = PlayerBourse.BourseItemLastPriceManager() self.bourseRecordManager = PlayerBourse.BourseRecordManager() self.familyStoreItemManager = PlayerFamilyStore.FamilyStoreItemManager() self.friendManager = PlayerSocial.FriendManager() self.enemyManager = PlayerSocial.EnemyManager() self.contactsManager = PlayerSocial.ContactsManager() self.blacklistManager = PlayerSocial.BlacklistManager() self.socialInfoManager = PlayerSocial.SocialInfoManager() return def GetSaveData(self): buff = "" buff += self.PlayerViewCachePyManager.GetSaveData() buff += self.AuctionAttentionManager.GetSaveData() buff += self.AuctionRecordManager.GetSaveData() buff += self.AuctionItemManager.GetSaveData() buff += self.crossPKUnNotifyOverInfo.GetSaveData() buff += self.crossPKBillboard.GetSaveData() buff += self.XMZZManager.GetSaveData() buff += self.sealDemonManager.GetSaveData() buff += self.bossAttentionManager.GetSaveData() buff += self.bourseItemLastPriceManager.GetSaveData() buff += self.bourseRecordManager.GetSaveData() buff += self.familyStoreItemManager.GetSaveData() buff += self.friendManager.GetSaveData() buff += self.enemyManager.GetSaveData() buff += self.contactsManager.GetSaveData() buff += self.blacklistManager.GetSaveData() buff += self.socialInfoManager.GetSaveData() return buff def LoadGameData(self, gameBuffer, pos): pos = self.PlayerViewCachePyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.AuctionAttentionManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.AuctionRecordManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.AuctionItemManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.crossPKUnNotifyOverInfo.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.crossPKBillboard.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.XMZZManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.sealDemonManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.bossAttentionManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.bourseItemLastPriceManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.bourseRecordManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.familyStoreItemManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.friendManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.enemyManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.contactsManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.blacklistManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) pos = self.socialInfoManager.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) return pos def GetPyGameDataManager(): ## pyÊý¾Ý¿â±íÊý¾Ý¹ÜÀíÆ÷ pyGameDataMgr = PyGameData.g_pyGameDataManager if not pyGameDataMgr: pyGameDataMgr = PyGameDataManager() PyGameData.g_pyGameDataManager = pyGameDataMgr return pyGameDataMgr def GetPlayerViewCachePyManager(): # ÅÄÂô¼Ç¼±í pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.PlayerViewCachePyManager def GetAuctionItemManager(): ## ÅÄÂôÎïÆ·»º´æÊý¾Ý¹ÜÀí pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.AuctionItemManager def GetAuctionAttentionManager(): # ÅÄÂô¼Ç¼±í pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.AuctionAttentionManager def GetAuctionRecordManager(): # ÅÄÂô¼Ç¼±í pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.AuctionRecordManager # ¿ç·þ¾º¼¼³¡Î´Í¨ÖªÍæ¼ÒµÄ±ÈÈü½á¹û def GetCrossPKUnNotifyOverInfoManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.crossPKUnNotifyOverInfo # ¿ç·þ¾º¼¼³¡ÅÅÐаñ¹ÜÀí def GetCrossPKBillboardManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.crossPKBillboard # ÏÉħ֮Õù¹ÜÀí def GetXMZZManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.XMZZManager # ·âħ̳½á¹û¹ÜÀí def GetSealDemonRecordManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.sealDemonManager # Boss¹Ø×¢¼Ç¼¹ÜÀí def GetBossAttentionManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.bossAttentionManager # ½»Ò×ËùÎïÆ·×î½ü³É½»µ¥¼Û¹ÜÀí def GetBourseItemLastPriceManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.bourseItemLastPriceManager # ½»Ò×Ëù¼Ç¼¹ÜÀí def GetBourseRecordManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.bourseRecordManager # Õ½Ã˲ֿâÎïÆ·¹ÜÀí def GetFamilyStoreItemManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.familyStoreItemManager # ºÃÓÑϵͳ def GetFriendManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.friendManager # Éç½»ÐÅÏ¢¹ÜÀí def GetPersonalSocialManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.socialInfoManager # ³ðÈËϵͳ def GetEnemyManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.enemyManager # ×î½üÁªÏµÈËϵͳ def GetContactsManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.contactsManager # ºÚÃûµ¥ÏµÍ³ def GetBlacklistManager(): pyGameDataMgr = GetPyGameDataManager() return pyGameDataMgr.blacklistManager