From 4e6d5af98a0e0810ddfe2cc0faaec2832f865bd6 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 20 五月 2025 15:23:30 +0800
Subject: [PATCH] 15 卡牌服务端搭建 - 地图增加FindStr接口;玩家下线保存,python增加MapCallDB调用DB逻辑

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py |  186 ++++++++++++++-------------------------------
 1 files changed, 59 insertions(+), 127 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 7ea3eda..6459dcf 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
@@ -556,19 +556,13 @@
             oFuncGrade.End()
             return True
         if requestType == CommonDefine.gstUpdate:
-            if DBConfig.IsOpenDbSaveServer:
-                msg = error.formatMsg('DeployError', error.ERROR_NO_56, "DbSaveServer is  open, type = %d request should be send to PyMongoDBSaveServer"%CommonDefine.gstUpdate)
-                mylog.DeployError(msg, True)
-                return False
-            
             oFuncGrade = self.GetFuncGrade("gstUpdate")
             oFuncGrade.Start()  
             if self.IsMergeServer():
-                if not self.onSaveMapServerPlayerDataMergeServer(db, pack):
-                    mylog.error("onSaveMapServerPlayerDataMergeServer failed!sessionID = 0x%X", pack.getPackHead().sessionID)
+                self.onSaveMapServerPlayerDataMergeServer(db, pack)
             else:
-                if not self.onSaveMapServerPlayerData(db, pack):
-                    mylog.error("onSaveMapServerPlayerData failed!sessionID = 0x%X", pack.getPackHead().sessionID)
+                self.onSaveMapServerPlayerData(db, pack)
+
             oFuncGrade.End()
             return True
         if requestType == CommonDefine.gstSavePlayerInfo:
@@ -1506,124 +1500,62 @@
         g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
         '''玩家下线,跨服服务器下线不保存'''
         pos = 1    #跳过gstUpdate
-        buf = pack.getBuffer()
-        length = pack.getLength()
-        type, pos = CommFunc.ReadBYTE(buf, pos)
-        if type == CommonDefine.gstPlayerDetail:
-            needReturn, pos = CommFunc.ReadBYTE(buf, pos)
-            packCrcPos = pos
-            packCrc, pos = CommFunc.ReadDWORD(buf, pos)
-            serverTypePos = pos
-            serverType, pos = CommFunc.ReadBYTE(buf, pos)
-            if serverType == MMORPGPack.stMin:
-                #其他服务器未发现异常,检查CRC
-                saveData, pos = CommFunc.ReadString(buf, pos, length - pos)
-                calcCrc = CommFunc.ToDWORD(crc32(saveData))
-                if not packCrc == calcCrc:
-                    #CRC校验错误
-                    serverTypeData = chr(MMORPGPack.stData)
-                    buf = buf[:serverTypePos] + serverTypeData+ buf[(serverTypePos + 1):]
-                    self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:])
-                    return (False, 0)
-                else:
-                    pass    #正常情况
-            else:
-                self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:])
-                return (False,0)
+        saveData, pos = CommFunc.ReadString(pack.getBuffer(), pos, pack.getLength() - pos)
+        
+        
+        # 与策划约定 离线超过3分钟则必须从子服再次登录汇报新数据
+        # 为了避免 g_mergeRegisterPlayerDict 占用过多内存,每10分钟清除一次已下线数据
+        result, playerID, accID = self.__ReadPlayerID(db, saveData)
+        
+        # 保存跨服数据主要是为了避免短时间断线重连玩家数据不对应,如坐标又回到了起点 
+        if accID in g_mergeRegisterPlayerDict:
+            g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_LogoutTime] = time()
+            g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].Data = saveData
+            g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].DataLen = len(saveData)
             
-            # 与策划约定 离线超过3分钟则必须从子服再次登录汇报新数据
-            # 为了避免 g_mergeRegisterPlayerDict 占用过多内存,每10分钟清除一次已下线数据
-            result, playerID, accID = self.__ReadPlayerID(db, saveData)
-            
-            # 保存跨服数据主要是为了避免短时间断线重连玩家数据不对应,如坐标又回到了起点 
-            if accID in g_mergeRegisterPlayerDict:
-                g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_LogoutTime] = time()
-                g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].Data = saveData
-                g_mergeRegisterPlayerDict[accID][MergeRegPInfoIndex_PackData].DataLen = len(saveData)
-                
-                mylog.info("onSaveMapServerPlayerDataMergeServer result = %s, playerID = %s, sessionID = 0x%X" 
-                           % (result, playerID, pack.getPackHead().sessionID))
-            #回报
-            if needReturn:
-                updateReturn = SendPackProtocol.tagDBUpdateReturn()
-                updateReturn.CallType = CommonDefine.dgUpDate
-                updateReturn.UpdateType = CommonDefine.gstPlayerDetail
-                updateReturn.Result = result
-                updateReturn.PlayerID = playerID
-                self.sendString(pack, updateReturn.GetBuffer())
-            return (result, playerID)
+            mylog.info("onSaveMapServerPlayerDataMergeServer result = %s, playerID = %s" % (result, playerID))
+
+        return (result, playerID)
     
     def onSaveMapServerPlayerData(self, db, pack):
         '''玩家下线,保存玩家在MapServer的数据'''
         pos = 1    #跳过gstUpdate
-        buf = pack.getBuffer()
-        length = pack.getLength()
-        type, pos = CommFunc.ReadBYTE(buf, pos)
-        if type == CommonDefine.gstPlayerDetail:
-            needReturn, pos = CommFunc.ReadBYTE(buf, pos)
-            packCrcPos = pos
-            packCrc, pos = CommFunc.ReadDWORD(buf, pos)
-            serverTypePos = pos
-            serverType, pos = CommFunc.ReadBYTE(buf, pos)
-            if serverType == MMORPGPack.stMin:
-                #其他服务器未发现异常,检查CRC
-                saveData, pos = CommFunc.ReadString(buf, pos, length - pos)
-                calcCrc = CommFunc.ToDWORD(crc32(saveData))
-                if not packCrc == calcCrc:
-                    #CRC校验错误
-                    serverTypeData = chr(MMORPGPack.stData)
-                    buf = buf[:serverTypePos] + serverTypeData+ buf[(serverTypePos + 1):]
-                    self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:])
-                    return (False, 0)
-                else:
-                    pass    #正常情况
-            else:
-                self.onSavePlayerDataCRCError(db, pack, buf[packCrcPos:])
-                return (False,0)
-            #正常情况
-            #保存数据
-            result = False
-            playerID = 0
-            if DBConfig.PackSave:
-                result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData)
-            else:
-                result, playerID, accID = self.SavePlayerMapServerData(db, saveData)
-            if not result:
-                #保存失败
-                sessionID = pack.getPackHead().sessionID
-                msg = error.formatMsg('error', error.ERROR_NO_59, 'Player save data failed!sessionID = %s'%sessionID)
-                mylog.error(msg)
-                
-                DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', '%s.mdat'%sessionID, buf[pos:])      
-#                self.sendString(pack, updateReturn.GetBuffer())
-#                return
-            #回报
-            if needReturn:
-                updateReturn = SendPackProtocol.tagDBUpdateReturn()
-                updateReturn.CallType = CommonDefine.dgUpDate
-                updateReturn.UpdateType = CommonDefine.gstPlayerDetail
-                updateReturn.Result = result
-                updateReturn.PlayerID = playerID
-                self.sendString(pack, updateReturn.GetBuffer())
-                
-            # 玩家下线恢复充值兑换中的订单,IsProcee为1,但endtime为空的情况
-            self.RevoverBillProcess(db, accID)
-            mylog.info("onSaveMapServerPlayerData result = %s, playerID = %s, sessionID = 0x%X"%(result, playerID, pack.getPackHead().sessionID))
+        saveData, pos = CommFunc.ReadString(pack.getBuffer(), pos, pack.getLength() - pos)
+    
+        #正常情况
+        #保存数据
+        result = False
+        playerID = 0
+        if DBConfig.PackSave:
+            result, playerID, accID = self.SavePlayerMapServerDataEx(db, saveData)
+        else:
+            result, playerID, accID = self.SavePlayerMapServerData(db, saveData)
+        if not result:
+            #保存失败
+            msg = error.formatMsg('error', error.ERROR_NO_59, 'Player save data failed!playerID = %s'%playerID)
+            mylog.error(msg)
             
-            # 下线成功入库后同步移动玩家备档备份文件夹
-            PlayerBakDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID))
-            if os.path.exists(PlayerBakDir):
-                BakCopyDir = os.path.join(PlayerBakDir, "Backup")
-                for filename in os.listdir(PlayerBakDir):
-                    if not filename.endswith(DBConfig.PlayerBakFileType):
-                        continue
-                    fullPath = os.path.join(PlayerBakDir, filename)
-                    if not os.path.exists(os.path.join(BakCopyDir, filename)):
-                        shutil.move(fullPath, BakCopyDir)
-                    else:
-                        os.remove(fullPath)
-                        
-            return (result, playerID)
+            DataDumper.DumpData(GlobalFunctions.getAppPath(), 'UserLogs\\SaveFailDump', '%s.mdat'%playerID, saveData)      
+
+            
+        # 玩家下线恢复充值兑换中的订单,IsProcee为1,但endtime为空的情况
+        self.RevoverBillProcess(db, accID)
+        mylog.info("onSaveMapServerPlayerData result = %s, playerID = %s"%(result, playerID))
+        
+        # 下线成功入库后同步移动玩家备档备份文件夹
+        PlayerBakDir = os.path.join(DBConfig.PlayerBakRoot, str(playerID))
+        if os.path.exists(PlayerBakDir):
+            BakCopyDir = os.path.join(PlayerBakDir, "Backup")
+            for filename in os.listdir(PlayerBakDir):
+                if not filename.endswith(DBConfig.PlayerBakFileType):
+                    continue
+                fullPath = os.path.join(PlayerBakDir, filename)
+                if not os.path.exists(os.path.join(BakCopyDir, filename)):
+                    shutil.move(fullPath, BakCopyDir)
+                else:
+                    os.remove(fullPath)
+                    
+        return (result, playerID)
     
     def __PlayerBackupSave(self):
         db = self.db
@@ -2187,12 +2119,12 @@
             if self.updatePlayerAccState(db, playerRec.PlayerID, CommonDefine.pysForbidden):
                 #封号成功,记录封号日志
                 self.sendAccForbiddenLogReq(playerRec.AccID, 1)
-        #回报保存失败
-        updateReturn = SendPackProtocol.tagDBUpdateReturn()
-        updateReturn.CallType = CommonDefine.dgUpDate
-        updateReturn.UpdateType = CommonDefine.gstPlayerDetail
-        updateReturn.Result = 0
-        self.sendString(pack, updateReturn.GetBuffer())
+        # #回报保存失败
+        # updateReturn = SendPackProtocol.tagDBUpdateReturn()
+        # updateReturn.CallType = CommonDefine.dgUpDate
+        # updateReturn.UpdateType = CommonDefine.gstPlayerDetail
+        # updateReturn.Result = 0
+        # self.sendString(pack, updateReturn.GetBuffer())
     
     def sendAccForbiddenLogReq(self, accid, isForbidden):
         return

--
Gitblit v1.8.0