#!/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
|
|