#!/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) # ijЩ¹¦ÄÜ´´½¨Ç°¼ì²é 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) # 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