| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package PlayerFuncTeam  | 
| #  | 
| # @todo:¹¦ÄܶÓÎé±í  | 
| # @author hxp  | 
| # @date 2024-08-02  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¹¦ÄܶÓÎé±í£¬Ö§³Ö¿ç·þ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2024-08-02 16:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import CommFunc  | 
| import GameWorld  | 
| import ShareDefine  | 
| import IpyGameDataPY  | 
| import PyDataManager  | 
| import PyGameDataStruct  | 
| import CrossBattlefield  | 
| import CrossRealmPlayer  | 
| import PlayerViewCache  | 
| import ChPyNetSendPack  | 
| import CrossRealmMsg  | 
| import PlayerControl  | 
| import NetPackCommon  | 
| import DirtyList  | 
| import ChConfig  | 
|   | 
| import time  | 
|   | 
| # ¶ÓÎé²Ù×÷  | 
| 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)  | 
|   | 
| class PyFuncTeamMem():  | 
|       | 
|     def __init__(self, dbMemData=None):  | 
|         self.dbMemData = dbMemData  | 
|         return  | 
|     def GetTeamID(self): return self.dbMemData.TeamID  | 
|     def GetPlayerID(self): return self.dbMemData.PlayerID  | 
|     def GetValue1(self): return self.dbMemData.Value1  | 
|     def SetValue1(self, value1): self.dbMemData.Value1 = value1  | 
|     def GetValue2(self): return self.dbMemData.Value2  | 
|     def SetValue2(self, value2): self.dbMemData.Value2 = value2  | 
|     def GetValue3(self): return self.dbMemData.Value3  | 
|     def SetValue3(self, value3): self.dbMemData.Value3 = value3  | 
|     def GetValue4(self): return self.dbMemData.Value4  | 
|     def SetValue4(self, value4): self.dbMemData.Value4 = value4  | 
|     def GetValue5(self): return self.dbMemData.Value5  | 
|     def SetValue5(self, value5): self.dbMemData.Value5 = value5  | 
|       | 
|     def GetFightPower(self):  | 
|         cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(self.GetPlayerID()))  | 
|         return cacheDict.get("FightPower", 0)  | 
|       | 
|     def GetSyncDict(self):  | 
|         # Value ÔÝʱֻͬ²½1~2  | 
|         syncDict = {"PlayerID":self.GetPlayerID(), "Value1":self.GetValue1(), "Value2":self.GetValue2()}  | 
|         syncDict.update(PlayerViewCache.GetShotCacheDict(self.GetPlayerID(), "PlayerID", "FightPower", "ServerID", "OfflineValue", "Face", "FacePic"))  | 
|         return syncDict  | 
|       | 
| class PyFuncTeam():  | 
|       | 
|     def __init__(self, dbTeamData=None):  | 
|         self.dbTeamData = dbTeamData  | 
|         self.memberList = []  | 
|         self.applyIDList = []  | 
|         try:  | 
|             self.applyIDList = eval(self.dbTeamData.ApplyIDList)  | 
|         except:  | 
|             self.applyIDList = []  | 
|         return  | 
|       | 
|     def getBuffer(self):  | 
|         self.dbTeamData.ApplyIDList = str(self.applyIDList).replace(" ", "")  | 
|         self.dbTeamData.ApplyIDLen = len(self.dbTeamData.ApplyIDList)  | 
|         return self.dbTeamData.getBuffer()  | 
|       | 
|     def GetTeamID(self): return self.dbTeamData.TeamID  | 
|     def GetTeamName(self): return self.dbTeamData.TeamName  | 
|     def GetZoneID(self): return self.dbTeamData.ZoneID  | 
|     def GetFuncMapID(self): return self.dbTeamData.FuncMapID  | 
|     def GetFuncMapEx(self): return self.dbTeamData.FuncMapEx  | 
|     def GetCreateTime(self): return self.dbTeamData.CreateTime  | 
|     def GetCaptainID(self): return self.dbTeamData.CaptainID  | 
|     def SetCaptainID(self, captainID): self.dbTeamData.CaptainID = captainID  | 
|     def GetMinLV(self): return self.dbTeamData.MinLV  | 
|     def SetMinLV(self, minLV): self.dbTeamData.MinLV = minLV  | 
|     def GetMinFightPower(self):  | 
|         return self.dbTeamData.MinFightPower + self.dbTeamData.MinFightPowerEx * ChConfig.Def_PerPointValue  | 
|     def SetMinFightPower(self, minFightPower):  | 
|         self.dbTeamData.MinFightPower = minFightPower % ChConfig.Def_PerPointValue  | 
|         self.dbTeamData.MinFightPowerEx = minFightPower / ChConfig.Def_PerPointValue  | 
|         return  | 
|     def GetServerOnly(self): return self.dbTeamData.ServerOnly  | 
|     def SetServerOnly(self, serverOnly): self.dbTeamData.ServerOnly = serverOnly  | 
|     def GetNeedCheck(self): return self.dbTeamData.NeedCheck  | 
|     def SetNeedCheck(self, needCheck): self.dbTeamData.NeedCheck = needCheck  | 
|     def GetValue1(self): return self.dbTeamData.Value1  | 
|     def SetValue1(self, value1): self.dbTeamData.Value1 = value1  | 
|     def GetValue2(self): return self.dbTeamData.Value2  | 
|     def SetValue2(self, value2): self.dbTeamData.Value2 = value2  | 
|     def GetValue3(self): return self.dbTeamData.Value3  | 
|     def SetValue3(self, value3): self.dbTeamData.Value3 = value3  | 
|     def GetValue4(self): return self.dbTeamData.Value4  | 
|     def SetValue4(self, value4): self.dbTeamData.Value4 = value4  | 
|     def GetValue5(self): return self.dbTeamData.Value5  | 
|     def SetValue5(self, value5): self.dbTeamData.Value5 = value5  | 
|       | 
|     def GetSyncDict(self, applyDetail=False):  | 
|         MemberList = [mem.GetSyncDict() for mem in self.memberList]  | 
|         ApplyIDList = self.applyIDList  | 
|         ApplyList = []  | 
|         if applyDetail:  | 
|             for applyID in ApplyIDList[::-1]:  | 
|                 applyPlayerDict = PlayerViewCache.GetShotCacheDict(applyID, "PlayerID", "FightPower", "ServerID", "Face", "FacePic")  | 
|                 if not applyPlayerDict:  | 
|                     ApplyIDList.remove(applyID)  | 
|                 else:  | 
|                     ApplyList.insert(0, applyPlayerDict)  | 
|         # Value ÔÝʱֻͬ²½1~2  | 
|         syncDict = {"TeamID":self.GetTeamID(), "TeamName":self.GetTeamName(), "ZoneID":self.GetZoneID(), "FuncMapID":self.GetFuncMapID(), "FuncMapEx":self.GetFuncMapEx(),   | 
|                     "CreateTime":self.GetCreateTime(), "CaptainID":self.GetCaptainID(), "MinLV":self.GetMinLV(), "MinFightPower":self.GetMinFightPower(),   | 
|                     "ServerOnly":self.GetServerOnly(), "NeedCheck":self.GetNeedCheck(), "MemberList":MemberList, "ApplyIDList":ApplyIDList, "ApplyList":ApplyList,  | 
|                     "Value1":self.GetValue1(), "Value2":self.GetValue2()}  | 
|         return syncDict  | 
|       | 
|     def GetSyncPlayerIDList(self):  | 
|         ## »ñÈ¡¶ÓÎéÐÅÏ¢ÐèҪͬ²½µÄÍæ¼ÒIDÁÐ±í  ¶ÓÔ± + ÉêÇëÍæ¼Ò  | 
|         syncPlayerIDList = []  | 
|         syncPlayerIDList += self.GetMemberIDList()  | 
|         syncPlayerIDList += self.GetApplyIDList()  | 
|         return syncPlayerIDList  | 
|       | 
|     def AddTeamMember(self, playerID):  | 
|         teamMem = None  | 
|         self.DelApplyID(playerID) # ¼ÓÈëµÄͬʱ´ÓÉêÇëÁбíÖÐÒÆ³ý  | 
|         mem = self.GetMemberByID(playerID)  | 
|         if mem:  | 
|             teamMem = mem  | 
|             return teamMem  | 
|         dbTeamMemData = PyGameDataStruct.tagDBPyFuncTeamMem()  | 
|         dbTeamMemData.clear()  | 
|         dbTeamMemData.TeamID = self.GetTeamID()  | 
|         dbTeamMemData.PlayerID = playerID  | 
|         teamMem = PyFuncTeamMem(dbTeamMemData)  | 
|         self.AddTeamMemToList(teamMem)  | 
|         return teamMem  | 
|       | 
|     def AddTeamMemToList(self, teamMem):  | 
|         if teamMem not in self.memberList:  | 
|             self.memberList.append(teamMem)  | 
|               | 
|         zoneID = self.GetZoneID()  | 
|         teamID = self.GetTeamID()  | 
|         funcMapID = self.GetFuncMapID()  | 
|         teamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|         teamMgr.OnTeamMemTeamIDChange(zoneID, funcMapID, teamID, teamMem.GetPlayerID(), teamID)  | 
|         return  | 
|       | 
|     def GetMemberList(self): return self.memberList      | 
|     def GetMemberIDList(self): return [mem.GetPlayerID() for mem in self.memberList]  | 
|     def GetMemberByID(self, playerID):  | 
|         for mem in self.memberList:  | 
|             if mem.GetPlayerID() == playerID:  | 
|                 return mem  | 
|         return  | 
|       | 
|     def GetMemFightPowerTotal(self):  | 
|         ## ¶ÓÔ±×ÜÕ½Á¦  | 
|         totalFightPower = 0  | 
|         for mem in self.memberList:  | 
|             totalFightPower += mem.GetFightPower()  | 
|         return totalFightPower  | 
|       | 
|     def DelTeamMember(self, playerID):  | 
|         for mem in self.memberList[::-1]:  | 
|             if mem.GetPlayerID() == playerID:  | 
|                 self.memberList.remove(mem)  | 
|                   | 
|                 zoneID = self.GetZoneID()  | 
|                 teamID = self.GetTeamID()  | 
|                 funcMapID = self.GetFuncMapID()  | 
|                 teamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|                 teamMgr.OnTeamMemTeamIDChange(zoneID, funcMapID, teamID, playerID, 0)  | 
|                 break  | 
|         return  | 
|       | 
|     def OnDel(self):  | 
|         self.memberList = []  | 
|         self.applyIDList = []  | 
|         return  | 
|       | 
|     def GetApplyIDList(self): return self.applyIDList  | 
|       | 
|     def AddApplyID(self, playerID):  | 
|         if playerID not in self.applyIDList:  | 
|             self.applyIDList.append(playerID)  | 
|         return  | 
|       | 
|     def DelApplyID(self, playerID):  | 
|         if playerID in self.applyIDList:  | 
|             self.applyIDList.remove(playerID)  | 
|         return  | 
|       | 
|     def DelApplyIDAll(self):  | 
|         self.applyIDList = []  | 
|         return  | 
|       | 
| class DBPyFuncTeamMemManager():  | 
|     ## ¹¦ÄܶÓÎé³ÉÔ±¹ÜÀí  | 
|       | 
|     def __init__(self):  | 
|         return  | 
|       | 
|     # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  | 
|     def GetSaveData(self):  | 
|         savaData = ""  | 
|         cntData = ""  | 
|         cnt = 0  | 
|           | 
|         teamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|         for teamList in teamMgr.funcTeamListDict.values():  | 
|             for funcTeam in teamList:  | 
|                 for mem in funcTeam.GetMemberList():  | 
|                     cnt += 1  | 
|                     savaData += mem.dbMemData.getBuffer()  | 
|                       | 
|         GameWorld.Log("Save DBPyFuncTeamMem count :%s len=%s" % (cnt, len(savaData)))  | 
|         return CommFunc.WriteDWORD(cntData, cnt) + savaData  | 
|       | 
|     # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý  | 
|     def LoadPyGameData(self, datas, pos, dataslen):  | 
|         cnt, pos = CommFunc.ReadDWORD(datas, pos)  | 
|         GameWorld.Log("Load DBPyFuncTeamMem count :%s" % cnt)  | 
|           | 
|         teamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|         for _ in xrange(cnt):  | 
|             memData = PyGameDataStruct.tagDBPyFuncTeamMem()  | 
|             memData.clear()  | 
|             pos += memData.readData(datas, pos, dataslen)  | 
|               | 
|             teamID = memData.TeamID  | 
|             funcTeam = teamMgr.GetFuncTeam(teamID)  | 
|             if not funcTeam:  | 
|                 continue  | 
|             funcTeam.AddTeamMemToList(PyFuncTeamMem(memData))  | 
|               | 
|         return pos  | 
|   | 
| class DBPyFuncTeamManager():  | 
|     ## ¹¦ÄܶÓÎé¹ÜÀí  | 
|       | 
|     def __init__(self):  | 
|         self.Clear()  | 
|         self.teamIDMax = 99999  | 
|         return  | 
|       | 
|     def Clear(self):  | 
|         self.funcTeamDict = {} # {teamID:PyFuncTeam, ...}  | 
|         self.playerFuncTeamIDDict = {} # {playerID:{funcMapID:teamID, ...}, ...}  | 
|         self.funcTeamListDict = {} # {(zoneID, funcMapID):[PyFuncTeam, ...], ...}  | 
|         self.loopTeamID = 0 # µÝÔö£¬Ö±µ½³¬¹ýÉÏÏÞºó£¬ÔÙ´ÓÍ·¿ªÊ¼  | 
|         self.__loadOK = False # ¶ÓÎé·Ö¶àÕűí¼ÓÔØ£¬¶ÓÎé±í¡¢³ÉÔ±±íµÈ£¬ÓÉ×îºóÒ»Õűí¼ÓÔØÍê±ÏºóÉèÖÃΪTrue  | 
|         self.__lockBatch = False # Ëø¶¨ÅÅÐò£¬¼´ÔÝʱ²»ÅÅÐò£¬ÓÉÇ¿ÖÆÅÅÐòºó½âËø  | 
|         return  | 
|       | 
|     def __GetNewTeamID(self):  | 
|         ## »ñȡжÓÎéID  | 
|         idMin, idMax = 100, 9999 # ·Ç¿ç·þ¶ÓÎéID·¶Î§£¬´æ´¢±¾·þ£¬ºÏ·þÇå¿Õ  | 
|         if GameWorld.IsCrossServer():  | 
|             idMin, idMax = 10000, self.teamIDMax # ¿ç·þ¶ÓÎéID·¶Î§£¬´æ´¢¿ç·þ£¬ºÏ·þ²»Ó°Ïì  | 
|               | 
|         teamMax = idMax - idMin + 1  | 
|         if len(self.funcTeamDict) >= teamMax:  | 
|             GameWorld.ErrLog("¹¦ÄܶÓÎéIDÒÑÂú!")  | 
|             return  | 
|           | 
|         if not self.loopTeamID and self.funcTeamDict:  | 
|             self.loopTeamID = max(self.funcTeamDict)  | 
|               | 
|         newTeamID = 0  | 
|         doCount = 0  | 
|         while doCount < teamMax:  | 
|             doCount += 1  | 
|             if not self.loopTeamID or self.loopTeamID >= idMax or self.loopTeamID < idMin:  | 
|                 self.loopTeamID = idMin - 1  | 
|             self.loopTeamID += 1  | 
|             if self.loopTeamID not in self.funcTeamDict:  | 
|                 newTeamID = self.loopTeamID  | 
|                 break  | 
|         return newTeamID  | 
|       | 
|     def CreateFuncTeam(self, playerID, teamInfo, zoneID=0):  | 
|         funcTeam = None  | 
|         teamID = self.__GetNewTeamID()  | 
|         if not teamID:  | 
|             return funcTeam  | 
|           | 
|         funcMapID = teamInfo["funcMapID"]  | 
|         funcMapEx = teamInfo["funcMapEx"]  | 
|         dbTeamData = PyGameDataStruct.tagDBPyFuncTeam()  | 
|         dbTeamData.clear()  | 
|         dbTeamData.TeamID = teamID  | 
|         dbTeamData.TeamName = teamInfo["teamName"]  | 
|         dbTeamData.ZoneID = zoneID  | 
|         dbTeamData.FuncMapID = funcMapID  | 
|         dbTeamData.FuncMapEx = funcMapEx  | 
|         dbTeamData.CreateTime = int(time.time())  | 
|         dbTeamData.CaptainID = playerID  | 
|         dbTeamData.MinLV = teamInfo["minLV"]  | 
|         dbTeamData.MinFightPower = teamInfo["minFightPower"]  | 
|         dbTeamData.MinFightPowerEx = teamInfo["minFightPowerEx"]  | 
|         dbTeamData.ServerOnly = teamInfo["serverOnly"]  | 
|         dbTeamData.NeedCheck = teamInfo["needCheck"]  | 
|         dbTeamData.Value1 = teamInfo.get("Value1", 0)  | 
|         dbTeamData.Value2 = teamInfo.get("Value2", 0)  | 
|         dbTeamData.Value3 = teamInfo.get("Value3", 0)  | 
|         dbTeamData.Value4 = teamInfo.get("Value4", 0)  | 
|         dbTeamData.Value5 = teamInfo.get("Value5", 0)  | 
|           | 
|         funcTeam = PyFuncTeam(dbTeamData)  | 
|         self.__AddFuncTeam(funcTeam)  | 
|         funcTeam.AddTeamMember(playerID)  | 
|         return funcTeam  | 
|       | 
|     def __AddFuncTeam(self, funcTeam):  | 
|         teamID = funcTeam.GetTeamID()  | 
|         zoneID = funcTeam.GetZoneID()  | 
|         funcMapID = funcTeam.GetFuncMapID()  | 
|         #funcMapEx = teafuncTeammData.GetFuncMapEx()  | 
|           | 
|         key = (zoneID, funcMapID)  | 
|         if key not in self.funcTeamListDict:  | 
|             self.funcTeamListDict[key] = []  | 
|         funcTeamList = self.funcTeamListDict[key]  | 
|         if funcTeam not in funcTeamList:  | 
|             funcTeamList.append(funcTeam)  | 
|               | 
|         self.funcTeamDict[teamID] = funcTeam  | 
|         self.SortTeam(zoneID, funcMapID, "create")  | 
|         return  | 
|       | 
|     def SortTeam(self, zoneID, funcMapID, sortReason=""):  | 
|         if not self.__loadOK:  | 
|             #GameWorld.DebugLog("¶ÓÎéδ¼ÓÔØÍê±Ï£¬²»ÅÅÐò")  | 
|             return  | 
|         if self.__lockBatch:  | 
|             #GameWorld.DebugLog("¶ÓÎéÅÅÐòËø¶¨ÖÐ")  | 
|             return  | 
|           | 
|         teamList = self.GetFuncTeamList(zoneID, funcMapID)  | 
|         if not teamList:  | 
|             return  | 
|         ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)  | 
|         if not ipyData:  | 
|             return  | 
|         sortType = ipyData.GetSortType()  | 
|         sortReverse = ipyData.GetSortReverse()  | 
|         # °´´´½¨Ê±¼ä  | 
|         if sortType == 0:  | 
|             if not sortReason or sortReason == "create":  | 
|                 teamList.sort(key=lambda t: (t.GetCreateTime()), reverse=sortReverse)  | 
|                 #GameWorld.DebugLog("°´Ê±¼äÅÅÐò: zoneID=%s,funcMapID=%s,sortReason=%s" % (zoneID, funcMapID, sortReason))  | 
|         # °´¶ÓÔ±×ÜÕ½Á¦  | 
|         elif sortType == 1:  | 
|             if not sortReason or sortReason == "member":  | 
|                 teamList.sort(key=lambda t: (t.GetMemFightPowerTotal()), reverse=sortReverse)  | 
|                 #GameWorld.DebugLog("°´Õ½Á¦ÅÅÐò: zoneID=%s,funcMapID=%s,sortReason=%s" % (zoneID, funcMapID, sortReason))  | 
|         return  | 
|       | 
|     def SyncMapFuncTeamMemIDInfo(self, teamIDList=None):  | 
|         ## Í¬²½µØÍ¼¶ÓÎé³ÉÔ±ÐÅÏ¢  | 
|         if not self.__loadOK:  | 
|             return  | 
|           | 
|         if self.__lockBatch:  | 
|             return  | 
|           | 
|         teamMemIDInfoDict = {}  | 
|         delTeamIDList = []  | 
|         if not teamIDList:  | 
|             for teamList in self.funcTeamListDict.values():  | 
|                 for funcTeam in teamList:  | 
|                     self.__updSyncMapInfo(funcTeam, teamMemIDInfoDict)  | 
|         else:  | 
|             for teamID in teamIDList:  | 
|                 funcTeam = self.GetFuncTeam(teamID)  | 
|                 if not funcTeam:  | 
|                     delTeamIDList.append(teamID)  | 
|                     continue  | 
|                 self.__updSyncMapInfo(funcTeam, teamMemIDInfoDict)  | 
|         GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FuncTeamMemIDInfo, [teamIDList, delTeamIDList, teamMemIDInfoDict])  | 
|         return  | 
|       | 
|     def __updSyncMapInfo(self, funcTeam, teamMemIDInfoDict):  | 
|         if not funcTeam:  | 
|             return  | 
|         zoneID = funcTeam.GetZoneID()  | 
|         teamID = funcTeam.GetTeamID()  | 
|         funcMapID = funcTeam.GetFuncMapID()  | 
|         key = (zoneID, funcMapID)  | 
|         if key not in teamMemIDInfoDict:  | 
|             teamMemIDInfoDict[key] = {}  | 
|         infoDict = teamMemIDInfoDict[key]  | 
|         infoDict[teamID] = funcTeam.GetMemberIDList()  | 
|         return  | 
|       | 
|     def LockBatch(self): self.__lockBatch = True  | 
|     def UnLockBatch(self): self.__lockBatch = False  | 
|     def IsLockBatch(self): return self.__lockBatch  | 
|       | 
|     def GetFuncTeam(self, teamID):  | 
|         funcTeam = None  | 
|         if teamID in self.funcTeamDict:  | 
|             funcTeam = self.funcTeamDict[teamID]  | 
|         if not funcTeam and False:  | 
|             # ²»»áÖ´ÐУ¬½öΪÁË.Ìáʾ´úÂëÓà  | 
|             funcTeam = PyFuncTeam()  | 
|         return funcTeam  | 
|       | 
|     def GetFuncTeamList(self, zoneID, funcMapID):  | 
|         key = (zoneID, funcMapID)  | 
|         if key not in self.funcTeamListDict:  | 
|             return []  | 
|         return self.funcTeamListDict[key]  | 
|       | 
|     def DelTeam(self, teamID):  | 
|         ## É¾³ý¶ÓÎé  | 
|         funcTeam = self.GetFuncTeam(teamID)  | 
|         if not funcTeam:  | 
|             return  | 
|           | 
|         zoneID = funcTeam.GetZoneID()  | 
|         funcMapID = funcTeam.GetFuncMapID()  | 
|         for mem in funcTeam.GetMemberList():  | 
|             self.__UpdPlayerTeamID(mem.GetPlayerID(), funcMapID, 0)  | 
|         funcTeam.OnDel()  | 
|         self.SyncMapFuncTeamMemIDInfo([teamID])  | 
|           | 
|         # ÒƳýʵÀý  | 
|         key = (zoneID, funcMapID)  | 
|         if key in self.funcTeamListDict:  | 
|             funcTeamList = self.funcTeamListDict[key]  | 
|             if funcTeam in funcTeamList:  | 
|                 funcTeamList.remove(funcTeam)  | 
|                   | 
|         self.funcTeamDict.pop(teamID, None)  | 
|         return  | 
|       | 
|     def OnTeamMemTeamIDChange(self, zoneID, funcMapID, teamID, playerID, updTeamID):  | 
|         self.__UpdPlayerTeamID(playerID, funcMapID, updTeamID)  | 
|         self.SyncMapFuncTeamMemIDInfo([teamID])  | 
|         self.SortTeam(zoneID, funcMapID, "member")  | 
|         return  | 
|       | 
|     def __UpdPlayerTeamID(self, playerID, funcMapID, teamID):  | 
|         if playerID not in self.playerFuncTeamIDDict:  | 
|             self.playerFuncTeamIDDict[playerID] = {}  | 
|         teamIDDict = self.playerFuncTeamIDDict[playerID]  | 
|         if not teamID:  | 
|             teamIDDict.pop(funcMapID, 0)  | 
|             if not teamIDDict:  | 
|                 self.playerFuncTeamIDDict.pop(playerID, None)  | 
|         else:  | 
|             teamIDDict[funcMapID] = teamID  | 
|         return  | 
|       | 
|     def GetPlayerTeamID(self, playerID, funcMapID):  | 
|         if playerID not in self.playerFuncTeamIDDict:  | 
|             return 0  | 
|         teamIDDict = self.playerFuncTeamIDDict[playerID]  | 
|         return teamIDDict.get(funcMapID, 0)  | 
|     def GetPlayerTeamIDDict(self, playerID): return self.playerFuncTeamIDDict.get(playerID, {})  | 
|       | 
|     def IsTeamPlayer(self, playerID):  | 
|         if playerID in self.playerFuncTeamIDDict:  | 
|             return True  | 
|         for teamList in self.funcTeamListDict.values():  | 
|             for funcTeam in teamList:  | 
|                 if playerID in funcTeam.GetApplyIDList():  | 
|                     return True  | 
|         return False  | 
|       | 
|     # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup  | 
|     def GetSaveData(self):  | 
|         savaData = ""  | 
|         cntData = ""  | 
|         cnt = 0  | 
|           | 
|         for teamList in self.funcTeamListDict.values():  | 
|             for funcTeam in teamList: # °´ÅźõĶÓÎé˳Ðò±£´æ  | 
|                 cnt += 1  | 
|                 savaData += funcTeam.getBuffer()  | 
|                   | 
|         GameWorld.Log("Save DBPyFuncTeam count :%s len=%s" % (cnt, len(savaData)))  | 
|         return CommFunc.WriteDWORD(cntData, cnt) + savaData  | 
|       | 
|     # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý  | 
|     def LoadPyGameData(self, datas, pos, dataslen):  | 
|         cnt, pos = CommFunc.ReadDWORD(datas, pos)  | 
|         GameWorld.Log("Load DBPyFuncTeam count :%s" % cnt)  | 
|           | 
|         self.Clear()  | 
|           | 
|         for _ in xrange(cnt):  | 
|             dbTeamData = PyGameDataStruct.tagDBPyFuncTeam()  | 
|             dbTeamData.clear()  | 
|             pos += dbTeamData.readData(datas, pos, dataslen)  | 
|               | 
|             self.__AddFuncTeam(PyFuncTeam(dbTeamData))  | 
|               | 
|         return pos  | 
|       | 
|     def OnTeamLoadOK(self):  | 
|         GameWorld.DebugLog("¹¦ÄܶÓÎé¼ÓÔØÍê±Ï")  | 
|         self.__loadOK = True  | 
|         for key in self.funcTeamListDict.keys():  | 
|             zoneID, funcMapID = key  | 
|             self.SortTeam(zoneID, funcMapID)  | 
|         return  | 
|       | 
| def OnGameServerInitOK():  | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     funcTeamMgr.OnTeamLoadOK()  | 
|     return  | 
|   | 
| def OnMapServerInitOK():  | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     funcTeamMgr.SyncMapFuncTeamMemIDInfo()  | 
|     return  | 
|   | 
| 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 ´´½¨¹¦ÄܶÓÎé #tagCGCreateFuncTeam  | 
| #  | 
| #struct    tagCGCreateFuncTeam  | 
| #{  | 
| #    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 Ð޸ŦÄܶÓÎé #tagCGChangeFuncTeam  | 
| #  | 
| #struct    tagCGChangeFuncTeam  | 
| #{  | 
| #    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 ¹¦ÄܶÓÎé³ÉÔ±²Ù×÷ #tagCGFuncTeamMemOP  | 
| #  | 
| #struct    tagCGFuncTeamMemOP  | 
| #{  | 
| #    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 ²éÕÒ¹¦ÄܶÓÎéÁбí #tagCGQueryFuncTeam  | 
| #  | 
| #struct    tagCGQueryFuncTeam  | 
| #{  | 
| #    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 ²éÕÒÍæ¼Ò¹¦ÄܶÓÎé #tagCGQueryPlayerFuncTeam  | 
| #  | 
| #struct    tagCGQueryPlayerFuncTeam  | 
| #{  | 
| #    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)  | 
|       | 
|     # Ä³Ð©¹¦ÄÜ´´½¨Ç°¼ì²é  | 
|     if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:  | 
|         pass  | 
|       | 
|     newTeam = None  | 
|     teamID = 0  | 
|     newTeamInfo = {}  | 
|     if canCreate:  | 
|         PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase)  | 
|         funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|         newTeam = funcTeamMgr.CreateFuncTeam(playerID, teamInfo, zoneID)  | 
|           | 
|     if newTeam:  | 
|         teamID = newTeam.GetTeamID()  | 
|         newTeamInfo = newTeam.GetSyncDict(True)  | 
|           | 
|         # Ä³Ð©¹¦ÄÜ´´½¨ºó´¦Àí  | 
|         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  | 
|   |