#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package DB.StructData.DBFuncTeam # # @todo:¹¦ÄܶÓÎé±í # @author hxp # @date 2025-05-28 # @version 1.0 # # ÏêϸÃèÊö: ¹¦ÄܶÓÎé±í # #------------------------------------------------------------------------------- #"""Version = 2025-05-28 10:00""" #------------------------------------------------------------------------------- import DBStruct import GameWorld import IpyGameDataPY import PlayerViewCache import DBDataMgr import CommFunc import ChConfig import time class FuncTeamMem(): ## ¹¦ÄܶÓÎé³ÉÔ± def __init__(self, dbData=None): self.__dbData = DBStruct.tagDBFuncTeamMem() if not dbData else dbData return def GetTeamID(self): return self.__dbData.TeamID def SetTeamID(self, teamID): self.__dbData.TeamID = teamID def GetPlayerID(self): return self.__dbData.PlayerID def SetPlayerID(self, playerID): self.__dbData.PlayerID = playerID def GetValue1(self): return self.__dbData.Value1 def SetValue1(self, value1): self.__dbData.Value1 = value1 def GetValue2(self): return self.__dbData.Value2 def SetValue2(self, value2): self.__dbData.Value2 = value2 def GetValue3(self): return self.__dbData.Value3 def SetValue3(self, value3): self.__dbData.Value3 = value3 def GetValue4(self): return self.__dbData.Value4 def SetValue4(self, value4): self.__dbData.Value4 = value4 def GetValue5(self): return self.__dbData.Value5 def SetValue5(self, value5): self.__dbData.Value5 = value5 def GetBuffer(self): return self.__dbData.getBuffer() def GetFightPower(self): viewCache = PlayerViewCache.FindViewCache(self.GetPlayerID()) return viewCache.GetFightPowerTotal() if viewCache else 0 class FuncTeam(): ## ¹¦ÄܶÓÎé def __init__(self, dbData=None): self.__dbData = DBStruct.tagDBFuncTeam() if not dbData else dbData self.__memberList = [] try: self.__applyIDList = eval(self.__dbData.ApplyIDList) except: self.__applyIDList = [] return def GetTeamID(self): return self.__dbData.TeamID def SetTeamID(self, teamID): self.__dbData.TeamID = teamID def GetTeamName(self): return self.__dbData.TeamName def SetTeamName(self, teamName): self.__dbData.SetTeamName(teamName) def GetZoneID(self): return self.__dbData.ZoneID def SetZoneID(self, zoneID): self.__dbData.ZoneID = zoneID def GetFuncMapID(self): return self.__dbData.FuncMapID def SetFuncMapID(self, funcMapID): self.__dbData.FuncMapID = funcMapID def GetFuncMapEx(self): return self.__dbData.FuncMapEx def SetFuncMapEx(self, funcMapEx): self.__dbData.FuncMapEx = funcMapEx def GetCreateTime(self): return self.__dbData.CreateTime def SetCreateTime(self, createTime): self.__dbData.CreateTime = createTime def GetCaptainID(self): return self.__dbData.CaptainID def SetCaptainID(self, captainID): self.__dbData.CaptainID = captainID def GetMinLV(self): return self.__dbData.MinLV def SetMinLV(self, minLV): self.__dbData.MinLV = minLV def GetMinFightPower(self): return self.__dbData.MinFightPower def GetMinFightPowerEx(self): return self.__dbData.MinFightPowerEx def SetMinFightPowerTotal(self, minFightPower): self.__dbData.MinFightPower = minFightPower % ChConfig.Def_PerPointValue self.__dbData.MinFightPowerEx = minFightPower / ChConfig.Def_PerPointValue return def GetServerOnly(self): return self.__dbData.ServerOnly def SetServerOnly(self, serverOnly): self.__dbData.ServerOnly = serverOnly def GetNeedCheck(self): return self.__dbData.NeedCheck def SetNeedCheck(self, needCheck): self.__dbData.NeedCheck = needCheck def GetValue1(self): return self.__dbData.Value1 def SetValue1(self, value1): self.__dbData.Value1 = value1 def GetValue2(self): return self.__dbData.Value2 def SetValue2(self, value2): self.__dbData.Value2 = value2 def GetValue3(self): return self.__dbData.Value3 def SetValue3(self, value3): self.__dbData.Value3 = value3 def GetValue4(self): return self.__dbData.Value4 def SetValue4(self, value4): self.__dbData.Value4 = value4 def GetValue5(self): return self.__dbData.Value5 def SetValue5(self, value5): self.__dbData.Value5 = value5 def GetBuffer(self): self.__dbData.ApplyIDList = str(self.__applyIDList).replace(" ", "") self.__dbData.ApplyIDLen = len(self.__dbData.ApplyIDList) return self.__dbData.getBuffer() def InitTeamMemInstance(self, dbData): '''³õʼ»¯¹¦ÄÜÊý¾ÝʵÀý£¬´´½¨»ò¼ÓÔØÊý¾ÝʱͨÓ㬹¦ÄÜÒ»°ã²»µ÷Óà @param dbData: ʵÀý¶ÔÓ¦°ó¶¨µÄdbData @return: ³É¹¦·µ»ØÊµÀý¶ÔÏó£¬Ê§°Ü·µ»ØNone ''' teamMem = FuncTeamMem(dbData) self.__memberList.append(teamMem) DBDataMgr.GetFuncTeamMgr().UpdPlayerTeamID(teamMem.GetPlayerID(), self.GetFuncMapID(), self.GetTeamID()) return teamMem def AddTeamMember(self, playerID): teamMem = None self.DelApplyID(playerID) # ¼ÓÈëµÄͬʱ´ÓÉêÇëÁбíÖÐÒÆ³ý mem = self.GetMemberByID(playerID) if mem: teamMem = mem return teamMem dbData = DBStruct.tagDBFuncTeamMem() dbData.TeamID = self.GetTeamID() dbData.PlayerID = playerID teamMem = self.InitTeamMemInstance(dbData) return teamMem def GetMemberCount(self): return len(self.__memberList) def GetMemberAt(self, index): mem = None if 0 <= index < len(self.__memberList): mem = self.__memberList[index] elif False: mem = FuncTeamMem() return mem 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) DBDataMgr.GetFuncTeamMgr().UpdPlayerTeamID(playerID, self.GetFuncMapID(), 0) break 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 FuncTeamMgr(): ## ¹¦ÄܶÓÎé¹ÜÀí def __init__(self): self.__funcTeamDict = {} # {teamID:FuncTeam, ...} self.__funcTeamListDict = {} # {funcMapID:{zoneID:[FuncTeam, ...], ...}, ...} self.__playerFuncTeamIDDict = {} # {playerID:{funcMapID:teamID, ...}, ...} # self.__loopTeamID = 0 # µÝÔö£¬Ö±µ½³¬¹ýÉÏÏÞºó£¬ÔÙ´ÓÍ·¿ªÊ¼ return def __GetNewTeamID(self): ## »ñȡжÓÎéID idMin, idMax = 100, 9999 # ·Ç¿ç·þ¶ÓÎéID·¶Î§£¬´æ´¢±¾·þ£¬ºÏ·þÇå¿Õ if GameWorld.IsCrossServer(): idMin, idMax = 10000, 99999 # ¿ç·þ¶ÓÎé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 else: self.__loopTeamID += 1 if self.__loopTeamID not in self.__funcTeamDict: newTeamID = self.__loopTeamID break return newTeamID def __InitTeamInstance(self, dbData): '''³õʼ»¯¹¦ÄÜÊý¾ÝʵÀý£¬´´½¨»ò¼ÓÔØÊý¾ÝʱͨÓ㬹¦ÄÜÒ»°ã²»µ÷Óà @param dbData: ʵÀý¶ÔÓ¦°ó¶¨µÄdbData @return: ³É¹¦·µ»ØÊµÀý¶ÔÏó£¬Ê§°Ü·µ»ØNone ''' team = FuncTeam(dbData) teamID = team.GetTeamID() zoneID = team.GetZoneID() funcMapID = team.GetFuncMapID() funcTeamList = self.__getFuncTeamList(funcMapID, zoneID) if team not in funcTeamList: funcTeamList.append(team) self.__funcTeamDict[teamID] = team return team def __getFuncTeamList(self, funcMapID, zoneID): if funcMapID not in self.__funcTeamListDict: self.__funcTeamListDict[funcMapID] = {} funcZoneTeamDict = self.__funcTeamListDict[funcMapID] if zoneID not in funcZoneTeamDict: funcZoneTeamDict[zoneID] = [] funcTeamList = funcZoneTeamDict[zoneID] return funcTeamList def CreateFuncTeam(self, playerID, funcMapID, funcMapEx, teamName="", zoneID=0): funcTeam = None teamID = self.__GetNewTeamID() if not teamID: return funcTeam dbData = DBStruct.tagDBFuncTeam() dbData.TeamID = teamID dbData.TeamName = teamName dbData.ZoneID = zoneID dbData.FuncMapID = funcMapID dbData.FuncMapEx = funcMapEx dbData.CreateTime = int(time.time()) dbData.CaptainID = playerID funcTeam = self.__InitTeamInstance(dbData) funcTeam.AddTeamMember(playerID) return funcTeam def SortTeam(self, funcMapID, zoneID, sortReason=""): ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID) if not ipyData: return sortType = ipyData.GetSortType() sortReverse = ipyData.GetSortReverse() teamList = self.__getFuncTeamList(funcMapID, zoneID) if not teamList: return # °´´´½¨Ê±¼ä 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 GetFuncTeam(self, teamID): funcTeam = None if teamID in self.__funcTeamDict: funcTeam = self.__funcTeamDict[teamID] if not funcTeam and False: # ²»»áÖ´ÐУ¬½öΪÁË.Ìáʾ´úÂëÓà funcTeam = FuncTeam() return funcTeam def DelTeam(self, teamID): ## ɾ³ý¶ÓÎé funcTeam = self.GetFuncTeam(teamID) if not funcTeam: return zoneID = funcTeam.GetZoneID() funcMapID = funcTeam.GetFuncMapID() for index in range(funcTeam.GetMemberCount()): mem = funcTeam.GetMemberAt(index) self.UpdPlayerTeamID(mem.GetPlayerID(), funcMapID, 0) # ÒÆ³ýʵÀý teamList = self.__getFuncTeamList(funcMapID, zoneID) if funcTeam in teamList: teamList.remove(funcTeam) self.__funcTeamDict.pop(teamID, None) 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 zoneTeamInfo in self.__funcTeamListDict.values(): for funcTeamList in zoneTeamInfo.values(): for funcTeam in funcTeamList: if playerID in funcTeam.GetApplyIDList(): return True return False # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): teamCnt, teamSavaData = 0, "" memCnt, memSavaData = 0, "" for zoneTeamInfo in self.__funcTeamListDict.values(): for funcTeamList in zoneTeamInfo.values(): for funcTeam in funcTeamList: teamSavaData += funcTeam.GetBuffer() teamCnt += 1 for index in range(funcTeam.GetMemberCount()): mem = funcTeam.GetMemberAt(index) memSavaData += mem.GetBuffer() memCnt += 1 saveData = "" saveData += CommFunc.WriteDWORD("", teamCnt) + teamSavaData GameWorld.Log("Save DBFuncTeam count :%s len=%s" % (teamCnt, len(teamSavaData))) saveData += CommFunc.WriteDWORD("", memCnt) + memSavaData GameWorld.Log("Save DBFuncTeamMem count :%s len=%s" % (memCnt, len(memSavaData))) return saveData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): # ¶ÓÎé cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load DBFuncTeam count :%s" % cnt) for _ in xrange(cnt): dbData = DBStruct.tagDBFuncTeam() pos += dbData.readData(datas, pos, dataslen) self.__InitTeamInstance(dbData) # ³ÉÔ± cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load DBFuncTeamMem count :%s" % cnt) for _ in xrange(cnt): dbData = DBStruct.tagDBFuncTeamMem() pos += dbData.readData(datas, pos, dataslen) team = self.GetFuncTeam(dbData.TeamID) if not team: continue team.InitTeamMemInstance(dbData) # ÅÅÐò for funcMapID, zoneTeamInfo in self.__funcTeamListDict.items(): for zoneID in zoneTeamInfo.keys(): self.SortTeam(funcMapID, zoneID) return pos