|  |  |  | 
|---|
|  |  |  | import ChPyNetSendPack | 
|---|
|  |  |  | import DataRecordPack | 
|---|
|  |  |  | import PlayerControl | 
|---|
|  |  |  | import PlayerFriend | 
|---|
|  |  |  | import ShareDefine | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  | import GameWorld | 
|---|
|  |  |  | 
|---|
|  |  |  | DR_Team(eventName, teamID, drDict) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncMapServerPlayerNoTeam(curPlayer): | 
|---|
|  |  |  | ## 同步地图玩家没有队伍,切图时调用 | 
|---|
|  |  |  | teamInfo = ChGameToMapPyPack.tagGMTeamInfo() | 
|---|
|  |  |  | teamInfo.PlayerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | teamInfo.TeamID = 0 | 
|---|
|  |  |  | teamInfo.TeamLV = 0 | 
|---|
|  |  |  | teamInfo.MemInfoList = [] | 
|---|
|  |  |  | teamInfo.MemCnt = len(teamInfo.MemInfoList) | 
|---|
|  |  |  | NetPackCommon.SendPyPackToMapServer(curPlayer.GetLineNO(), curPlayer.GetRealMapID(), teamInfo) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncMapServerPlayerLeaveTeam(curPlayer, teamID): | 
|---|
|  |  |  | ## 同步地图玩家离开队伍 | 
|---|
|  |  |  | leavePack = ChGameToMapPyPack.tagGMPlayerLeaveTeam() | 
|---|
|  |  |  | leavePack.PlayerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | leavePack.CopyMapID = curPlayer.GetFBID() | 
|---|
|  |  |  | leavePack.TeamID = teamID | 
|---|
|  |  |  | NetPackCommon.SendPyPackToMapServer(curPlayer.GetLineNO(), curPlayer.GetRealMapID(), leavePack) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #// B9 03 修改队伍信息 #tagCGChangeTeamInfo | 
|---|
|  |  |  | 
|---|
|  |  |  | #GameServer清除玩家队伍ID为空 | 
|---|
|  |  |  | delPlayer.SetTeam(None) | 
|---|
|  |  |  | #通知MapServerd队伍变更, 在mapserver构建目前队伍 | 
|---|
|  |  |  | delPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | #delPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | SyncMapServerPlayerLeaveTeam(delPlayer, curTeam.GetTeamID()) | 
|---|
|  |  |  | #玩家离开副本 | 
|---|
|  |  |  | delPlayer.MapServer_LeaveFB() | 
|---|
|  |  |  | if IsTeamMatchingPlayer(curTeam.GetTeamID()): | 
|---|
|  |  |  | 
|---|
|  |  |  | #GameServer玩家队伍为空 | 
|---|
|  |  |  | curPlayer.SetTeam(None) | 
|---|
|  |  |  | #通知MapServerd队伍变更 | 
|---|
|  |  |  | curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | #curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | SyncMapServerPlayerLeaveTeam(curPlayer, curTeam.GetTeamID()) | 
|---|
|  |  |  | __DoLogic_PlayerTeamChange(curPlayer) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if curMember.GetTeamLV() != IPY_GameServer.tmlLeader: | 
|---|
|  |  |  | 
|---|
|  |  |  | if curTeam == None: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if curTeam.GetTeamPlayerCount() <= 1: | 
|---|
|  |  |  | #补救完毕, 队伍中只有一个人, 删除这个队伍 | 
|---|
|  |  |  | GameWorld.Log('玩家(%s)仍然有队伍(%s), 补救完毕, 队伍中只有一个人, 删除这个队伍' % (playerID, curTeamID)) | 
|---|
|  |  |  | DeleteTeam(curTeam, tick) | 
|---|
|  |  |  | return | 
|---|
|  |  |  | #允许存在单人队伍,暂屏蔽该逻辑 | 
|---|
|  |  |  | #        if curTeam.GetTeamPlayerCount() <= 1: | 
|---|
|  |  |  | #            #补救完毕, 队伍中只有一个人, 删除这个队伍 | 
|---|
|  |  |  | #            GameWorld.Log('玩家(%s)仍然有队伍(%s), 补救完毕, 队伍中只有一个人, 删除这个队伍' % (playerID, curTeamID)) | 
|---|
|  |  |  | #            DeleteTeam(curTeam, tick) | 
|---|
|  |  |  | #            return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.Log('玩家(%s)仍然有队伍(%s), 补救' % (playerID, curTeamID)) | 
|---|
|  |  |  | curPlayer.SetTeamID(curTeamID) | 
|---|
|  |  |  | 
|---|
|  |  |  | curPlayer.SetTeam(None) | 
|---|
|  |  |  | curPlayer.Sync_LeaveTeam(1) | 
|---|
|  |  |  | #通知MapServer, 玩家已经队伍了, 刷新玩家的TeamID | 
|---|
|  |  |  | curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | #curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | SyncMapServerPlayerLeaveTeam(curPlayer, curTeamID) | 
|---|
|  |  |  | gameMap = GameWorld.GetMap(curPlayer.GetMapID()) | 
|---|
|  |  |  | if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam: | 
|---|
|  |  |  | curPlayer.MapServer_LeaveFB() | 
|---|
|  |  |  | 
|---|
|  |  |  | #如果队伍正在匹配中,则通知状态 | 
|---|
|  |  |  | if IsTeamMatchingPlayer(curTeamID): | 
|---|
|  |  |  | Sync_TeamMatchState(curPlayer, True) | 
|---|
|  |  |  | OnTeamMemFamilyRefresh(curPlayer, curPlayer.GetFamilyID()) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("Team.OnPlayerReadMapOK", curPlayer.GetPlayerID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 登录逻辑已处理,这里不重复处理 | 
|---|
|  |  |  | #=============================================================================================== | 
|---|
|  |  |  | # if curPlayer.GetTeamID() == 0: | 
|---|
|  |  |  | #    return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | # curTeam = GameWorld.GetTeamManager().FindTeam(curPlayer.GetTeamID()) | 
|---|
|  |  |  | # if curTeam == None: | 
|---|
|  |  |  | #    #通知MapServer, 玩家已经队伍了, 刷新玩家的TeamID | 
|---|
|  |  |  | #    curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | #    return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | # SyncMapServerTeamInfo(curTeam) | 
|---|
|  |  |  | # #curTeamMember = curTeam.GetMemberByID(curPlayer.GetPlayerID()) | 
|---|
|  |  |  | # ##通知MapServerd队伍变更 | 
|---|
|  |  |  | # #curPlayer.MapServer_Sync_Team(curTeamMember.GetTeamLV()) | 
|---|
|  |  |  | #=============================================================================================== | 
|---|
|  |  |  | if curPlayer.GetTeamID() == 0: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curTeam = GameWorld.GetTeamManager().FindTeam(curPlayer.GetTeamID()) | 
|---|
|  |  |  | if curTeam == None: | 
|---|
|  |  |  | #通知MapServer, 玩家已经队伍了, 刷新玩家的TeamID | 
|---|
|  |  |  | #curPlayer.MapServer_Sync_Team(0) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | mapID = curPlayer.GetMapID() | 
|---|
|  |  |  | loginMapID = curPlayer.GetDictByKey(ChConfig.Def_PDict_LoginMapID) | 
|---|
|  |  |  | if loginMapID and mapID != loginMapID: | 
|---|
|  |  |  | GameWorld.Log("Team.OnPlayerReadMapOK 地图与登录时地图不一致,重新同步一次!loginMapID=%s,mapID=%s" | 
|---|
|  |  |  | % (loginMapID, mapID), curPlayer.GetPlayerID()) | 
|---|
|  |  |  | Sync_TeamMemberInfo(curTeam) | 
|---|
|  |  |  | SyncMapServerTeamInfo(curTeam, "ReadMapOK", {"playerID":curPlayer.GetPlayerID()}) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #curTeamMember = curTeam.GetMemberByID(curPlayer.GetPlayerID()) | 
|---|
|  |  |  | ##通知MapServerd队伍变更 | 
|---|
|  |  |  | #curPlayer.MapServer_Sync_Team(curTeamMember.GetTeamLV()) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | ##组队玩家切换地图 | 
|---|
|  |  |  | 
|---|
|  |  |  | # 玩家进入组队副本,则停止匹配 | 
|---|
|  |  |  | if gameMap.GetMapFBType() == ChConfig.fbtTeam: | 
|---|
|  |  |  | DelPlayerIDFromMatchingList(curPlayer) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SyncMapServerPlayerNoTeam(curPlayer) # 没有队伍的时候切图也通知地图 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def PlayerTeamMemberRefresh(curPlayer, refreshType, value, tick): | 
|---|
|  |  |  | 
|---|
|  |  |  | ["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"], | 
|---|
|  |  |  | ShareDefine.EntFBAskRet_Sit:[["TeamMatchingSITMe", "TeamMatchingSITAll"], | 
|---|
|  |  |  | ["TeamEnterSITMe", "TeamEnterSITAll"], "Carry_lhs_697674"], | 
|---|
|  |  |  | ShareDefine.EntFBAskRet_CrossPKMatching:[["CrossMatching9", "CrossMatching10"], | 
|---|
|  |  |  | ["CrossMatching11", "CrossMatching12"], "CrossMatching8"], | 
|---|
|  |  |  | ShareDefine.EntFBAskRet_InCrossMap:[["CrossMap6", "CrossMap7"], | 
|---|
|  |  |  | ["CrossMap8", "CrossMap9"], "CrossMap5"], | 
|---|
|  |  |  | ShareDefine.EntFBAskRet_Other:[["TeamMatchingDefaultMe", "TeamMatchingDefaultAll"], | 
|---|
|  |  |  | ["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"], | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | askMapID, askMapEx, memStateDict = PyGameData.g_prepareTeamDict[teamID][:3] | 
|---|
|  |  |  | enterInfo = GetTeamFBEnterInfo(leader, curTeam, askMapID, askMapEx) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | leaderID = leader.GetPlayerID() | 
|---|
|  |  |  | friendList = [] | 
|---|
|  |  |  | memFamilyIDDict = {} | 
|---|
|  |  |  | memNameDict = {} | 
|---|
|  |  |  | #队长与队员的关系 | 
|---|
|  |  |  | for index in xrange(curTeam.GetMemberCount()): | 
|---|
|  |  |  | memPlayer = curTeam.GetMemberPlayer(index) | 
|---|
|  |  |  | if not memPlayer or not memPlayer.GetPlayerID(): | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | memPlayerID = memPlayer.GetPlayerID() | 
|---|
|  |  |  | if memPlayerID not in memStateDict: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | memFamilyIDDict[memPlayerID] = memPlayer.GetFamilyID() # 存储各队员的家族ID | 
|---|
|  |  |  | memNameDict[memPlayerID] = memPlayer.GetName() | 
|---|
|  |  |  | if leaderID != memPlayerID and PlayerFriend.IsFriend(leaderID, memPlayerID): | 
|---|
|  |  |  | friendList.append([leaderID, memPlayerID]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #踢出所有在此类副本,但不同线路的玩家 | 
|---|
|  |  |  | for index in xrange(curTeam.GetMemberCount()): | 
|---|
|  |  |  | memPlayer = curTeam.GetMemberPlayer(index) | 
|---|
|  |  |  | 
|---|
|  |  |  | resultName = str([askMapID, askMapEx] + enterInfo) | 
|---|
|  |  |  | memPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamAsk", resultName, len(resultName)) | 
|---|
|  |  |  | GameWorld.Log("队长成功进入组队副本, 队员开始进入副本: teamID=%s,memPlayerID=%s" % (teamID, memPlayerID), leader.GetPlayerID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for preMemPlayerID in memStateDict.keys(): | 
|---|
|  |  |  | if memPlayerID == preMemPlayerID: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | if PlayerFriend.IsFriend(memPlayerID, preMemPlayerID) and [memPlayerID, preMemPlayerID] not in friendList: | 
|---|
|  |  |  | friendList.append([memPlayerID, preMemPlayerID]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PyGameData.g_prepareTeamDict.pop(teamID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 同步进入组队副本的队员关系到目标地图 | 
|---|
|  |  |  | relationInfo = str(["InitRelation", teamID, friendList, memFamilyIDDict, memNameDict]) | 
|---|
|  |  |  | leader.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo)) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def OnTeamMemFriendChange(curPlayer, tagPlayerID, isFriend): | 
|---|
|  |  |  | ## 队员好友关系变更,离线也同步 | 
|---|
|  |  |  | teamID = curPlayer.GetTeamID() | 
|---|
|  |  |  | if not teamID: | 
|---|
|  |  |  | GameWorld.DebugLog("好友变更,无队伍不管!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  | curMapData = GameWorld.GetMap(curPlayer.GetMapID()) | 
|---|
|  |  |  | if not curMapData or curMapData.GetMapFBType() != ChConfig.fbtTeam: | 
|---|
|  |  |  | GameWorld.DebugLog("好友变更,不在组队副本不管!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | isSameTeam = False | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | curTeam = curPlayer.GetTeam() | 
|---|
|  |  |  | for index in xrange(curTeam.GetMemberCount()): | 
|---|
|  |  |  | memberInfo = curTeam.GetMemberInfo(index) | 
|---|
|  |  |  | if not memberInfo: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | memPlayerID = memberInfo.GetPlayerID() | 
|---|
|  |  |  | if tagPlayerID == memPlayerID: | 
|---|
|  |  |  | isSameTeam = True | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not isSameTeam: | 
|---|
|  |  |  | GameWorld.DebugLog("好友关系变更,不是同队伍不管!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | relationInfo = str(["FriendChange", teamID, playerID, tagPlayerID, isFriend]) | 
|---|
|  |  |  | curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo)) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def OnTeamMemFamilyRefresh(curPlayer, familyID): | 
|---|
|  |  |  | ## 队员仙盟变更,仅在线同步,上线同步 | 
|---|
|  |  |  | if not curPlayer: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | teamID = curPlayer.GetTeamID() | 
|---|
|  |  |  | if not teamID: | 
|---|
|  |  |  | GameWorld.DebugLog("家族变更,无队伍不管!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  | curMapData = GameWorld.GetMap(curPlayer.GetMapID()) | 
|---|
|  |  |  | if not curMapData or curMapData.GetMapFBType() != ChConfig.fbtTeam: | 
|---|
|  |  |  | GameWorld.DebugLog("家族变更,不在组队副本不管!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | familyID = curPlayer.GetFamilyID() | 
|---|
|  |  |  | relationInfo = str(["FamilyChange", teamID, playerID, familyID]) | 
|---|
|  |  |  | curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamRelation", relationInfo, len(relationInfo)) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __CheckTeamFBPlayerExist(curTeam): | 
|---|