#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerFuncTeam # # @todo:¹¦ÄܶÓÎé±í # @author hxp # @date 2025-05-28 # @version 1.0 # # ÏêϸÃèÊö: ¹¦ÄܶÓÎé±í£¬Ö§³Ö¿ç·þ # #------------------------------------------------------------------------------- #"""Version = 2025-05-28 10:00""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import IpyGameDataPY #import CrossBattlefield import CrossRealmPlayer import PlayerViewCache import ChPyNetSendPack #import CrossRealmMsg import PlayerControl import NetPackCommon import DBDataMgr import DirtyList import ChConfig # ¶ÓÎé²Ù×÷ Def_FuncTeamOPList = ( Def_FuncTeamOP_JoinApply, # ÉêÇë¼ÓÈë 1 Def_FuncTeamOP_JoinCancel, # ÉêÇëÈ¡Ïû 2 Def_FuncTeamOP_JoinAgree, # ͬÒâÈë¶Ó 3 Def_FuncTeamOP_JoinRefuse, # ¾Ü¾øÈë¶Ó 4 Def_FuncTeamOP_Exit, # Í˳ö¶ÓÎé 5 Def_FuncTeamOP_Kick, # Ìß³ö¶ÓÎé 6 Def_FuncTeamOP_Transfer, # תÈöӳ¤ 7 Def_FuncTeamOP_Dissolve, # ½âÉ¢¶ÓÎé 8 ) = range(1, 1 + 8) def IsOPLimitInAct(curPlayer, funcMapID): ## »î¶¯ÆÚ¼äÊÇ·ñÏÞÖÆ¶ÓÎé²Ù×÷ ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return if not ipyData.GetOPLimitInAct(): return isInAct = False if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield: isInAct = CrossBattlefield.GetCrossBattlefieldState() if isInAct: GameWorld.ErrLog("»î¶¯ÆÚ¼äÎÞ·¨²Ù×÷¶ÓÎé! funcMapID=%s" % funcMapID, curPlayer.GetPlayerID()) return isInAct def GetFuncTeamZoneID(funcMapID): zoneID = 0 if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield: zoneID = CrossBattlefield.GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID()) return zoneID #// B9 20 ´´½¨¹¦ÄܶÓÎé #tagCMCreateFuncTeam # #struct tagCMCreateFuncTeam #{ # tagHead Head; # DWORD FuncMapID; // ¹¦ÄܵØÍ¼ID»ò×Ô¶¨ÒåµÄ»î¶¯¹¦ÄÜID # DWORD FuncMapEx; // ¹¦ÄܵØÍ¼À©Õ¹£¬È粻ͬµÄ²ã¼¶ # BYTE NameLen; # char TeamName[NameLen]; // ¶ÓÎéÃû³Æ£¬¿ÉΪ¿Õ # WORD MinLV; //×îµÍµÈ¼¶ÏÞÖÆ # DWORD MinFightPower; //×îµÍÕ½Á¦ÏÞÖÆ£¬ÇóÓàÒÚ # DWORD MinFightPowerEx; //×îµÍÕ½Á¦ÏÞÖÆ£¬Õû³ýÒÚ # BYTE ServerOnly; //ÊÇ·ñ½ö±¾·þÍæ¼Ò¿É¼ÓÈ룬0-·ñ£¬1-ÊÇ # BYTE NeedCheck; //ÊÇ·ñÐèÒªÉóºË #}; def OnCreateFuncTeam(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() funcMapID = clientData.FuncMapID funcMapEx = clientData.FuncMapEx teamName = clientData.TeamName minLV = clientData.MinLV minFightPower = clientData.MinFightPower minFightPowerEx = clientData.MinFightPowerEx serverOnly = clientData.ServerOnly needCheck = clientData.NeedCheck if IsOPLimitInAct(curPlayer, funcMapID): return zoneID = GetFuncTeamZoneID(funcMapID) if not zoneID: return teamInfo = {"funcMapID":funcMapID, "funcMapEx":funcMapEx, "teamName":teamName, "minLV":minLV, "minFightPower":minFightPower, "minFightPowerEx":minFightPowerEx, "serverOnly":serverOnly, "needCheck":needCheck} dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamInfo":teamInfo, "cacheBase":PlayerViewCache.GetSyncCrossCacheBase(curPlayer)} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CreateFuncTeam, dataMsg) return #// B9 21 Ð޸ŦÄܶÓÎé #tagCMChangeFuncTeam # #struct tagCMChangeFuncTeam #{ # tagHead Head; # DWORD TeamID; # DWORD FuncMapID; // ¹¦ÄܵØÍ¼ID»ò×Ô¶¨ÒåµÄ»î¶¯¹¦ÄÜID # WORD MinLV; //×îµÍµÈ¼¶ÏÞÖÆ # DWORD MinFightPower; //×îµÍÕ½Á¦ÏÞÖÆ£¬ÇóÓàÒÚ # DWORD MinFightPowerEx; //×îµÍÕ½Á¦ÏÞÖÆ£¬Õû³ýÒÚ # BYTE ServerOnly; //ÊÇ·ñ½ö±¾·þÍæ¼Ò¿É¼ÓÈ룬0-·ñ£¬1-ÊÇ # BYTE NeedCheck; //ÊÇ·ñÐèÒªÉóºË #}; def OnChangeFuncTeam(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() teamID = clientData.TeamID funcMapID = clientData.FuncMapID minLV = clientData.MinLV minFightPower = clientData.MinFightPower minFightPowerEx = clientData.MinFightPowerEx serverOnly = clientData.ServerOnly needCheck = clientData.NeedCheck if IsOPLimitInAct(curPlayer, funcMapID): return zoneID = GetFuncTeamZoneID(funcMapID) if not zoneID: return teamInfo = {"teamID":teamID, "funcMapID":funcMapID, "minLV":minLV, "minFightPower":minFightPower, "minFightPowerEx":minFightPowerEx, "serverOnly":serverOnly, "needCheck":needCheck} dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamInfo":teamInfo, "cacheBase":PlayerViewCache.GetSyncCrossCacheBase(curPlayer)} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChangeFuncTeam, dataMsg) return #// B9 22 ¹¦ÄܶÓÎé³ÉÔ±²Ù×÷ #tagCMFuncTeamMemOP # #struct tagCMFuncTeamMemOP #{ # tagHead Head; # DWORD TeamID; # DWORD FuncMapID; // ¹¦ÄܵØÍ¼ID»ò×Ô¶¨ÒåµÄ»î¶¯¹¦ÄÜID # BYTE OPType; // 1-ÉêÇë¼ÓÈ룻2-ÉêÇëÈ¡Ïû£»3-ͬÒâÈë¶Ó£»4-¾Ü¾øÈë¶Ó£»5-Í˳ö¶ÓÎ飻6-Ìß³ö¶ÓÎ飻7-תÈöӳ¤£»8-½âÉ¢¶ÓÎ飻 # DWORD OPData; // ¿ÉÑ¡ #}; def OnFuncTeamMemOP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() teamID = clientData.TeamID funcMapID = clientData.FuncMapID opType = clientData.OPType opData = clientData.OPData if opType not in Def_FuncTeamOPList: return if IsOPLimitInAct(curPlayer, funcMapID): return zoneID = GetFuncTeamZoneID(funcMapID) if not zoneID: return dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamID":teamID, "funcMapID":funcMapID, "opType":opType, "opData":opData} dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer) CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FuncTeamMemOP, dataMsg) return #// B9 23 ²éÕÒ¹¦ÄܶÓÎéÁбí #tagCMQueryFuncTeam # #struct tagCMQueryFuncTeam #{ # tagHead Head; # DWORD FuncMapID; // ¹¦ÄܵØÍ¼ID»ò×Ô¶¨ÒåµÄ»î¶¯¹¦ÄÜID # DWORD FuncMapEx; // ¹¦ÄܵØÍ¼À©Õ¹£¬È粻ͬµÄ²ã¼¶£¬0´ú±íËùÓÐ # DWORD StartIndex; // ²é¿´µÄÆðʼË÷Òý£¬ ĬÈÏ0 # BYTE QueryCnt; // ²é¿´ÌõÊý£¬Ä¬ÈÏ20£¬×î´ó²»³¬¹ý100 # BYTE HaveSpace; // ÊÇ·ñÖ»²é¿´ÓпÕλÖõĶÓÎé # BYTE IDLimitType; // IDÏÞÖÆÀàÐÍ£º1-ͬÏÉÃ˶ӳ¤£»2-ͬServerGroupID¶Ó³¤£»3-ͬServerID¶Ó³¤ # BYTE SearchLen; # char SearchMsg[SearchLen]; // Ö¸¶¨ËÑË÷ʱÓÐÓ㬿ÉËÑË÷Ö¸¶¨¶ÓÎéID»òÄ£ºýËÑË÷¶ÓÎéÃû³Æ£¬ËÑË÷ʱ·µ»Ø×î¶àQueryCnt¸öÊýµÄ¶ÓÎé #}; def OnQueryFuncTeam(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() funcMapID = clientData.FuncMapID funcMapEx = clientData.FuncMapEx startIndex = clientData.StartIndex queryCnt = clientData.QueryCnt haveSpace = clientData.HaveSpace idLimitType = clientData.IDLimitType searchMsg = clientData.SearchMsg zoneID = GetFuncTeamZoneID(funcMapID) if not zoneID: return dataMsg = {"zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "funcMapEx":funcMapEx, "startIndex":startIndex, "queryCnt":queryCnt, "haveSpace":haveSpace, "idLimitType":idLimitType, "searchMsg":searchMsg} dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer) CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryFuncTeam, dataMsg) return #// B9 24 ²éÕÒÍæ¼Ò¹¦ÄܶÓÎé #tagCMQueryPlayerFuncTeam # #struct tagCMQueryPlayerFuncTeam #{ # tagHead Head; # DWORD FuncMapID; // ¹¦ÄܵØÍ¼ID»ò×Ô¶¨ÒåµÄ»î¶¯¹¦ÄÜID #}; def OnQueryPlayerFuncTeam(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() funcMapID = clientData.FuncMapID zoneID = GetFuncTeamZoneID(funcMapID) if not zoneID: return dataMsg = {"zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID} dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer) CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryFuncTeam, dataMsg) return def CrossServerMsg_FuncTeamInfo(msgData): ## ×Ó·þÊÕµ½¿ç·þÐÅÏ¢ - ¶ÓÎéË¢ÐÂÐÅÏ¢ infoType = msgData["infoType"] playerID = msgData["playerID"] funcMapID = msgData["funcMapID"] teamInfo = msgData["teamInfo"] teamID = msgData.get("teamID", 0) syncPlayerIDList = msgData.get("syncPlayerIDList", []) notifyMark = msgData.get("notifyMark", "") curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer: if notifyMark: PlayerControl.NotifyCode(curPlayer, notifyMark) if infoType == "QueryPlayerFuncTeam": if curPlayer: if teamInfo: Sync_FuncTeamRefresh(teamInfo, [playerID]) else: clientPack = ChPyNetSendPack.tagGCQueryPlayerFuncTeamRet() clientPack.FuncMapID = funcMapID clientPack.TeamID = 0 NetPackCommon.SendFakePack(curPlayer, clientPack) return if not teamInfo: # ²Ù×÷ºóûÓжÓÎéÐÅÏ¢ÁË£¬½âÉ¢ if infoType == "FuncTeamMemOP": Sync_FuncTeamDissolve(teamID, syncPlayerIDList) return Sync_FuncTeamRefresh(teamInfo, syncPlayerIDList) return def CrossServerMsg_FuncTeamDel(msgData): ## ×Ó·þÊÕµ½¿ç·þÐÅÏ¢ - ¶ÓÎéɾ³ý #"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":delTeamDict #zoneID = msgData["zoneID"] #funcMapID = msgData["funcMapID"] delTeamDict = msgData["delTeamDict"] for teamID, syncPlayerIDList in delTeamDict.items(): Sync_FuncTeamDissolve(teamID, syncPlayerIDList) return def CrossServerMsg_FuncTeamList(msgData): ## ×Ó·þÊÕµ½¿ç·þÐÅÏ¢ - ¶ÓÎéÁбí queryInfo = msgData["queryInfo"] loopIndex = msgData["loopIndex"] teamInfoList = msgData["teamInfoList"] playerID = queryInfo["playerID"] curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return clientPack = ChPyNetSendPack.tagGCFuncTeamList() clientPack.FuncMapID = queryInfo["funcMapID"] clientPack.FuncMapEx = queryInfo["funcMapEx"] clientPack.StartIndex = queryInfo["startIndex"] clientPack.QueryCnt = queryInfo["queryCnt"] clientPack.HaveSpace = queryInfo["haveSpace"] clientPack.IDLimitType = queryInfo["idLimitType"] clientPack.SearchMsg = queryInfo["searchMsg"] clientPack.SearchLen = len(clientPack.SearchMsg) clientPack.LoopIndex = loopIndex for teamInfo in teamInfoList: team = ChPyNetSendPack.tagGCFuncTeam() team.TeamID = teamInfo["TeamID"] team.CreateTime = teamInfo["CreateTime"] team.FuncMapEx = teamInfo["FuncMapEx"] team.TeamName = teamInfo["TeamName"] team.NameLen = len(team.TeamName) team.CaptainID = teamInfo["CaptainID"] team.MinLV = teamInfo["MinLV"] team.MinFightPower = teamInfo["MinFightPower"] % ChConfig.Def_PerPointValue team.MinFightPowerEx = teamInfo["MinFightPower"] / ChConfig.Def_PerPointValue team.ServerOnly = teamInfo["ServerOnly"] team.NeedCheck = teamInfo["NeedCheck"] team.Value1 = teamInfo["Value1"] team.Value2 = teamInfo["Value2"] memberList = [] for memberInfo in teamInfo["MemberList"]: mem = ChPyNetSendPack.tagGCFuncTeamMem() mem.ServerID = memberInfo.get("ServerID", 0) mem.PlayerID = memberInfo["PlayerID"] mem.Name = memberInfo.get("Name", "") mem.NameLen = len(mem.Name) mem.LV = memberInfo.get("LV", 0) mem.Job = memberInfo.get("Job", 0) mem.RealmLV = memberInfo.get("RealmLV", 0) mem.Face = memberInfo.get("Face", 0) mem.FacePic = memberInfo.get("FacePic", 0) mem.FightPower = memberInfo.get("FightPower", 0) % ChConfig.Def_PerPointValue mem.FightPowerEx = memberInfo.get("FightPower", 0) / ChConfig.Def_PerPointValue mem.Value1 = memberInfo["Value1"] mem.Value2 = memberInfo["Value2"] memberList.append(mem) team.MemberList = memberList team.MemberCount = len(team.MemberList) team.ApplyIDList = teamInfo["ApplyIDList"] team.ApplyCount = len(team.ApplyIDList) clientPack.TeamList.append(team) clientPack.TeamCount = len(clientPack.TeamList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_FuncTeamRefresh(teamInfo, syncPlayerIDList): ## ¹¦ÄܶÓÎéˢРif not teamInfo or not syncPlayerIDList: return syncPlayerList = [] playerManager = GameWorld.GetPlayerManager() for playerID in syncPlayerIDList: player = playerManager.FindPlayerByID(playerID) if player == None or not player.GetInitOK(): continue syncPlayerList.append(player) if not syncPlayerList: return clientPack = ChPyNetSendPack.tagGCFuncTeamRefresh() clientPack.TeamID = teamInfo["TeamID"] clientPack.CreateTime = teamInfo["CreateTime"] clientPack.FuncMapID = teamInfo["FuncMapID"] clientPack.FuncMapEx = teamInfo["FuncMapEx"] clientPack.TeamName = teamInfo["TeamName"] clientPack.NameLen = len(clientPack.TeamName) clientPack.CaptainID = teamInfo["CaptainID"] clientPack.MinLV = teamInfo["MinLV"] clientPack.MinFightPower = teamInfo["MinFightPower"] % ChConfig.Def_PerPointValue clientPack.MinFightPowerEx = teamInfo["MinFightPower"] / ChConfig.Def_PerPointValue clientPack.ServerOnly = teamInfo["ServerOnly"] clientPack.NeedCheck = teamInfo["NeedCheck"] clientPack.Value1 = teamInfo["Value1"] clientPack.Value2 = teamInfo["Value2"] memberInfoList = teamInfo["MemberList"] applyInfoList = teamInfo["ApplyList"] memberList = [] for memberInfo in memberInfoList: mem = ChPyNetSendPack.tagGCFuncTeamRefreshMem() mem.ServerID = memberInfo.get("ServerID", 0) mem.PlayerID = memberInfo["PlayerID"] mem.Name = memberInfo.get("Name", "") mem.NameLen = len(mem.Name) mem.LV = memberInfo.get("LV", 0) mem.Job = memberInfo.get("Job", 0) mem.RealmLV = memberInfo.get("RealmLV", 0) mem.Face = memberInfo.get("Face", 0) mem.FacePic = memberInfo.get("FacePic", 0) mem.FightPower = memberInfo.get("FightPower", 0) % ChConfig.Def_PerPointValue mem.FightPowerEx = memberInfo.get("FightPower", 0) / ChConfig.Def_PerPointValue mem.OfflineValue = memberInfo.get("OfflineValue", 0) mem.Value1 = memberInfo["Value1"] mem.Value2 = memberInfo["Value2"] memberList.append(mem) applyList, applyIDList = [], [] for applyInfo in applyInfoList: applyP = ChPyNetSendPack.tagGCFuncTeamRefreshApply() applyP.ServerID = applyInfo["ServerID"] applyP.PlayerID = applyInfo["PlayerID"] applyP.Name = applyInfo["Name"] applyP.NameLen = len(applyP.Name) applyP.LV = applyInfo["LV"] applyP.Job = applyInfo["Job"] applyP.RealmLV = applyInfo["RealmLV"] applyP.Face = applyInfo.get("Face", 0) applyP.FacePic = applyInfo.get("FacePic", 0) applyP.FightPower = applyInfo["FightPower"] % ChConfig.Def_PerPointValue applyP.FightPowerEx = applyInfo["FightPower"] / ChConfig.Def_PerPointValue applyList.append(applyP) applyIDList.append(applyInfo["PlayerID"]) clientPack.MemberList = memberList clientPack.MemberCount = len(clientPack.MemberList) clientPack.ApplyIDList = applyIDList clientPack.ApplyInfoList = applyList clientPack.ApplyCount = len(clientPack.ApplyInfoList) for player in syncPlayerList: NetPackCommon.SendFakePack(player, clientPack) return def Sync_FuncTeamDissolve(teamID, syncPlayerIDList): ## ¹¦ÄܶÓÎé½âÉ¢ if not teamID or not syncPlayerIDList: return syncPlayerList = [] playerManager = GameWorld.GetPlayerManager() for playerID in syncPlayerIDList: player = playerManager.FindPlayerByID(playerID) if player == None or not player.GetInitOK(): continue syncPlayerList.append(player) if not syncPlayerList: return clientPack = ChPyNetSendPack.tagGCFuncTeamDissolve() clientPack.TeamID = teamID for player in syncPlayerList: NetPackCommon.SendFakePack(player, clientPack) return ##-------------------------------------------------------------------------------------------------- def GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID): ## »ñÈ¡¹¦ÄܶÓÎé·ÖÇøÐÅÏ¢ funcZoneID = 0 serverGroupList = [] if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield: zoneIpyData = CrossBattlefield.GetCrossBattlefieldZoneIpyData(serverGroupID) if not zoneIpyData: return funcZoneID = zoneIpyData.GetZoneID() serverGroupList = zoneIpyData.GetServerGroupIDList() # ֻ֪ͨ¸Ã·ÖÇø·þÎñÆ÷ return funcZoneID, serverGroupList def ClientServerMsg_CreateFuncTeam(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - ¹¦ÄܶÓÎé´´½¨ zoneID = msgData["zoneID"] playerID = msgData["playerID"] teamInfo = msgData["teamInfo"] cacheBase = msgData["cacheBase"] funcMapID = teamInfo["funcMapID"] zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID) if not zoneInfo: return funcZoneID, _ = zoneInfo if zoneID != funcZoneID: GameWorld.ErrLog("¹¦ÄܶÓÎé·ÖÇø²»Ò»Ö£¬ÎÞ·¨´´½¨! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID) return canCreate, notifyMark = CheckCanCreateFuncTeam(playerID, teamInfo, zoneID) # ijЩ¹¦ÄÜ´´½¨Ç°¼ì²é if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield: pass newTeam = None teamID = 0 newTeamInfo = {} if canCreate: PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase) funcTeamMgr = DBDataMgr.GetFuncTeamMgr() newTeam = funcTeamMgr.CreateFuncTeam(playerID, teamInfo, zoneID) if newTeam: teamID = newTeam.GetTeamID() newTeamInfo = newTeam.GetSyncDict(True) # ijЩ¹¦ÄÜ´´½¨ºó´¦Àí if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield: pass else: if not notifyMark: notifyMark = "CreatTeamFail" serverGroupList = [serverGroupID] # ´´½¨½öָ֪ͨ¶¨·þ¼´¿É syncPlayerIDList = [playerID] sendMsg = {"infoType":"CreateFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "teamInfo":newTeamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList, "notifyMark":notifyMark} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList) return def CheckCanCreateFuncTeam(playerID, teamInfo, zoneID=0, checkInTeam=True): ## ¼ì²é¿É·ñ´´½¨¹¦ÄܶÓÎé - ±¾·þ¿ç·þͨÓà # @param checkInTeam: ÊÇ·ñ¼ì²éÒѾ­ÔÚ¶ÓÎéÖУ¬Èç¹û¹¦ÄÜÖ»ÔÊÐíµ¥¸ö¶ÓÎ飬ÔòÐèÒª¼ì²é£¬·´Ö®¿ÉÉèÖÃΪ²»¼ì²é # @return: ÊÇ·ñ¿É´´½¨, ²»¿É´´½¨ÌáʾÐÅÏ¢ funcMapID = teamInfo["funcMapID"] ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return False, "" needName = ipyData.GetNeedName() if needName: teamName = teamInfo["teamName"] if not teamName or len(teamName) > 33: # ¶ÓÎéÃû²»ºÏ·¨ return False, "TeamNameLenError" if DirtyList.IsWordForbidden(teamName): return False, "TeamNameUnallow" funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID) for funcTeam in teamList: if needName: if teamName == funcTeam.GetTeamName(): # ¶ÓÎéÃûÒÑ´æÔÚ return False, "TeamNameExist" if checkInTeam: if funcTeam.GetMemberByID(playerID): # ÒѾ­ÔÚ¶ÓÎéÖÐ return False, "AlreadyHaveTeam" return True, "" def ClientServerMsg_ChangeFuncTeam(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - ¹¦ÄܶÓÎéÐÞ¸Ä zoneID = msgData["zoneID"] playerID = msgData["playerID"] teamInfo = msgData["teamInfo"] cacheBase = msgData.get("cacheBase", {}) teamID = teamInfo["teamID"] funcMapID = teamInfo["funcMapID"] zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID) if not zoneInfo: return funcZoneID, serverGroupList = zoneInfo if zoneID != funcZoneID: GameWorld.ErrLog("¹¦ÄܶÓÎé·ÖÇø²»Ò»Ö£¬ÎÞ·¨ÐÞ¸Ä! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID) return funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: GameWorld.ErrLog("¹¦ÄܶÓÎé²»´æÔÚ! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID) return if playerID != funcTeam.GetCaptainID(): GameWorld.DebugLog("·Ç¹¦ÄܶÓÎé¶Ó³¤£¬ÎÞ·¨ÐÞ¸Ä! funcMapID=%s,teamID=%s,CaptainID=%s" % (funcMapID, teamID, funcTeam.GetCaptainID()), playerID) return if cacheBase: PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase) funcTeam.SetMinFightPower(teamInfo["minFightPower"] + teamInfo["minFightPowerEx"] * ChConfig.Def_PerPointValue) funcTeam.SetMinLV(teamInfo["minLV"]) funcTeam.SetServerOnly(teamInfo["serverOnly"]) funcTeam.SetNeedCheck(teamInfo["needCheck"]) if not funcTeam.GetNeedCheck(): pass teamID = funcTeam.GetTeamID() teamInfo = funcTeam.GetSyncDict(True) syncPlayerIDList = funcTeam.GetSyncPlayerIDList() sendMsg = {"infoType":"ChangeFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList) return def ClientServerMsg_FuncTeamMemOP(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - ¹¦ÄܶÓÎé²Ù×÷ zoneID = msgData["zoneID"] playerID = msgData["playerID"] # ²Ù×÷µÄÍæ¼ÒID teamID = msgData["teamID"] funcMapID = msgData["funcMapID"] opType = msgData["opType"] opData = msgData["opData"] cacheBase = msgData.get("cacheBase", {}) zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID) if not zoneInfo: return funcZoneID, serverGroupList = zoneInfo if zoneID != funcZoneID: GameWorld.ErrLog("¹¦ÄܶÓÎé·ÖÇø²»Ò»Ö£¬ÎÞ·¨²Ù×÷! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID) return if cacheBase: PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase) isOK = False syncDict = {} teamInfo = {} funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: GameWorld.ErrLog("¹¦ÄܶÓÎé²»´æÔÚ! funcMapID=%s,teamID=%s,opType=%s" % (funcMapID, teamID, opType), playerID) syncDict["notifyMark"] = "TeamNotExist" syncPlayerIDList = [playerID] else: # ½ö¶Ó³¤¿É²Ù×÷ if opType in [Def_FuncTeamOP_JoinAgree, Def_FuncTeamOP_JoinRefuse, Def_FuncTeamOP_Kick, Def_FuncTeamOP_Transfer, Def_FuncTeamOP_Dissolve]: if playerID != funcTeam.GetCaptainID(): GameWorld.ErrLog("½ö¶Ó³¤¿É²Ù×÷! funcMapID=%s,teamID=%s,opType=%s,CaptainID=%s" % (funcMapID, teamID, opType, funcTeam.GetCaptainID()), playerID) return syncPlayerIDList = funcTeam.GetSyncPlayerIDList() # ÉêÇë¼ÓÈë if opType == Def_FuncTeamOP_JoinApply: isOK = __DoFuncTeamOP_JoinApply(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) if playerID not in syncPlayerIDList: syncPlayerIDList.append(playerID) # ÉêÇëÈ¡Ïû elif opType == Def_FuncTeamOP_JoinCancel: isOK = __DoFuncTeamOP_JoinCancel(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) if playerID not in syncPlayerIDList: syncPlayerIDList.append(playerID) # ͬÒâÈë¶Ó elif opType == Def_FuncTeamOP_JoinAgree: isOK = __DoFuncTeamOP_JoinAgree(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) # ¾Ü¾øÈë¶Ó elif opType == Def_FuncTeamOP_JoinRefuse: isOK = __DoFuncTeamOP_JoinRefuse(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) # Í˳ö¶ÓÎé elif opType == Def_FuncTeamOP_Exit: isOK = __DoFuncTeamOP_Exit(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) # Ìß³ö¶ÓÎé elif opType == Def_FuncTeamOP_Kick: isOK = __DoFuncTeamOP_Kick(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) # תÈöӳ¤ elif opType == Def_FuncTeamOP_Transfer: isOK = __DoFuncTeamOP_Transfer(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) # ½âÉ¢¶ÓÎé elif opType == Def_FuncTeamOP_Dissolve: isOK = __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) if not isOK and not syncDict: # ûÓÐÖ´Ðгɹ¦ ÇÒ Ã»ÓÐÐèÒª»Ø¸´µÄÐÅÏ¢£¬Ôò²»ÐèÒª»Ø·¢×Ó·þ return funcTeam = funcTeamMgr.GetFuncTeam(teamID) if funcTeam: teamInfo = funcTeam.GetSyncDict(True) sendMsg = {"infoType":"FuncTeamMemOP", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList, "opType":opType} sendMsg.update(syncDict) CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList) return def DelTeam(teamID): funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: GameWorld.ErrLog("ɾ³ý¹¦ÄܶÓÎéʱ²»´æÔÚ! teamID=%s" % teamID) return zoneID = funcTeam.GetZoneID() funcMapID = funcTeam.GetFuncMapID() syncPlayerIDList = funcTeam.GetSyncPlayerIDList() funcTeamMgr.DelTeam(teamID) if not funcTeamMgr.IsLockBatch(): sendMsg = {"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":{teamID:syncPlayerIDList}} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamDel, sendMsg) return syncPlayerIDList def DelTeamByFunc(delFuncMapID): GameWorld.Log("Çå¿Õ¹¦ÄܶÓÎé! delFuncMapID=%s" % delFuncMapID) funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeamMgr.LockBatch() delTeamIDList = [] for key, teamList in funcTeamMgr.funcTeamListDict.items(): zoneID, funcMapID = key if funcMapID != delFuncMapID: continue delTeamDict = {} for funcTeam in teamList[::-1]: teamID = funcTeam.GetTeamID() syncPlayerIDList = DelTeam(teamID) if syncPlayerIDList: delTeamDict[teamID] = syncPlayerIDList delTeamIDList.append(teamID) # °´·ÖÇø´¦ÀíºóÒ»´ÎÐÔͬ²½×Ó·þ zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(funcMapID, zoneID) serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else [] sendMsg = {"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":delTeamDict} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamDel, sendMsg, serverGroupIDList) funcTeamMgr.UnLockBatch() delCount = len(delTeamIDList) funcTeamMgr.SyncMapFuncTeamMemIDInfo(delTeamIDList) return delCount def DelTealAll(): delCount = 0 ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetFuncTeamSetCount()): ipyData = ipyDataMgr.GetFuncTeamSetByIndex(index) delCount += DelTeamByFunc(ipyData.GetFuncMapID()) return delCount def SendFuncTeamToClientServer(teamID): ## ͬ²½¶ÓÎéÃ÷ϸµ½×Ó·þ funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return funcMapID = funcTeam.GetFuncMapID() teamInfo = funcTeam.GetSyncDict(True) syncPlayerIDList = funcTeam.GetSyncPlayerIDList() sendMsg = {"infoType":"", "playerID":0, "funcMapID":funcMapID, "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg) return def __DoFuncTeamOP_JoinApply(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## ÉêÇë¼ÓÈë funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() playerTeamID = funcTeamMgr.GetPlayerTeamID(playerID, funcMapID) if playerTeamID: GameWorld.Log("ÒѾ­Óй¦ÄܶÓÎéÁË£¬²»ÄÜÔÙÉêÇë! funcMapID=%s,playerTeamID=%s" % (funcMapID, playerTeamID), playerID) return funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return if funcTeam.GetMemberByID(playerID): GameWorld.Log("ÒÑÔÚ¹¦ÄܶÓÎéÖÐ! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID) return if playerID in funcTeam.GetApplyIDList(): GameWorld.Log("ÒÑÔÚ¹¦ÄܶÓÎéÉêÇëÁбíÖÐ! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return memberMax = ipyData.GetMemberMax() applyMax = ipyData.GetApplyMax() reqApplyMax = ipyData.GetReqApplyMax() if len(funcTeam.GetMemberList()) >= memberMax: GameWorld.DebugLog("¹¦ÄܶÓÎé³ÉÔ±ÒÑÂú! funcMapID=%s,teamID=%s,memberMax=%s" % (funcMapID, teamID, memberMax), playerID) syncDict["notifyMark"] = "TeamMemFull" return if applyMax and len(funcTeam.GetApplyIDList()) >= applyMax: GameWorld.DebugLog("¹¦ÄܶÓÎéÉêÇë¶ÓÁÐÒÑÂú! funcMapID=%s,teamID=%s,applyMax=%s" % (funcMapID, teamID, applyMax), playerID) syncDict["notifyMark"] = "TeamApplyFull" return minLV = funcTeam.GetMinLV() if minLV and minLV > cacheBase.get("LV", 0): GameWorld.DebugLog("¹¦ÄܶÓÎé×îµÍµÈ¼¶ÏÞÖÆ£¬ÎÞ·¨ÉêÇë! funcMapID=%s,teamID=%s,minLV=%s" % (funcMapID, teamID, minLV), playerID) syncDict["notifyMark"] = "TeamLVLimit" return minFightPower = funcTeam.GetMinFightPower() if minFightPower and minFightPower > cacheBase.get("FightPower", 0): GameWorld.DebugLog("¹¦ÄܶÓÎé×îµÍÕ½Á¦ÏÞÖÆ£¬ÎÞ·¨ÉêÇë! funcMapID=%s,teamID=%s,minFightPower=%s" % (funcMapID, teamID, minFightPower), playerID) syncDict["notifyMark"] = "TeamFightPowerLimit" return minServerOnly = funcTeam.GetServerOnly() if minServerOnly: # ´ýÀ©Õ¹£¬¿´ÊÇÈ¡ServerID£¬»¹ÊÇ ServerGroupID£¬Ðè×¢ÒâGroupIDºÏ·þºó¿ÉÄܲ»Ò»ÖµÄÎÊÌâ pass if reqApplyMax: applyTeamIDList = [] teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID) for fTeam in teamList: if playerID in fTeam.GetApplyIDList(): applyTeamIDList.append(fTeam.GetTeamID()) if len(applyTeamIDList) >= reqApplyMax: GameWorld.DebugLog("Íæ¼ÒÉêÇë¼ÓÈë¶ÓÎéÊýÒÑÂú£¬ÎÞ·¨ÉêÇë! funcMapID=%s,applyTeamCount=%s, %s" % (funcMapID, len(applyTeamIDList), applyTeamIDList), playerID) syncDict["notifyMark"] = "TeamReqJoinApplyFull" return if funcTeam.GetNeedCheck(): syncDict["notifyMark"] = "TeamReqJoinApplyOK" funcTeam.AddApplyID(playerID) else: funcTeam.AddTeamMember(playerID) return True def __DoFuncTeamOP_JoinCancel(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## ÉêÇëÈ¡Ïû funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return funcTeam.DelApplyID(playerID) return True def __DoFuncTeamOP_JoinAgree(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## ͬÒâÈë¶Ó # @param opData: Ä¿±êÍæ¼ÒID£¬Îª0ʱһ¼üͬÒâ ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return applyIDList = funcTeam.GetApplyIDList() if not applyIDList: return memberMax = ipyData.GetMemberMax() joinPlayerIDList = [] tagPlayerID = opData if tagPlayerID: if tagPlayerID not in applyIDList: GameWorld.Log("Ä¿±êÍæ¼Ò²»ÔÚ¹¦ÄܶÓÎéÉêÇëÁбíÖÐ! funcMapID=%s,teamID=%s,tagPlayerID=%s not in applyIDList=%s" % (funcMapID, teamID, tagPlayerID, applyIDList), playerID) return tagPlayerTeamID = funcTeamMgr.GetPlayerTeamID(tagPlayerID, funcMapID) if tagPlayerTeamID: GameWorld.DebugLog("Ä¿±êÍæ¼ÒÒѼÓÈëÆäËû¹¦ÄܶÓÎé! funcMapID=%s,tagPlayerID=%s,tagPlayerTeamID=%s" % (funcMapID, tagPlayerID, tagPlayerTeamID), playerID) syncDict["notifyMark"] = "PlayerInOtherTeam" else: joinPlayerIDList = [tagPlayerID] else: joinPlayerIDList = [] + applyIDList # Ò»¼üͬÒâ°´ÉêÇë˳Ðò£¬ÈçÐè°´Õ½Á¦ÔÙ×öÓÅ»¯ for joinPlayerID in joinPlayerIDList: if len(funcTeam.GetMemberList()) >= memberMax: GameWorld.DebugLog("¹¦ÄܶÓÎé³ÉÔ±ÒÑÂú! funcMapID=%s,teamID=%s,memberMax=%s" % (funcMapID, teamID, memberMax), playerID) break tagPlayerTeamID = funcTeamMgr.GetPlayerTeamID(joinPlayerID, funcMapID) if tagPlayerTeamID: GameWorld.DebugLog("Ä¿±êÍæ¼ÒÒѼÓÈëÆäËû¹¦ÄܶÓÎé! funcMapID=%s,joinPlayerID=%s,tagPlayerTeamID=%s" % (funcMapID, joinPlayerID, tagPlayerTeamID), playerID) continue funcTeam.AddTeamMember(joinPlayerID) return True def __DoFuncTeamOP_JoinRefuse(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## ¾Ü¾øÈë¶Ó # @param opData: Ä¿±êÍæ¼ÒID£¬Îª0ʱһ¼ü¾Ü¾ø funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return tagPlayerID = opData if tagPlayerID: funcTeam.DelApplyID(tagPlayerID) else: funcTeam.DelApplyIDAll() # Ò»¼ü¾Ü¾ø return True def __DoFuncTeamOP_Exit(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## Í˳ö¶ÓÎé funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return # ¶Ó³¤Í˳ö£¬Ö±½Ó½âÉ¢ if playerID == funcTeam.GetCaptainID(): return __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict) funcTeam.DelTeamMember(playerID) return True def __DoFuncTeamOP_Kick(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## Ìß³ö¶ÓÎé funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return tagPlayerID = opData if not tagPlayerID: GameWorld.DebugLog("ÐèÖ¸¶¨Ìß³ö¶ÓÎéÄ¿±ê¶ÓÔ±! opData=%s" % opData, playerID) return if tagPlayerID == funcTeam.GetCaptainID(): GameWorld.DebugLog("²»ÄÜÌß¶Ó³¤! opData=%s" % opData, playerID) return funcTeam.DelTeamMember(tagPlayerID) return True def __DoFuncTeamOP_Transfer(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## תÈöӳ¤ funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeam = funcTeamMgr.GetFuncTeam(teamID) if not funcTeam: return memberIDList = funcTeam.GetMemberIDList() tagPlayerID = opData if tagPlayerID not in memberIDList: GameWorld.Log("Ä¿±êÍæ¼Ò²»ÊǶÓÔ±£¬ÎÞ·¨×ªÈöӳ¤! funcMapID=%s,teamID=%s,tagPlayerID=%s not in %s" % (funcMapID, teamID, tagPlayerID, memberIDList), playerID) return funcTeam.SetCaptainID(tagPlayerID) return True def __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict): ## ½âÉ¢¶ÓÎé funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() funcTeamMgr.DelTeam(teamID) return True def ClientServerMsg_QueryFuncTeam(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - ²éÕÒ¶ÓÎéÁбí zoneID = msgData["zoneID"] playerID = msgData["playerID"] funcMapID = msgData["funcMapID"] cacheBase = msgData.get("cacheBase", {}) zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID) if not zoneInfo: return funcZoneID, _ = zoneInfo if zoneID != funcZoneID: GameWorld.ErrLog("¹¦ÄܶÓÎé·ÖÇø²»Ò»Ö£¬ÎÞ·¨²éѯ! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID) return if cacheBase: PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase) # ·ÇÁбí²éѯ£¬·µ»ØÍæ¼ÒÏà¹Ø¶ÓÎé if "startIndex" not in msgData: syncPlayerIDList = [playerID] serverGroupList = [serverGroupID] funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() # ÉêÇëµÄ¶ÓÎé funcTeamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID) for funcTeam in funcTeamList: if playerID not in funcTeam.GetApplyIDList(): continue teamID = funcTeam.GetTeamID() teamInfo = funcTeam.GetSyncDict(True) sendMsg = {"infoType":"QueryPlayerFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList) # Íæ¼ÒËùÊô¶ÓÎé teamID = funcTeamMgr.GetPlayerTeamID(playerID, funcMapID) funcTeam = funcTeamMgr.GetFuncTeam(teamID) teamInfo = funcTeam.GetSyncDict(True) if funcTeam else {} sendMsg = {"infoType":"QueryPlayerFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList) return # Áбí²éѯ funcMapEx = msgData["funcMapEx"] startIndex = msgData["startIndex"] queryCnt = msgData["queryCnt"] haveSpace = msgData["haveSpace"] idLimitType = msgData["idLimitType"] searchMsg = msgData["searchMsg"] if queryCnt <= 0: queryCnt = 20 queryCnt = min(100, queryCnt) # ĬÈÏ20£¬×î´ó100 ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return memberMax = ipyData.GetMemberMax() idLimitTypeDict = {1:"FamilyID", 2:"ServerGroupID", 3:"AccID"} loopIndex = startIndex teamInfoList = [] funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID) for index in xrange(startIndex, len(teamList)): loopIndex = index + 1 funcTeam = teamList[index] if searchMsg: # ¾«È·Æ¥Åä¶ÓÎéÃû¡¢¶ÓÎéIDµÄ²åÈëÔÚ×îÇ°Ãæ if searchMsg == funcTeam.GetTeamName() or searchMsg == str(funcTeam.GetTeamID()): teamInfoList.insert(0, funcTeam.GetSyncDict(False)) elif searchMsg in funcTeam.GetTeamName(): teamInfoList.append(funcTeam.GetSyncDict(False)) else: continue else: if funcMapEx != 0 and funcMapEx != funcTeam.GetFuncMapEx(): continue if haveSpace and len(funcTeam.GetMemberList()) >= memberMax: #GameWorld.DebugLog("ÒÑÂúÔ±£¬²»¼ÓÈëÁбí²é¿´ teamID=%s" % funcTeam.GetTeamID()) continue if idLimitType in idLimitTypeDict: limitAttrName = idLimitTypeDict[idLimitType] curIDValue = cacheBase.get(limitAttrName, 0) captainID = funcTeam.GetCaptainID() cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(captainID)) teamIDValue = cacheDict.get(limitAttrName, 0) if limitAttrName == "AccID": curIDValue = GameWorld.GetAccIDServerID(str(curIDValue)) teamIDValue = GameWorld.GetAccIDServerID(str(teamIDValue)) if not curIDValue or curIDValue != teamIDValue: #GameWorld.DebugLog("ûÓлò²»Í¬IDÏÞÖÆ£¬²»¼ÓÈëÁбí²é¿´! idLimitType=%s,curIDValue=%s != %s, teamID=%s, captainID=%s" # % (idLimitType, curIDValue, teamIDValue, funcTeam.GetTeamID(), captainID)) continue teamInfoList.append(funcTeam.GetSyncDict(False)) if len(teamInfoList) >= queryCnt: break serverGroupList = [serverGroupID] # ½ö֪ͨ²éѯ·þ¼´¿É sendMsg = {"teamInfoList":teamInfoList, "loopIndex":loopIndex, "queryInfo":msgData} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamList, sendMsg, serverGroupList) return