From b1e0ad47775be0a4eb065824d4cd1855f1a51b48 Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期四, 15 五月 2025 22:23:22 +0800 Subject: [PATCH] 0312 同步遗漏更新导致的问题,暂未同步以下内容 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py | 182 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 177 insertions(+), 5 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py index a5b0d62..34d0053 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py @@ -44,6 +44,8 @@ import DataRecordPack import GameWorld import CtrlDB +import base64 + #------------------------------------------------------------------------------- @@ -76,9 +78,11 @@ port = DBConfig.IDDispatchServerPort addr = (host, port) BUF_SIZE = 1024 + curVersion = "" + centerVersion = "" try: cfGameVer = ConfigParser.ConfigParser() - cfGameVer.read("GameVersion.ini") + cfGameVer.read(os.path.join(GlobalFunctions.getAppPath(), 'GameVersion.ini')) gameID = cfGameVer.get("config", "GameID") curVersion = cfGameVer.get("config", "Version") @@ -109,7 +113,7 @@ except: mylog.error("IDDispatch CheckGameVersion Connect unknown Exception") - return + return curVersion, centerVersion import thread lockPlayerID = thread.allocate_lock() @@ -390,6 +394,7 @@ if not PyGameData.g_UserCtrlDBFirstInit: PyGameData.g_UserCtrlDBFirstInit = True self.__PlayerBackupSave() + CheckGameVersion() #后续也要增加公共数据保存如家族等,考虑保存失败可以直接关闭地图 @@ -413,9 +418,16 @@ oFuncGrade.End() if requestType == CommonDefine.gstGeneralDBOper: - oFuncGrade = self.GetFuncGrade('gstMergeGeneralReturn') + oFuncGrade = self.GetFuncGrade('gstGeneralDBOper') oFuncGrade.Start() self.OnGeneralDBOper(db, pack) + oFuncGrade.End() + return True + + if requestType == CommonDefine.gstDBLogic: + oFuncGrade = self.GetFuncGrade('gstDBLogic') + oFuncGrade.Start() + self.OnGameServerToDBLogic(db, pack) oFuncGrade.End() return True @@ -1021,7 +1033,131 @@ self.sendGameServerDBOperResult(pack.getSessionID(), result, resultSet, errorMsg) return mylog.warning('oper %s not support!'%oper) + + + def OnGameServerToDBLogic(self, db, pack): + buf = pack.getBuffer() + recvPack = RecvPackProtocol.tagGDGameServerToDBLogic() + pos = 0 + recvPack.ReadData(buf, pos) + queryType = recvPack.QueryType + mylog.debug('pack = %s'%(recvPack.OutputString())) + if queryType == CommonDefine.gstDBLogic_PlayerPackDataReq: + #请求玩家打包数据 + playerID = recvPack.ID + packData = self.getPlayerPackData(playerID) # 有直接取,没有的话再从db整合数据 + if packData: + result = 1 + mylog.debug("packData get from cache. playerID=%s" % playerID) + else: + result, playerData = self.GetPlayerDataByPlayerID(db, playerID) + mylog.debug("packData get from db. playerID=%s,result=%s" % (playerID, result)) + if result: + packData = base64.b64encode(playerData) + self.updPlayerPackData(playerID, packData) + self.SendGameServerToDBLogicResult(pack.getSessionID(), result, recvPack, packData) + return + + if queryType == CommonDefine.gstDBLogic_PlayerPackDataUpd: + #更新玩家打包数据,仅子服用,不需要回复GameServer + playerID = recvPack.ID + packData = recvPack.Data + self.updPlayerPackData(playerID, packData) + return + + if queryType == CommonDefine.gstDBLogic_GMCmd: + dbAnswerList = GMShell.DBGMCommand(recvPack.Data) + self.SendGameServerToDBLogicResult(pack.getSessionID(), 1, recvPack, str(dbAnswerList)) + return + + return + + def SendGameServerToDBLogicResult(self, sessionID, result, recvPack, resultSet): + '''回复GameServer发送的SendDBLogic,可以不回复,由具体类型决定 + @param result: 结果:1成功,0失败 + @param recvPack: GameServer发来的数据包,Data可原值返回,也可修改后返回,由具体类型决定 + @param resultSet: 回复数据 + ''' + sendPack = SendPackProtocol.tagDGGameServerToDBLogicResult() + sendPack.Type = CommonDefine.dgDBGameServerToDBLogicResult + sendPack.Result = result + sendPack.ID = recvPack.ID + sendPack.QueryType = recvPack.QueryType + sendPack.Data = recvPack.Data + sendPack.DataLen = len(sendPack.Data) + sendPack.ResultSet = resultSet + sendPack.ResultSetLen = len(sendPack.ResultSet) + self.packSend(sessionID, 0, 0, CommonDefine.atInner, MMORPGPack.stGame, + MMORPGPack.stData, sendPack.GetBuffer()) + + mylog.debug("回复 SendGameServerToDBLogicResult") + return + + def GetPlayerDataByPlayerID(self, db, playerID): + dbPlayer = DataServerPlayerData.tagDBPlayer() + dbPlayer.PlayerID = playerID + collection = db[UCN_DBPlayer] + loadOK = dbPlayer.adoLoadCEx(collection, {'PlayerID':playerID}) + if not loadOK: + mylog.warning('GetPlayerDataByPlayerID Exception playerID = %s'%(dbPlayer.PlayerID)) + return 0, '' + + #测试 + mylog.info("accid = %s"%(dbPlayer.AccID)) + + #读取物品等其他数据 + queryDict = {'PlayerID':dbPlayer.PlayerID} + collection = db[UCN_RoleItem] + itemData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleItem, True) + + collection = db[UCN_RoleMission] + missionData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMission) + + collection = db[UCN_RoleMissionDict] + roleMissionDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleMissionDict) + + collection = db[UCN_RoleSkill] + roleSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleSkill) + + collection = db[UCN_RoleBuff] + roleBuffData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleBuff) + + collection = db[UCN_RoleRepeatTime] + roleRepeatTimeData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleRepeatTime) + + collection = db[UCN_PlayerHorseTable] + roleHorseData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerHorseTable) + + collection = db[UCN_GMOper] + gmOperData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagGMOper) + + collection = db[UCN_RolePet] + rolePetData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRolePet) + + collection = db[UCN_PetSkill] + petSkillData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPetSkill) + + collection = db[UCN_RoleNomalDict] + roleNormalDictData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagRoleNomalDict) + + collection = db[UCN_PlayerDienstgrad] + roleDienstgradData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagPlayerDienstgrad) + + collection = db[UCN_BattleFormation] + battleFormationData = self.readPlayerPackSaveData(collection, queryDict, DataServerPlayerData.tagBattleFormation) + + #读取禁止IP数据 + gmIP = DataServerPlayerData.tagDBGMIP() + gmIP.AccID = dbPlayer.AccID.lower() + collection = db[UCN_DBGMIP] + gmIPData = gmIP.adoQueryIndex(collection) + + return 1, dbPlayer.getBuffer() + itemData + missionData + roleMissionDictData + roleSkillData + roleBuffData + roleRepeatTimeData + roleHorseData + gmOperData\ + + gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData + + + # 查询返回0/1 代表是否成功 def OnMergeQueryRegisterResult(self, db, pack): g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict @@ -1737,7 +1873,7 @@ return (False, playerRec.PlayerID, '') oFuncGrade.End() #记录下线日志流向 - if playerRec.FacePic == 0: # 约定为下线标识 + if playerRec.CountryLastWeekHornor == 0: # 约定为下线标识 self.recPlayerLogoff(playerRec) #保存物品等其他数据 #不再支持单表模式 @@ -3176,7 +3312,7 @@ if len(infoList) > 3: accountRec.DeviceFlag = md5.md5(infoList[1]).hexdigest() # 倒数第二个元素为客户端版本号 仙宝奇缘新定义 - accountRec.ClientVersion = infoList[-2] + accountRec.SetClientVersion(infoList[-2]) PegasusCollectorProxy.EventReport(9001, "OperatorID=%s&Step=%s&AccountID=%s&Flag=1000&DeviceFlag=%s"%( accountRec.AppID, 1, CommFunc.GetPlatformAccID(authAccID), accountRec.DeviceFlag)) @@ -3286,6 +3422,32 @@ def onGetGameServerPlayerData(self, db, pack): data = '' + #玩家打包数据表较大,不同步GameServer,由db自己管理 + #collection = db[UCN_DBPlayerPackData] + #DBPlayerPackData = DataServerPlayerData.tagDBPlayerPackData() + #data += DBPlayerPackData.adoQueryAll(collection) + #mylog.debug("tagDBPlayerPackData ok") + + collection = db[UCN_DBGameRec] + DBGameRec = DataServerPlayerData.tagDBGameRec() + data += DBGameRec.adoQueryAll(collection) + mylog.debug("tagDBGameRec ok") + + collection = db[UCN_DBPyFuncTeam] + DBPyFuncTeam = DataServerPlayerData.tagDBPyFuncTeam() + data += DBPyFuncTeam.adoQueryAll(collection) + mylog.debug("tagDBPyFuncTeam ok") + + collection = db[UCN_DBPyFuncTeamMem] + DBPyFuncTeamMem = DataServerPlayerData.tagDBPyFuncTeamMem() + data += DBPyFuncTeamMem.adoQueryAll(collection) + mylog.debug("tagDBPyFuncTeamMem ok") + + collection = db[UCN_DBPlayerRecData] + DBPlayerRecData = DataServerPlayerData.tagDBPlayerRecData() + data += DBPlayerRecData.adoQueryAll(collection) + mylog.debug("tagDBPlayerRecData ok") + collection = db[UCN_DBPyMineAreaAward] DBPyMineAreaAward = DataServerPlayerData.tagDBPyMineAreaAward() data += DBPyMineAreaAward.adoQueryAll(collection) @@ -3696,6 +3858,11 @@ #mylog.debug("GameData = %s"%b2a_hex(decompressGameData)) gameDataReadPos = 0 try: + #gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db) @@ -3827,6 +3994,11 @@ #mylog.debug("GameData = %s"%b2a_hex(decompressGameData)) gameDataReadPos = 0 try: + #gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerPackData, DataServerPlayerData.tagDBPlayerPackData, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeam, DataServerPlayerData.tagDBPyFuncTeam, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyFuncTeamMem, DataServerPlayerData.tagDBPyFuncTeamMem, db) + gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPlayerRecData, DataServerPlayerData.tagDBPlayerRecData, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaAward, DataServerPlayerData.tagDBPyMineAreaAward, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaRecord, DataServerPlayerData.tagDBPyMineAreaRecord, db) gameDataReadPos = self.savegameServerWorldData(decompressGameData, gameDataReadPos, UCN_DBPyMineAreaItem, DataServerPlayerData.tagDBPyMineAreaItem, db) -- Gitblit v1.8.0