From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:24 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py |  390 ++++++++++++++++++++-----------------------------------
 1 files changed, 145 insertions(+), 245 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py
index 477a6ee..066fc38 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py
@@ -39,7 +39,12 @@
 from Collections import DataServerPlayerData
 from Collections.CollectionDefine import *
 from Common import (CommFuncEx, mylog)
-from Protocol import MMORPGPack
+
+from Protocol import (MMORPGPack, RecvPackProtocol, SendPackProtocol, MergeServerRecvProtocol, MergeServerSendProtocol)
+import PlayerOfflineSupport
+import PyGameData
+import GameWorld
+import DBDataMgr
       
 ################################################################## 
                 ####### python逻辑入口 ####### 
@@ -130,18 +135,6 @@
         GMCommandResult(orderId, funcName, GMCommon.Def_GMDBEntranceFail)
         return 
    
-    
-    #test
-    #转发所有数据库
-#    SendDBRequest(CommonDefine.gstGMToolCmdSysDBRequest,OrderLen,OrderId,CmdLen,Cmd)
-#    SendDBRequest(CommonDefine.gstGMToolCmdLogDBRequest,OrderLen,OrderId,CmdLen,Cmd)
-#    SendDBRequest(CommonDefine.gstGMToolCmdUserDBRequest,OrderLen,OrderId,CmdLen,Cmd)
-#    SendLogicProcessRequest(CommonDefine.gstGMToolCmdLogicProcessRequest,OrderLen,OrderId,CmdLen,Cmd)
-    #转发GameServer
-    #SendGMToolCommandToGameServer(pack)
-    
-    #回复GM工具
-    #SendToGMToolCommandResult(OrderLen,OrderId,CmdLen,Cmd,UserDataLen,UserData)
         
     #-----------------------
     mylog.info('ProjSpecialProcess OnGMToolCommand Done')
@@ -158,180 +151,138 @@
     #返回修改后的包
     return pack
 
-################
-# Sys库请求处理  #
-################
-## Sys库请求处理
-#  @param None 
-#  @return None
-def OnGMToolCmdSysDBRequest(sysdb,pack):
-    mylog.info('ProjSpecialProcess OnGMToolCmdSysDBRequest IN')
-    #读取封包数据
-    recvPack = RecvPackProtocol.tagGMCommandDBRequest()
-    recvPack.ReadData(pack.getBuffer())
-    OrderLen = recvPack.OrderLen
-    OrderId = recvPack.OrderId
-    DataLen = recvPack.DataLen
-    Data = recvPack.Data
-    #-----------------------
-    #项目组对自定义请求进行处理
-    #-----------------------
-    
-    
-    
-    #-----------------------
-    mylog.info('ProjSpecialProcess OnGMToolCmdSysDBRequest Done')
-    return
 
 
-################
-# Log库请求处理  #
-################
-## Log库请求处理
-#  @param None 
-#  @return None
-def OnGMToolCmdLogDBRequest(logdb,pack):
-    mylog.info('ProjSpecialProcess OnGMToolCmdLogDBRequest IN')
-    #读取封包数据
-    recvPack = RecvPackProtocol.tagGMCommandDBRequest()
-    recvPack.ReadData(pack.getBuffer())
-    OrderLen = recvPack.OrderLen
-    OrderId = recvPack.OrderId
-    DataLen = recvPack.DataLen
-    Data = recvPack.Data
-    #-----------------------
-    #项目组对自定义请求进行处理
-    #-----------------------
-    # 查询返回
-    gmCmdOrderMgr = GetGMOrderMgr()
-    cmdManger = gmCmdOrderMgr.GetCmd(OrderId)
-    cmdManger.LogDBRequestResponse(logdb, Data)
-    #-----------------------
-    mylog.info('ProjSpecialProcess OnGMToolCmdLogDBRequest Done')
-    return
-
-
-################
-# User库请求处理 #
-################
-## User库请求处理
-#  @param None 
-#  @return None
-def OnGMToolCmdUserDBRequest(userdb,pack):
-    mylog.info('ProjSpecialProcess OnGMToolCmdUserDBRequest IN')
-    #读取封包数据
-    recvPack = RecvPackProtocol.tagGMCommandDBRequest()
-    recvPack.ReadData(pack.getBuffer())
-    OrderLen = recvPack.OrderLen
-    OrderId = recvPack.OrderId
-    DataLen = recvPack.DataLen
-    Data = recvPack.Data
-    #-----------------------
-    #项目组对自定义请求进行处理
-    #-----------------------
-    
-    # 查询返回
-    gmCmdOrderMgr = GetGMOrderMgr()
-    cmdManger = gmCmdOrderMgr.GetCmd(OrderId)
-    execType, execInfo = UpdatePackData(userdb, cmdManger)
-    # 如果是错误类型直接执行返回结果
-    if execType < GMCommon.Def_ResultTypeMax:
-        cmdManger.GMCmdExecuteResult(execType, execInfo)
-        return
-    cmdManger.UserDBRequestResponse(userdb, Data)    
-    #-----------------------
-    mylog.info('ProjSpecialProcess OnGMToolCmdUserDBRequest Done')
-    return
-
-## 更新包数据
-#  @param None 
-#  @return None
-def UpdatePackData(userdb, gmCmdManger):
-    
-    # 个人补偿GM工具
-    # 由于GameServer处理多个玩家补偿同一物品时只收一次命令包处理(只插入一条物品数据)
-    # 故此处先查出多个玩家账号/昵称对应的playerID,更改命令字典信息后,压入包,再推给GameServer
-    if gmCmdManger.funcName in ["GMT_AddPersonalCompensation", "GMT_CompensationQueryPersonal"]:
-        gmCmdDict = gmCmdManger.gmCmdDict
-        playerList = gmCmdDict.get("playerList", '')
-        playerList = playerList.split(",")
-        
-        if not playerList:
-            return GMCommon.Def_ParamErr, ''
-    
-        playerIDList = []
-        queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
-        if queryType == GMCommon.Def_GMKey_FamilyID:
-            # 根据家族ID的不处理,直接推
-            return GMCommon.Def_SendToGameServer, ""
-        
-        playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
-        
-        for playerFind in playerList:
-            playerAccID = ""
-            # 玩家姓名
-            if queryType == GMCommon.Def_GMKey_PlayerName:
-                playerAccID = GMCommon.GetPlayerAccID(userdb, {'PlayerName':fix_incomingText(playerFind), 'IsDeleted':0})
-            
-            elif queryType == GMCommon.Def_GMKey_PlayerAccID:
-                playerAccID = GMCommon.GetPlayerAccID(userdb, {'AccID':fix_incomingText(playerFind), 'IsDeleted':0})
-            
-            if playerAccID == '':
-                return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
-            
-            collection = userdb[UCN_DBPlayer]   
-            dbPlayer = DataServerPlayerData.tagDBPlayer()
-            dbPlayer.IsDeleted = 0
-        
-            loadOK = dbPlayer.adoLoadCEx(collection, {'AccID':fix_incomingText(playerAccID),
-                                                          'IsDeleted':dbPlayer.IsDeleted})    
-            if not loadOK:
-                return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
-            
-            playerIDList.append(dbPlayer.PlayerID)
-    
-        gmCmdManger.gmCmdDictUnEncode["PlayerIDList"] = str(playerIDList)
-        
-        updatePack = RecvPackProtocol.tagGMCommand()
-        updatePack.OrderId = str(gmCmdManger.orderId)
-        updatePack.OrderLen = len(updatePack.OrderId)
-        updatePack.Cmd = str(gmCmdManger.gmCmdDictUnEncode)
-        updatePack.CmdLen = len(updatePack.Cmd)
-        updatePack.UserData = str(gmCmdManger.userData)
-        updatePack.UserDataLen = len(updatePack.UserData)
-        
-        # 更新pack数据
-        # mmoRPGPack = MMORPGPack.MMORPGPacket()
-        # mmoRPGPack.setBuffer(updatePack.GetBuffer())
-        # gmCmdManger.pack = mmoRPGPack
-    
-    return GMCommon.Def_SendToGameServer, ""
-
-
-################
-#逻辑线程请求处理 #
-################
-## 逻辑线程请求处理
-#  @param None 
-#  @return None
-def OnGMToolCmdLogicProcessRequest(pack):
-    mylog.info('ProjSpecialProcess OnGMToolCmdLogicProcessRequest IN')
-    #读取封包数据
-    recvPack = RecvPackProtocol.tagGMCommandDBRequest()
-    recvPack.ReadData(pack.getBuffer())
-    OrderLen = recvPack.OrderLen
-    OrderId = recvPack.OrderId
-    DataLen = recvPack.DataLen
-    Data = recvPack.Data
-    #-----------------------
-    #项目组对自定义请求进行处理
-    #-----------------------
-    
-    #-----------------------
-    mylog.info('ProjSpecialProcess OnGMToolCmdLogicProcessRequest Done')
-    return
 
 ################################################################## 
+
+def GMCmdPlayerListValidationID(gmCmdDict):
+    '''后台GM工具玩家列表命令通用验证
+    @param gmCmdDict: 命令参数字典
+    @return: GMCommon.Def_xxx, idList or errorInfo
+                                非 Def_Success 的错误类型        -    代表错误,可直接返回给后台
+            Def_Success, playerIDList    -  待处理的玩家ID列表
+    '''
+    playerList = gmCmdDict.get("playerList", '')
+    playerList = playerList.split(",")
+    if not playerList:
+        return GMCommon.Def_ParamErr, ""
+    
+    playerIDList = []
+    queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')    
+    if queryType in [GMCommon.Def_GMKey_PlayerName, GMCommon.Def_GMKey_PlayerAccID]:
+        for playerFind in playerList:
+            if queryType == GMCommon.Def_GMKey_PlayerName:
+                rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
+            elif queryType == GMCommon.Def_GMKey_PlayerAccID:
+                rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
+            else:
+                continue
+            
+            if not rec:
+                # db找不到就是不存在该玩家
+                return GMCommon.Def_NoTag, "%s can not found!" % str(playerFind)
+            
+            playerID = rec.get(u'PlayerID', 0)
+            playerIDList.append(playerID)
+            
+    elif queryType == GMCommon.Def_GMKey_FamilyID:
+        # 根据家族ID的直接返回
+        familyMgr = DBDataMgr.GetFamilyMgr()
+        for familyID in eval(playerList):
+            familyID = GameWorld.ToIntDef(familyID)
+            family = familyMgr.FindFamily(familyID)
+            if not family:
+                GameWorld.DebugLog("    not family %s" % familyID)
+                continue
+            memberIDList = family.GetMemberIDList()
+            playerIDList += memberIDList
+            
+    if not playerIDList:
+        return GMCommon.Def_ParamErr, ""
+    
+    return GMCommon.Def_Success, playerIDList
+
+def GMCmdPlayerValidationID(gmCmdDict):
+    '''后台GM工具玩家命令通用验证
+    @param gmCmdDict: 命令参数字典
+    @return: GMCommon.Def_xxx, playerID
+                                非 Def_Success 的错误类型        -    代表错误,可直接返回给后台
+            Def_Success, playerID    -    本服玩家ID
+    '''
+    
+    queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
+    playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
+    
+    if len(playerFind) <= 0:
+        return GMCommon.Def_ParamErr, None
+    
+    # 玩家姓名
+    if queryType == GMCommon.Def_GMKey_PlayerName:
+        rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
+    elif queryType == GMCommon.Def_GMKey_PlayerAccID:
+        rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
+    else:
+        return GMCommon.Def_ParamErr, None
+    
+    if not rec:
+        # db找不到就是不存在该玩家
+        return GMCommon.Def_NoTag, None
+    
+    playerID = rec.get(u'PlayerID', 0)
+    return GMCommon.Def_Success, playerID
+
+def GMCmdPlayerValidation(gmCmdDict, offlineSupport=True):
+    '''后台GM工具玩家命令通用验证
+    @param gmCmdDict: 命令参数字典
+    @param offlineSupport: 离线玩家是否支持该命令,默认支持,当玩家离线时,会在上线后执行该命令
+    @return: GMCommon.Def_xxx, curPlayer
+                                非 Def_Success 的错误类型        -    代表错误,可直接返回给后台
+            Def_Success, curPlayer    -    curPlayer为空时代表玩家离线状态
+    '''
+    
+    queryType = gmCmdDict.get(GMCommon.Def_GMKey_QueryType, '')
+    playerFind = gmCmdDict.get(GMCommon.Def_GMKey_PlayerFind, '')
+    
+    if len(playerFind) <= 0:
+        return GMCommon.Def_ParamErr, None
+    
+    # 玩家姓名
+    if queryType == GMCommon.Def_GMKey_PlayerName:
+        rec = PyGameData.g_usrCtrlDB.findDBPlayerByName(playerFind)
+    elif queryType == GMCommon.Def_GMKey_PlayerAccID:
+        rec = PyGameData.g_usrCtrlDB.findDBPlayerByAccID(playerFind)
+    else:
+        return GMCommon.Def_ParamErr, None
+    
+    if not rec:
+        # db找不到就是不存在该玩家
+        return GMCommon.Def_NoTag, None
+    
+    playerID = rec.get(u'PlayerID', 0)
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if not curPlayer or curPlayer.IsEmpty():
+        # 离线处理
+        if offlineSupport:
+            PlayerOfflineSupport.AddOfflineUnprocessed(playerID, "GMToolCMD", gmCmdDict)
+            return GMCommon.Def_Success, None
+        return GMCommon.Def_PlayerOfLine, None
+    
+    return GMCommon.Def_Success, curPlayer
+
+def GMCmdPlayerLogin(curPlayer):
+    PlayerOfflineSupport.DoOfflineUnprocessed(curPlayer, "GMToolCMD", __doOfflineGMToolCMD)
+    return
+
+def __doOfflineGMToolCMD(curPlayer, recData, eventName, eventData):
+    gmCmdDict = eventData
+    if not gmCmdDict or not isinstance(gmCmdDict, dict):
+        return
+    funcName = gmCmdDict.get(GMCommon.Def_GMKey_Type, '')  
+    callFunc = GetExecFunc(Commands, "%s.%s" % (funcName, "OnExec"))
+    if callFunc != None:
+        callFunc(gmCmdDict)
+    return
 
 
 ## gm命令执行
@@ -365,71 +316,20 @@
     def GMToolCommand(self):
         callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "OnExec"))
         
-        execType = GMCommon.Def_SendToGameServer
+        execType = GMCommon.Def_Unknow
         execInfo = ''
         if callFunc != None:
-            execType, execInfo = callFunc(self.gmCmdDict)
-        
-        # 执行结果处理
-        self.GMCmdExecuteResult(execType, execInfo)
-        
-    ## 查询logdb
-    #  @param self
-    #  @param logdb
-    #  @param data:自定义数据
-    #  @return None
-    def LogDBRequestResponse(self, logdb, data):        
-        callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "LogDBResponse"))
-        
-        execType = GMCommon.Def_GMCmdNone
-        execInfo = ''
-        if callFunc != None:
-            execType, execInfo = callFunc(logdb, data, self.gmCmdDict)
-            
-        # 执行结果处理
-        self.GMCmdExecuteResult(execType, execInfo)
-        
-    ## 查询userdb
-    #  @param self
-    #  @param userdb
-    #  @param data:自定义数据
-    #  @return None
-    def UserDBRequestResponse(self, userdb, data):     
-        callFunc = GetExecFunc(Commands, "%s.%s"%(self.funcName, "UserDBResponse"))
-        
-        execType = GMCommon.Def_GMCmdNone
-        execInfo = ''
-        if callFunc != None:
-            execType, execInfo = callFunc(userdb, data, self.gmCmdDict)
-        
-        # 执行结果处理
-        self.GMCmdExecuteResult(execType, execInfo)
-
-    ## 执行返回结果处理
-    #  @param self
-    #  @param execType:操作类型
-    #  @param execInfo:自定义数据
-    #  @return None
-    def GMCmdExecuteResult(self, execType, execInfo):
-        
-        if execType == GMCommon.Def_DoQueryLogDB:
-            SendDBRequest(CommonDefine.gstGMToolCmdLogDBRequest,
-                           len(self.orderId), self.orderId, len(execInfo), execInfo)
+            ret = callFunc(self.gmCmdDict)
+            if isinstance(ret, int):
+                execType = ret
+            elif isinstance(ret, tuple):
+                execType = ret[0]
+                execInfo = ret[1]
                 
-        elif execType == GMCommon.Def_DoQueryUserDB:
-            SendDBRequest(CommonDefine.gstGMToolCmdUserDBRequest,
-                           len(self.orderId), self.orderId, len(execInfo), execInfo)
-            
-        elif execType == GMCommon.Def_SendToGameServer:
-            SendGMToolCommandToGameServer(self.pack)
-            # 删除改gm命令
-            GetGMOrderMgr().PopCmd(self.orderId)
+        GetGMOrderMgr().PopCmd(self.orderId)
+        GMCommandResult(self.orderId, self.funcName, execType, execInfo)
+        
 
-        else:
-            #gm命令回复, 删除改gm命令
-            GetGMOrderMgr().PopCmd(self.orderId)
-            GMCommandResult(self.orderId, self.funcName, execType, execInfo)
-        return 
     
 ## gm命令管理
 #
@@ -535,7 +435,7 @@
     resultMsg = json.dumps(resultDcit, ensure_ascii=False)
     
     mylog.info("gm result:%s"%resultMsg)
-    SendToGMToolCommandResult(len(orderId), orderId, len(resultMsg), resultMsg, len(useData), useData)
+    SendToGMToolCommandResult(orderId, resultMsg)
     return
 
 

--
Gitblit v1.8.0