| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GM.Commands.FuncTeam  | 
| #  | 
| # @todo:¹¦ÄܶÓÎé  | 
| # @author hxp  | 
| # @date 2024-08-02  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¹¦ÄܶÓÎé  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2024-08-02 16:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import PyDataManager  | 
| import PlayerFuncTeam  | 
| import IpyGameDataPY  | 
| import ShareDefine  | 
| import ChConfig  | 
| import random  | 
|   | 
| #---------------------------------------------------------------------  | 
| #Â߼ʵÏÖ  | 
| ## Ö´ÐÐÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param gmList [cmdIndex gmAccID msg]  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnExec(curPlayer, gmList):  | 
|     ## ±¾·þ´¦Àí  | 
|     GameWorld.DebugAnswer(curPlayer, "----------------------------")  | 
|     if not gmList:  | 
|         GameWorld.DebugAnswer(curPlayer, "Çå¿Õ¶ÓÎé: FuncTeam 0")  | 
|         GameWorld.DebugAnswer(curPlayer, "ɾ³ý¶ÓÎé: FuncTeam d teamID")  | 
|         GameWorld.DebugAnswer(curPlayer, "´´½¨¶ÓÎé: FuncTeam c mapID ¸öÊý [×îµÍµÈ¼¶ ×îµÍÕ½Á¦ ½ö±¾·þ ÐèÒªÉóºË mapEx zoneID]")  | 
|         GameWorld.DebugAnswer(curPlayer, "Ìí¼ÓÉêÇë: FuncTeam a teamID ÈËÊý [Ö¸¶¨ID ...]")  | 
|         GameWorld.DebugAnswer(curPlayer, "Êä³ö¶ÓÎé: FuncTeam p [teamID]")  | 
|         GameWorld.DebugAnswer(curPlayer, "Êä³öÍæ¼Ò¶ÓÎé: FuncTeam pt [playerID]")  | 
|         GameWorld.DebugAnswer(curPlayer, "ÉèÖöÓÎéIDÉÏÏÞ: FuncTeam idMax ×î´ó¶ÓÎéID")  | 
|     return  | 
|   | 
| def OnGetMergeParam(curPlayer):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     serverGroupID = GameWorld.GetServerGroupID()  | 
|     return [serverGroupID, playerID]  | 
|   | 
| def OnMergeServerExec(gmList, tick):  | 
|     ## ¿ç·þ´¦Àí  | 
|       | 
|     serverGroupID = gmList[-2]  | 
|     playerID = gmList[-1]  | 
|       | 
|     gmList = gmList[:-2]  | 
|     if not gmList:  | 
|         return  | 
|       | 
|     value1 = gmList[0]  | 
|     if value1 == 0:  | 
|         delCount = PlayerFuncTeam.DelTealAll()  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "¹¦ÄܶÓÎéÒÑÇå¿Õ! delCount=%s" % delCount)  | 
|           | 
|     elif value1 == "d":  | 
|         teamID = gmList[1] if len(gmList) > 1 else 0  | 
|         isOK = PlayerFuncTeam.DelTeam(teamID)  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ɾ³ý¶ÓÎé[%s], isOK=%s" % (teamID, isOK))  | 
|           | 
|     elif value1 == "c":  | 
|         __CreateFuncTeam(playerID, serverGroupID, gmList)  | 
|           | 
|     elif value1 == "a":  | 
|         __AddApplyPlayer(playerID, serverGroupID, gmList)  | 
|                   | 
|     elif value1 == "p":  | 
|         __PrintFuncTeamInfo(playerID, serverGroupID, gmList)  | 
|           | 
|     elif value1 == "pt":  | 
|         __PrintPlayerFuncTeamInfo(playerID, serverGroupID, gmList)  | 
|           | 
|     elif value1 == "idMax":  | 
|         teamIDMax = gmList[1] if len(gmList) > 1 else 99999  | 
|         funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|         funcTeamMgr.teamIDMax = teamIDMax  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÉèÖöÓÎéIDÉÏÏÞ£º%s" % teamIDMax)  | 
|     return  | 
|   | 
| def __CreateFuncTeam(playerID, serverGroupID, gmList):  | 
|     ## ´´½¨ÐéÄâ¶ÓÎé  | 
|     funcMapID = gmList[1] if len(gmList) > 1 else 0  | 
|     createCount = gmList[2] if len(gmList) > 2 else 1  | 
|     minLV = gmList[3] if len(gmList) > 3 else 0  | 
|     minFightPower = gmList[4] if len(gmList) > 4 else 0  | 
|     serverOnly = gmList[5] if len(gmList) > 5 else 0  | 
|     needCheck = gmList[6] if len(gmList) > 6 else 0  | 
|     funcMapEx = gmList[7] if len(gmList) > 7 else 0  | 
|     zoneID = gmList[8] if len(gmList) > 8 else 0  | 
|     if not zoneID:  | 
|         zoneInfo = PlayerFuncTeam.GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID)  | 
|         if not zoneInfo:  | 
|             return  | 
|         zoneID, _ = zoneInfo  | 
|           | 
|     captainID = 0  | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     captainIDList = funcTeamMgr.playerFuncTeamIDDict.keys()  | 
|     if captainIDList:  | 
|         captainID = min(captainIDList)  | 
|           | 
|     if not captainID or captainID > 10000:  | 
|         captainID = 10000 # ¼Ù¶Ó³¤ID´Ó9999µ¹Ðò  | 
|           | 
|     FakeName = "¶ÓÎéÃû".decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())  | 
|     teamInfo = {"funcMapID":funcMapID, "funcMapEx":funcMapEx, "teamName":"", "minLV":minLV,   | 
|                "minFightPower":minFightPower % ChConfig.Def_PerPointValue,   | 
|                "minFightPowerEx":minFightPower / ChConfig.Def_PerPointValue,   | 
|                "serverOnly":serverOnly, "needCheck":needCheck}  | 
|       | 
|     funcTeamMgr.LockBatch()  | 
|     createTeamIDList = []  | 
|     for _ in xrange(createCount):  | 
|         captainID -= 1  | 
|         if captainID <= 0:  | 
|             break  | 
|         teamInfo.update({  | 
|                          "teamName":"%s%s" % (FakeName, captainID),   | 
|                          })  | 
|         newTeam = funcTeamMgr.CreateFuncTeam(captainID, teamInfo, zoneID)  | 
|         if not newTeam:  | 
|             break  | 
|         createTeamIDList.append(newTeam.GetTeamID())  | 
|           | 
|     funcTeamMgr.UnLockBatch()  | 
|     funcTeamMgr.SortTeam(zoneID, funcMapID)  | 
|     funcTeamMgr.SyncMapFuncTeamMemIDInfo(createTeamIDList)  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "³É¹¦´´½¨¶ÓÎéÊý:%s, ×ܶÓÎéÊý:%s" % (len(createTeamIDList), len(funcTeamMgr.funcTeamDict)))  | 
|     return  | 
|   | 
| def __AddApplyPlayer(playerID, serverGroupID, gmList):  | 
|     ## Ìí¼ÓÉêÇëÈËÊý  | 
|     teamID = gmList[1] if len(gmList) > 1 else 0  | 
|     applyCount = gmList[2] if len(gmList) > 2 else 1  | 
|     applyPlayerIDList = gmList[3:] if len(gmList) > 3 else []  | 
|       | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     funcTeam = funcTeamMgr.GetFuncTeam(teamID)  | 
|     if not funcTeam:  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "¶ÓÎé²»´æÔÚ! teamID=%s" % teamID)  | 
|         return  | 
|     funcMapID = funcTeam.GetFuncMapID()  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)  | 
|     if not ipyData:  | 
|         return  | 
|     applyMax = ipyData.GetApplyMax()  | 
|     if not applyMax:  | 
|         applyMax = 50  | 
|     applyMax = min(applyMax, 100)  | 
|       | 
|     addCount = 0  | 
|     while applyCount > 0:  | 
|         if applyPlayerIDList:  | 
|             applyID = applyPlayerIDList.pop(0)  | 
|         else:  | 
|             applyID = random.randint(100, 1000)  | 
|         applyIDList = funcTeam.GetApplyIDList()  | 
|         if len(applyIDList) >= applyMax:  | 
|             break  | 
|         if applyID in applyIDList:  | 
|             continue  | 
|         if applyID in funcTeam.GetMemberIDList():  | 
|             continue  | 
|         funcTeam.AddApplyID(applyID)  | 
|         addCount += 1  | 
|         applyCount -= 1  | 
|           | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "¶ÓÎéÉêÇëÈë¶ÓÊý:%s,teamID:%s,ÐÂÔö:%s" % (len(funcTeam.GetApplyIDList()), teamID, addCount))  | 
|       | 
|     PlayerFuncTeam.SendFuncTeamToClientServer(teamID)  | 
|     return  | 
|   | 
| def __PrintPlayerFuncTeamInfo(playerID, serverGroupID, gmList):  | 
|     ## Êä³öÍæ¼Ò¶ÓÎé  | 
|     tagPlayerID = gmList[1] if len(gmList) > 1 else playerID  | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     if tagPlayerID not in funcTeamMgr.playerFuncTeamIDDict:  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "Íæ¼ÒûÓжÓÎé! %s" % tagPlayerID)  | 
|         return  | 
|     funcTeamIDDict = funcTeamMgr.playerFuncTeamIDDict[tagPlayerID]  | 
|     for teamID in funcTeamIDDict.values():  | 
|         __PrintFuncTeamDetail(playerID, serverGroupID, teamID)  | 
|     return  | 
|   | 
| def __PrintFuncTeamDetail(playerID, serverGroupID, teamID):  | 
|     ## Êä³ö¶ÓÎéÃ÷ϸ  | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     funcTeam = funcTeamMgr.GetFuncTeam(teamID)  | 
|     if not funcTeam:  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "¶ÓÎé²»´æÔÚ! teamID=%s" % teamID)  | 
|         return  | 
|     captainID = funcTeam.GetCaptainID()  | 
|     memberIDList = funcTeam.GetMemberIDList()  | 
|     applyIDList = funcTeam.GetApplyIDList()  | 
|     fpTotal = funcTeam.GetMemFightPowerTotal()  | 
|     needCheck = funcTeam.GetNeedCheck()  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "¶ÓÎéID=%s,¶Ó³¤=%s,¶ÓÔ±=%s,ÉêÇë=%s"   | 
|                                % (teamID, captainID, len(memberIDList), len(applyIDList)))  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "    zoneID=%s,mapID=%s-%s,Éó:%s"   | 
|                                % (funcTeam.GetZoneID(), funcTeam.GetFuncMapID(), funcTeam.GetFuncMapEx(), needCheck))  | 
|     #GameWorld.DebugAnswerCross(playerID, serverGroupID, "    ¶ÓÃû=%s" % (funcTeam.GetTeamName()))  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "    ×ÜÕ½Á¦=%s" % (fpTotal))  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "    ¶ÓÔ±ID=%s" % (memberIDList))  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "    ÉêÇëID=%s %s" % (applyIDList, len(applyIDList)))  | 
|     return  | 
|   | 
| def __PrintFuncTeamInfo(playerID, serverGroupID, gmList):  | 
|     ## Êä³ö¶ÓÎé  | 
|       | 
|     teamID = gmList[1] if len(gmList) > 1 else 0  | 
|       | 
|     if teamID:  | 
|         __PrintFuncTeamDetail(playerID, serverGroupID, teamID)  | 
|         return  | 
|       | 
|     funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()  | 
|     if not funcTeamMgr.funcTeamDict:  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "ûÓй¦ÄܶÓÎé!")  | 
|         return  | 
|     GameWorld.DebugAnswerCross(playerID, serverGroupID, "×ܶÓÎéÊý:%s,×îСID:%s,×î´óID:%s"   | 
|                                % (len(funcTeamMgr.funcTeamDict), min(funcTeamMgr.funcTeamDict), max(funcTeamMgr.funcTeamDict)))  | 
|       | 
|     for key, funcTeamList in funcTeamMgr.funcTeamListDict.items():  | 
|         zoneID, funcMapID = key  | 
|         if not funcTeamList:  | 
|             continue  | 
|         GameWorld.DebugAnswerCross(playerID, serverGroupID, "zoneID=%s,funcMapID=%s,¶ÓÎéÊý=%s" % (zoneID, funcMapID, len(funcTeamList)))  | 
|         for num, funcTeam in enumerate(funcTeamList[:20], 1):  | 
|             teamID = funcTeam.GetTeamID()  | 
|             captainID = funcTeam.GetCaptainID()  | 
|             memberIDList = funcTeam.GetMemberIDList()  | 
|             applyIDList = funcTeam.GetApplyIDList()  | 
|             fpTotal = funcTeam.GetMemFightPowerTotal()  | 
|             needCheck = funcTeam.GetNeedCheck()  | 
|             GameWorld.DebugAnswerCross(playerID, serverGroupID, "%s,ID%s,¶Ó³¤%s,Ô±%s-%s,Éó%s,Õ½%s"   | 
|                                        % (num, teamID, captainID, len(memberIDList), len(applyIDList), needCheck, fpTotal))  | 
|     return  | 
|   |