|  |  | 
 |  |  | import IPY_GameServer
 | 
 |  |  | import ChGameToMapPyPack
 | 
 |  |  | import ChPyNetSendPack
 | 
 |  |  | import DataRecordPack
 | 
 |  |  | import PlayerControl
 | 
 |  |  | import PlayerFriend
 | 
 |  |  | import ShareDefine
 | 
 |  |  | import PyGameData
 | 
 |  |  | import GameWorld
 | 
 |  |  | 
 |  |  | 
 | 
 |  |  | import copy
 | 
 |  |  | import time
 | 
 |  |  | import random
 | 
 |  |  | 
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | TeamFBAskType_Match = 0 # 组队副本进入询问类型 - 匹配
 | 
 |  |  | 
 |  |  |     #设置当前玩家为队长
 | 
 |  |  |     curNewTeamMenber = curNewTeam.GetMemberByID(curPlayerID)
 | 
 |  |  |     if curNewTeamMenber == None:
 | 
 |  |  |         GameWorld.ErrLog("设置当前创建队伍玩家为队长, 找不到玩家!", curPlayerID)
 | 
 |  |  |         GameWorld.ErrLog("设置当前创建队伍玩家为队长, 找不到玩家!teamID=%s" % teamID, curPlayerID)
 | 
 |  |  |         DR_Team("CreateError", teamID, {"Leader":curPlayerID, "tagMapID":tagMapID, "tagMapEx":tagMapEx, "reqMinLV":reqMinLV, "reqMaxLV":reqMaxLV})
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     __SetTeamLV(curNewTeamMenber, IPY_GameServer.tmlLeader, False)
 | 
 |  |  |     if isSync:
 | 
 |  |  |         Sync_TeamMemberInfo(curNewTeam)
 | 
 |  |  |         SyncMapServerTeamInfo(curNewTeam)
 | 
 |  |  |         SyncMapServerTeamInfo(curNewTeam, "Create", {"Leader":curPlayerID, "tagMapID":tagMapID, "tagMapEx":tagMapEx, "reqMinLV":reqMinLV, "reqMaxLV":reqMaxLV})
 | 
 |  |  |         
 | 
 |  |  |     DelPlayerIDFromMatchingList(curPlayer)
 | 
 |  |  |     return curNewTeam
 | 
 |  |  | 
 |  |  |     #邀请组队的时候,双方都有队伍不处理
 | 
 |  |  |     if curPlayerTeam != None and tagPlayerTeam != None:
 | 
 |  |  |         #InviteEnterLost02  <n color="255,255,0">`o很抱歉,目标玩家已在他人队伍中,邀请入队失败!</n>  25  -   -
 | 
 |  |  |         PlayerControl.NotifyCode(curPlayer, "InviteEnterLost02")
 | 
 |  |  |         #PlayerControl.NotifyCode(curPlayer, "InviteEnterLost02")
 | 
 |  |  |         InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick)
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     if tagPlayerTeam == None:
 | 
 |  |  | 
 |  |  |     GameWorld.DebugLog("邀请组队, tagMapID=%s,tagMapEx=%s,tagPlayerID=%s" % (tagMapID, tagMapEx, tagPlayerID), curPlayerID)
 | 
 |  |  |     
 | 
 |  |  |     isTjg = PlayerControl.GetIsTJG(tagPlayer)
 | 
 |  |  |     if isTjg or not IsTeamInvateNeedCheck(tagPlayer):
 | 
 |  |  |     if (isTjg or not IsTeamInvateNeedCheck(tagPlayer)) and not tagPlayer.GetTeamID():
 | 
 |  |  |         GameWorld.DebugLog("被邀请的玩家处于脱机状态或不需要审核的,直接入队! tagPlayerID=%s,isTjg=%s" 
 | 
 |  |  |                            % (tagPlayerID, isTjg), curPlayerID)
 | 
 |  |  |         DoPlayerJoinTeam(tagPlayer, curPlayer, curPlayerTeam, tick, curPlayer)
 | 
 |  |  | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     #双方的队伍
 | 
 |  |  |     curPlayerTeam = curPlayer.GetTeam()  | 
 |  |  |     #curPlayerTeam = curPlayer.GetTeam()  | 
 |  |  |     tagPlayerTeam = tagPlayer.GetTeam()
 | 
 |  |  |     
 | 
 |  |  |     if tagPlayerTeam == None:
 | 
 |  |  | 
 |  |  |         PlayerControl.NotifyCode(curPlayer, "TeamNoExist")
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     if curPlayerTeam != None:
 | 
 |  |  |         #InviteEnterLost02  组队失败,双方都有队伍!
 | 
 |  |  |         PlayerControl.NotifyCode(curPlayer, "InviteEnterLost02")
 | 
 |  |  |         return
 | 
 |  |  |     #===============================================================================================
 | 
 |  |  |     # if curPlayerTeam != None:
 | 
 |  |  |     #    #InviteEnterLost02  组队失败,双方都有队伍!
 | 
 |  |  |     #    PlayerControl.NotifyCode(curPlayer, "InviteEnterLost02")
 | 
 |  |  |     #    return
 | 
 |  |  |     #===============================================================================================
 | 
 |  |  |     
 | 
 |  |  |     #组队类型
 | 
 |  |  |     #teamType = sendPack.GetTeamType()
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     #玩家本身有队伍时
 | 
 |  |  |     if joinPlayer.GetTeam():
 | 
 |  |  |         if notifyPlayer:
 | 
 |  |  |             # AcceptTeamLost 该玩家已有队伍
 | 
 |  |  |             PlayerControl.NotifyCode(notifyPlayer, "AcceptTeamLost")
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |         #===========================================================================================
 | 
 |  |  |         # if notifyPlayer:
 | 
 |  |  |         #    # AcceptTeamLost 该玩家已有队伍
 | 
 |  |  |         #    PlayerControl.NotifyCode(notifyPlayer, "AcceptTeamLost")
 | 
 |  |  |         # return
 | 
 |  |  |         #===========================================================================================
 | 
 |  |  |         #先退队
 | 
 |  |  |         DoPlayerLeaveTeam(joinPlayer, joinPlayer.GetTeam(), tick)
 | 
 |  |  |          | 
 |  |  |     teamID = tagTeam.GetTeamID()
 | 
 |  |  |     GameWorld.Log("%s(%d)加入队伍 %s(%d), teamID=%s!" % (joinPlayer.GetName(), joinPlayer.GetPlayerID(), 
 | 
 |  |  |                                                      teamPlayer.GetName(), teamPlayer.GetPlayerID(), teamID))
 | 
 |  |  | 
 |  |  |     #通知MapServerd队伍变更
 | 
 |  |  |     #teamPlayer.MapServer_Sync_Team(__GetPlayerTeamLV(teamPlayer))
 | 
 |  |  |     #joinPlayer.MapServer_Sync_Team(__GetPlayerTeamLV(joinPlayer))
 | 
 |  |  |     SyncMapServerTeamInfo(tagTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(tagTeam, "Join", {"teamPlayer":teamPlayer.GetPlayerID(), "joinPlayer":joinPlayer.GetPlayerID()})
 | 
 |  |  |     
 | 
 |  |  |     #֪ͨ
 | 
 |  |  |     #EnterProcession    <%S%>加入了队伍!  改为 GeRen_chenxin_543685
 | 
 |  |  | 
 |  |  |     teamMember = curTeam.GetMemberByID(curPlayer.GetPlayerID())
 | 
 |  |  |     return teamMember.GetTeamLV()
 | 
 |  |  | 
 | 
 |  |  | def SyncMapServerTeamInfo(curTeam):
 | 
 |  |  | def SyncMapServerTeamInfo(curTeam, eventName="", drDict={}):
 | 
 |  |  |     '''同步队伍信息到 MapServer 给所有在线队员
 | 
 |  |  |     @note: 需要全队同步的情况:创建队伍、队员加入、退出、上线、下线、切换地图、VIP等级变更、VIP到期时间更新
 | 
 |  |  |     '''
 | 
 |  |  |     if not curTeam:
 | 
 |  |  |         DR_Team("%s_Error" % eventName, 0, drDict)
 | 
 |  |  |         return
 | 
 |  |  |     teamID = curTeam.GetTeamID()
 | 
 |  |  |     syncPlayerList = []
 | 
 |  |  |     memInfoList = []
 | 
 |  |  |     memList = []
 | 
 |  |  |     for index in xrange(curTeam.GetMemberCount()):
 | 
 |  |  |         memPlayer = curTeam.GetMemberPlayer(index)
 | 
 |  |  |         memberInfo = curTeam.GetMemberInfo(index)
 | 
 |  |  |         if not memPlayer or not memberInfo:
 | 
 |  |  |         if not memberInfo:
 | 
 |  |  |             memList.append(["not memberInfo"])
 | 
 |  |  |             continue
 | 
 |  |  |         if not memPlayer:
 | 
 |  |  |             memList.append(["not memPlayer"])
 | 
 |  |  |             continue
 | 
 |  |  |         memPlayerID = memPlayer.GetPlayerID()
 | 
 |  |  |         if not memPlayerID:
 | 
 |  |  |             memList.append(["not memPlayerID"])
 | 
 |  |  |             continue
 | 
 |  |  |         memInfo = ChGameToMapPyPack.tagGMTeamMemInfo()
 | 
 |  |  |         memInfo.PlayerID = memPlayerID
 | 
 |  |  | 
 |  |  |         memInfo.VIPLV = PlayerControl.GetValidVIPLV(memPlayer)
 | 
 |  |  |         memInfoList.append(memInfo)
 | 
 |  |  |         syncPlayerList.append([memPlayer, memberInfo.GetTeamLV()])
 | 
 |  |  |         memList.append([memPlayerID, memPlayer.GetTeamID(), memberInfo.GetTeamLV(), memPlayer.GetMapID(), memPlayer.GetFBID()])
 | 
 |  |  |         
 | 
 |  |  |     for player, teamLV in syncPlayerList:
 | 
 |  |  |         teamInfo = ChGameToMapPyPack.tagGMTeamInfo()
 | 
 |  |  | 
 |  |  |         teamInfo.MemCnt = len(teamInfo.MemInfoList)
 | 
 |  |  |         NetPackCommon.SendPyPackToMapServer(player.GetLineNO(), player.GetRealMapID(), teamInfo)
 | 
 |  |  |         
 | 
 |  |  |     drDict.update({"MemList":memList})
 | 
 |  |  |     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
 | 
 |  |  | 
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | 
 |  |  |     #通知客户端队伍成员属性变更
 | 
 |  |  |     #curTeam.Sync_TeamState()
 | 
 |  |  |     Sync_TeamMemberInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam, "ChangeMemTeamLV", {"tagPlayerID":tagPlayerID, "memberLV":memberLV})
 | 
 |  |  |     return
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | #===============================================================================
 | 
 |  |  | 
 |  |  |         #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()):
 | 
 |  |  | 
 |  |  |     #广播队伍刷新
 | 
 |  |  |     #curTeam.Sync_TeamState()
 | 
 |  |  |     Sync_TeamMemberInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam, "Leave", {"delPlayerID":delPlayerID, "msg":msg})
 | 
 |  |  |     
 | 
 |  |  |     #无人在线
 | 
 |  |  |     if curTeam.GetTeamPlayerCount() <= 0:
 | 
 |  |  | 
 |  |  |         #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:
 | 
 |  |  | 
 |  |  |     playerMgr = GameWorld.GetPlayerManager()
 | 
 |  |  |     
 | 
 |  |  |     scenePlayerIDDict = GetScenePlayerIDDict()
 | 
 |  |  |     scenePlayerIDList = scenePlayerIDDict.get(mapID, [])
 | 
 |  |  |     scenePlayerIDList = copy.deepcopy(scenePlayerIDDict.get(mapID, []))
 | 
 |  |  |     # 场景队伍数超过同步的个数才进行排序,否则直接同步给客户端,由客户端自行排序
 | 
 |  |  |     if len(scenePlayerIDList) > Def_SyncPlayerCount:
 | 
 |  |  |         playerIDSortList = []
 | 
 |  |  | 
 |  |  |             player = playerMgr.FindPlayerByID(playerID)
 | 
 |  |  |             if not player:
 | 
 |  |  |                 continue
 | 
 |  |  |             if player.GetTeamID():
 | 
 |  |  |                 # 有队伍的不推荐
 | 
 |  |  |             if PlayerControl.GetIsTJG(player):
 | 
 |  |  |                 continue
 | 
 |  |  |             if not __CheckCanTeamComm(player):
 | 
 |  |  |                 continue
 | 
 |  |  |             #if player.GetTeamID():
 | 
 |  |  |             #    # 有队伍的不推荐
 | 
 |  |  |             #    continue
 | 
 |  |  |             playerLV = player.GetLV()
 | 
 |  |  |             playerIDSortList.append([abs(curPlayerLV - playerLV), -playerLV, playerID])
 | 
 |  |  |         playerIDSortList.sort() # 等级差绝对值升序排, 绝对值相同的等级高的排前面
 | 
 |  |  | 
 |  |  |         player = playerMgr.FindPlayerByID(playerID)
 | 
 |  |  |         if not player:
 | 
 |  |  |             continue
 | 
 |  |  |         if player.GetTeamID():
 | 
 |  |  |             # 有队伍的不推荐
 | 
 |  |  |         if PlayerControl.GetIsTJG(player):
 | 
 |  |  |             continue
 | 
 |  |  |         if not __CheckCanTeamComm(player):
 | 
 |  |  |             continue
 | 
 |  |  |         #if player.GetTeamID():
 | 
 |  |  |         #    # 有队伍的不推荐
 | 
 |  |  |         #    continue
 | 
 |  |  |         count += 1
 | 
 |  |  |         nearbyPlayer = ChPyNetSendPack.tagGCRecommendNearbyPlayer()
 | 
 |  |  |         nearbyPlayer.PlayerID = playerID
 | 
 |  |  | 
 |  |  |             DelTeamIDFromTagMapTeamDict(curTeamID)
 | 
 |  |  |             DelTeamIDFromMatchingList(curTeam)
 | 
 |  |  |                 
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam, "LogOff", {"playerID":playerID})
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def OnPlayerLoginRefreshTeam(curPlayer, tick):
 | 
 |  |  | 
 |  |  |         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()
 | 
 |  |  | 
 |  |  |     #通知队伍成员玩家信息
 | 
 |  |  |     #curTeam.Sync_TeamState()
 | 
 |  |  |     Sync_TeamMemberInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |     SyncMapServerTeamInfo(curTeam, "Login", {"playerID":playerID})
 | 
 |  |  |     
 | 
 |  |  |     if not PlayerControl.GetIsTJG(curPlayer):
 | 
 |  |  |         #通知自己队伍玩家上线
 | 
 |  |  | 
 |  |  |     #如果队伍正在匹配中,则通知状态
 | 
 |  |  |     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
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | ##组队玩家切换地图
 | 
 |  |  | 
 |  |  |     curTeam = curPlayer.GetTeam()
 | 
 |  |  |     
 | 
 |  |  |     if curTeam != None:
 | 
 |  |  |         SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |         SyncMapServerTeamInfo(curTeam, "ChangeMap", {"playerID":playerID, "mapID":mapID})
 | 
 |  |  |         #通知客户端更新
 | 
 |  |  |         curPlayer.Sync_TeamMemberChangeMap() # 09 13 队伍成员切换地图#tagTeamMemberChangeMap
 | 
 |  |  |         
 | 
 |  |  | 
 |  |  |         # 玩家进入组队副本,则停止匹配
 | 
 |  |  |         if gameMap.GetMapFBType() == ChConfig.fbtTeam:
 | 
 |  |  |             DelPlayerIDFromMatchingList(curPlayer)
 | 
 |  |  |              | 
 |  |  |         SyncMapServerPlayerNoTeam(curPlayer) # 没有队伍的时候切图也通知地图
 | 
 |  |  |          | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def PlayerTeamMemberRefresh(curPlayer, refreshType, value, tick):
 | 
 |  |  | 
 |  |  |     elif refreshType == IPY_GameServer.CDBPlayerRefresh_OfficialRank:
 | 
 |  |  |         teamMember.SetPlayerRealmLV(value)
 | 
 |  |  |     elif refreshType in [IPY_GameServer.CDBPlayerRefresh_VIPLv, IPY_GameServer.CDBPlayerRefresh_ExAttr9]:
 | 
 |  |  |         SyncMapServerTeamInfo(curTeam)
 | 
 |  |  |         SyncMapServerTeamInfo(curTeam, "Refresh", {"refreshType":refreshType, "value":value})
 | 
 |  |  |     else:
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
 | 
 |  |  |     
 | 
 |  |  |     packTagMapID = clientData.TagMapID
 | 
 |  |  |     # 发2时代表助战匹配
 | 
 |  |  |     if packTagMapID == 2:
 | 
 |  |  |         __DoMatchHelpFightTeam(curPlayer, tick)
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     tagMapEx = clientData.TagMapEx
 | 
 |  |  |     tagMapID = packTagMapID
 | 
 |  |  |     curMapID = curPlayer.GetMapID()
 | 
 |  |  | 
 |  |  |         PlayerControl.NotifyCode(curPlayer, "TeamMatchingSucceed")
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def __DoMatchHelpFightTeam(curPlayer, tick):
 | 
 |  |  |     ''' 一次性匹配需要助战的队伍,满足队伍条件自动加入匹配队伍
 | 
 |  |  |             按以下优先级加入:
 | 
 |  |  |         大境界渡劫    > 所有宗门试炼  > 所有娲皇遗迹  > 混乱妖域
 | 
 |  |  |         自己有队伍时发送助战喊话不执行此逻辑   | 
 |  |  |     '''
 | 
 |  |  |     curTeam = curPlayer.GetTeam()
 | 
 |  |  |     if curTeam:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     matchingTeamDict = PyGameData.g_matchingTeamDict
 | 
 |  |  |     GameWorld.DebugLog("__DoMatchHelpFightTeam matchingTeamDict=%s" % (matchingTeamDict), curPlayer.GetPlayerID())
 | 
 |  |  |     if not matchingTeamDict:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |     playerLV = curPlayer.GetLV()
 | 
 |  |  |     matchMapIDList = [ChConfig.Def_FBMapID_DuJie, ChConfig.Def_FBMapID_MunekadoTrial, ChConfig.Def_FBMapID_QueenRelics, ChConfig.Def_FBMapID_ChaosDemon]
 | 
 |  |  |      | 
 |  |  |     teamMgr = GameWorld.GetTeamManager()
 | 
 |  |  |     for matchMapID in matchMapIDList:
 | 
 |  |  |         matchTeamInfoList = []
 | 
 |  |  |         for key, teamIDList in matchingTeamDict.items():
 | 
 |  |  |             tagMapID, tagMapEx = key
 | 
 |  |  |             if tagMapID != matchMapID:
 | 
 |  |  |                 continue
 | 
 |  |  |              | 
 |  |  |             for teamID in teamIDList:
 | 
 |  |  |                 team = teamMgr.FindTeam(teamID)
 | 
 |  |  |                 if not team:
 | 
 |  |  |                     continue
 | 
 |  |  |                  | 
 |  |  |                 reqMinLV = team.GetReqMinLV()
 | 
 |  |  |                 reqMaxLV = team.GetReqMaxLV()
 | 
 |  |  |                  | 
 |  |  |                 if not (reqMinLV <= playerLV <= reqMaxLV):
 | 
 |  |  |                     continue
 | 
 |  |  |                  | 
 |  |  |                 onLineCount = CheckTeamOnLineCount(team)
 | 
 |  |  |                 # 优先级: 人数多的 > 线路简单的 > 队伍人数多的 ...
 | 
 |  |  |                 matchTeamInfoList.append([onLineCount, 999999 - tagMapEx, team.GetTeamPlayerCount(), teamID, team])
 | 
 |  |  |                  | 
 |  |  |         if not matchTeamInfoList:
 | 
 |  |  |             GameWorld.DebugLog("    没有满足助战等级条件匹配中的队伍: matchMapID=%s" % (matchMapID))
 | 
 |  |  |             continue
 | 
 |  |  |          | 
 |  |  |         matchTeamInfoList.sort(reverse=True) # 倒序排
 | 
 |  |  |         GameWorld.DebugLog("    匹配队伍顺序: matchMapID=%s,%s" % (matchMapID, matchTeamInfoList))
 | 
 |  |  |          | 
 |  |  |         joinTeamID = 0
 | 
 |  |  |         for teamInfo in matchTeamInfoList:
 | 
 |  |  |             team = teamInfo[-1]
 | 
 |  |  |             if not team:
 | 
 |  |  |                 continue
 | 
 |  |  |              | 
 |  |  |             leader = GetTeamLeader(team)
 | 
 |  |  |             if not leader:
 | 
 |  |  |                 continue
 | 
 |  |  |              | 
 |  |  |             if DoPlayerJoinTeam(curPlayer, leader, team, tick, isAutoMatchJoin=False):
 | 
 |  |  |                 joinTeamID  = team.GetTeamID()
 | 
 |  |  |                 break
 | 
 |  |  |              | 
 |  |  |         GameWorld.DebugLog("        joinTeamID=%s" % joinTeamID)
 | 
 |  |  |         if joinTeamID:
 | 
 |  |  |             break
 | 
 |  |  |          | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | #// B9 08 取消匹配队伍或玩家 #tagCGCancelMatchTeam
 | 
 |  |  | #
 | 
 |  |  | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     # 覆盖添加
 | 
 |  |  |     PyGameData.g_teamFBEnterAskDict[teamID] = [askVer, askType, askMapID, askMapEx, askPlayerRetDict]
 | 
 |  |  |     PyGameData.g_teamFBEnterAskDict[teamID] = [askVer, askType, askMapID, askMapEx, askPlayerRetDict, tick]
 | 
 |  |  |     
 | 
 |  |  |     sendCMD = str([teamID, askVer, askType, askMapID, askMapEx])
 | 
 |  |  |     for memPlayerID, mapInfo in askPlayerMapDict.items():
 | 
 |  |  | 
 |  |  |         if retTeamID not in PyGameData.g_teamFBEnterAskDict:
 | 
 |  |  |             GameWorld.DebugLog("    该队伍的请求信息记录已不存在,不处理!retTeamID=%s" % retTeamID, playerID)
 | 
 |  |  |             return
 | 
 |  |  |         askVer, askType, askMapID, askMapEx, askPlayerRetDict = PyGameData.g_teamFBEnterAskDict[retTeamID]
 | 
 |  |  |         askVer, askType, askMapID, askMapEx, askPlayerRetDict = PyGameData.g_teamFBEnterAskDict[retTeamID][:5]
 | 
 |  |  |         if askVer != retAskVer or askType != retAskType or askMapID != retAskMapID or askMapEx != retAskMapEx:
 | 
 |  |  |             GameWorld.DebugLog("    非本队伍请求版本,不处理!askVer=%s, askType=%s, askMapID=%s, askMapEx=%s" 
 | 
 |  |  |                                % (askVer, askType, askMapID, askMapEx), playerID)
 | 
 |  |  | 
 |  |  |                 curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamAsk", resultName, len(resultName))
 | 
 |  |  |             # 多人队伍,队伍加入准备队列,通知队员准备
 | 
 |  |  |             else:
 | 
 |  |  |                 DelTeamIDFromMatchingList(curTeam) # 进入准备阶段停止匹配
 | 
 |  |  |                 GameWorld.DebugLog("队伍验证通过,通知队员准备进入副本: memStateDict=%s" % memStateDict, playerID)
 | 
 |  |  |                 PyGameData.g_prepareTeamDict[teamID] = [retAskMapID, retAskMapEx, memStateDict, tick]
 | 
 |  |  |                 SyncTeamEnterFBPrepareInfo(curTeam, retAskMapID, retAskMapEx, memStateDict)
 | 
 |  |  | 
 |  |  |             
 | 
 |  |  |             if memPlayerID in causePlayerDict:
 | 
 |  |  |                 PlayerControl.NotifyCode(memPlayer, notifyList[0], [askMapID])
 | 
 |  |  |                 if notifyRet in [ShareDefine.EntFBAskRet_NoEnterCnt, ShareDefine.EntFBAskRet_EnterCD, ShareDefine.EntFBAskRet_NoTicket]:
 | 
 |  |  |                     failPack = ChPyNetSendPack.tagGCEnterTeamFBFailReason()
 | 
 |  |  |                     failPack.MapID = askMapID
 | 
 |  |  |                     failPack.AskType = retAskType
 | 
 |  |  |                     failPack.Reason = notifyRet
 | 
 |  |  |                     NetPackCommon.SendFakePack(memPlayer, failPack)
 | 
 |  |  |             else:
 | 
 |  |  |                 PlayerControl.NotifyCode(memPlayer, notifyList[1], [askMapID, causePlayerName])
 | 
 |  |  |     return
 | 
 |  |  | 
 |  |  |     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):
 | 
 |  |  | 
 |  |  |     '''准备队伍异常处理
 | 
 |  |  |     后端延长15秒,防范前端异常情况导致卡队伍准备界面,超时时强制取消准备队伍
 | 
 |  |  |     '''
 | 
 |  |  |     if PyGameData.g_teamFBEnterAskDict:
 | 
 |  |  |         for teamID, askInfo in PyGameData.g_teamFBEnterAskDict.items():
 | 
 |  |  |             if askInfo:
 | 
 |  |  |                 askVer, askType, askMapID, askMapEx, askPlayerRetDict, askTick = askInfo
 | 
 |  |  |                 # 询问的做个10s预防,超时的话移除
 | 
 |  |  |                 if tick - askTick <= 10000:
 | 
 |  |  |                     continue
 | 
 |  |  |             PyGameData.g_teamFBEnterAskDict.pop(teamID)
 | 
 |  |  |             GameWorld.ErrLog("队伍进入副本询问超时,强制移除询问状态! teamID=%s,askVer=%s,askType=%s,askMapID=%s,askMapEx=%s,askPlayerRetDict=%s,askTick=%s,tick=%s"  | 
 |  |  |                              % (teamID, askVer, askType, askMapID, askMapEx, askPlayerRetDict, askTick, tick))
 | 
 |  |  |              | 
 |  |  |     if not PyGameData.g_prepareTeamDict:
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |             SyncTeamEnterFBPrepareInfo(curTeam, askMapID, askMapEx, memStateDict, True)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | #// B9 0A 按条件邀请玩家加入队伍 #tagCGInvitePlayerJoinTeamByLV
 | 
 |  |  | #
 | 
 |  |  | #struct    tagCGInvitePlayerJoinTeamByLV
 | 
 |  |  | #{
 | 
 |  |  | #    tagHead        Head;
 | 
 |  |  | #    WORD        LVLimit;        // 目标玩家大于等于此等级
 | 
 |  |  | #    BYTE        InviteCnt;    // 邀请玩家个数
 | 
 |  |  | #};
 | 
 |  |  | def OnInvitePlayerJoinTeamByLV(index, clientData, tick):
 | 
 |  |  |     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
 | 
 |  |  |     lvlimit = clientData.LVLimit
 | 
 |  |  |     inviteCnt = clientData.InviteCnt
 | 
 |  |  |      | 
 |  |  |     curPlayerTeam = curPlayer.GetTeam()
 | 
 |  |  |     if not curPlayerTeam:
 | 
 |  |  |         return
 | 
 |  |  |     curInviteCnt = 0 #当前邀请数量
 | 
 |  |  |     playerManager = GameWorld.GetPlayerManager()
 | 
 |  |  |     playerCount = playerManager.GetActivePlayerCount()
 | 
 |  |  |     if playerCount < 2:
 | 
 |  |  |         return
 | 
 |  |  |     indexList = range(playerCount)
 | 
 |  |  |     random.shuffle(indexList)
 | 
 |  |  |     for i in indexList:
 | 
 |  |  |         tagPlayer = playerManager.GetActivePlayerAt(i)
 | 
 |  |  |         if tagPlayer == None or not tagPlayer.GetInitOK():
 | 
 |  |  |             continue
 | 
 |  |  |         if PlayerControl.GetIsTJG(tagPlayer):
 | 
 |  |  |             continue
 | 
 |  |  |         if tagPlayer.GetPlayerID() == curPlayer.GetPlayerID():
 | 
 |  |  |             continue
 | 
 |  |  |         if tagPlayer.GetLV() < lvlimit:
 | 
 |  |  |             continue
 | 
 |  |  |         if tagPlayer.GetTeam():
 | 
 |  |  |             continue
 | 
 |  |  |         if InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick):
 | 
 |  |  |             curInviteCnt +=1
 | 
 |  |  |         if curInviteCnt >= inviteCnt:
 | 
 |  |  |             break
 | 
 |  |  |          | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def DR_Team(eventName, teamID, dataDict):
 | 
 |  |  |     drDict = {"EventName":eventName, "TeamID":teamID}
 | 
 |  |  |     drDict.update(dataDict)
 | 
 |  |  |     DataRecordPack.SendEventPack("Team_GameServer", drDict)
 | 
 |  |  |     return
 | 
 |  |  | 
 |