#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerFuncTeam
|
#
|
# @todo:¹¦ÄܶÓÎé±í
|
# @author hxp
|
# @date 2025-05-28
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¹¦ÄܶÓÎé±í£¬Ö§³Ö¿ç·þ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-05-28 10:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ShareDefine
|
import IpyGameDataPY
|
#import CrossBattlefield
|
import CrossRealmPlayer
|
import PlayerViewCache
|
import ChPyNetSendPack
|
#import CrossRealmMsg
|
import PlayerControl
|
import NetPackCommon
|
import DBDataMgr
|
import DirtyList
|
import ChConfig
|
|
# ¶ÓÎé²Ù×÷
|
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)
|
|
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 ´´½¨¹¦ÄܶÓÎé #tagCMCreateFuncTeam
|
#
|
#struct tagCMCreateFuncTeam
|
#{
|
# 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 Ð޸ŦÄܶÓÎé #tagCMChangeFuncTeam
|
#
|
#struct tagCMChangeFuncTeam
|
#{
|
# 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 ¹¦ÄܶÓÎé³ÉÔ±²Ù×÷ #tagCMFuncTeamMemOP
|
#
|
#struct tagCMFuncTeamMemOP
|
#{
|
# 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 ²éÕÒ¹¦ÄܶÓÎéÁбí #tagCMQueryFuncTeam
|
#
|
#struct tagCMQueryFuncTeam
|
#{
|
# 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 ²éÕÒÍæ¼Ò¹¦ÄܶÓÎé #tagCMQueryPlayerFuncTeam
|
#
|
#struct tagCMQueryPlayerFuncTeam
|
#{
|
# 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 = DBDataMgr.GetFuncTeamMgr()
|
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
|