From 7d3e60ddbd25e5dbc58450b8f5595bb431303330 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 31 十月 2025 19:12:25 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(词条技能1020;增加效果5050 - 触发释放技能(按累计能量达到时释放))
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/ProjSpecialProcess.py | 394 +++++++++++++++++++++-----------------------------------
1 files changed, 148 insertions(+), 246 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..bfa759a 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,22 @@
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)
-
- 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)
-
+ ret = callFunc(self.gmCmdDict)
+ if isinstance(ret, int):
+ execType = ret
+ elif isinstance(ret, tuple):
+ execType = ret[0]
+ execInfo = ret[1]
else:
- #gm命令回复, 删除改gm命令
- GetGMOrderMgr().PopCmd(self.orderId)
- GMCommandResult(self.orderId, self.funcName, execType, execInfo)
- return
+ execType = GMCommon.Def_GMCmdNone
+
+ GetGMOrderMgr().PopCmd(self.orderId)
+ GMCommandResult(self.orderId, self.funcName, execType, execInfo)
+
+
## gm命令管理
#
@@ -535,7 +437,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