ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTeam.py
@@ -24,6 +24,7 @@
import ChPyNetSendPack
import DataRecordPack
import PlayerControl
import PlayerFriend
import ShareDefine
import PyGameData
import GameWorld
@@ -913,6 +914,26 @@
    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
@@ -1339,7 +1360,8 @@
        #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()):
@@ -1393,7 +1415,8 @@
        #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:
@@ -1793,11 +1816,12 @@
        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)
@@ -1808,7 +1832,8 @@
        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()
@@ -1852,6 +1877,7 @@
    #如果队伍正在匹配中,则通知状态
    if IsTeamMatchingPlayer(curTeamID):
        Sync_TeamMatchState(curPlayer, True)
    OnTeamMemFamilyRefresh(curPlayer, curPlayer.GetFamilyID())
    return True
#---------------------------------------------------------------------
@@ -1862,22 +1888,26 @@
    
    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
#---------------------------------------------------------------------
##组队玩家切换地图
@@ -1929,7 +1959,8 @@
        # 玩家进入组队副本,则停止匹配
        if gameMap.GetMapFBType() == ChConfig.fbtTeam:
            DelPlayerIDFromMatchingList(curPlayer)
        SyncMapServerPlayerNoTeam(curPlayer) # 没有队伍的时候切图也通知地图
    return
def PlayerTeamMemberRefresh(curPlayer, refreshType, value, tick):
@@ -2764,6 +2795,8 @@
                                                   ["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"],
                     ShareDefine.EntFBAskRet_Sit:[["TeamMatchingSITMe", "TeamMatchingSITAll"], 
                                                  ["TeamEnterSITMe", "TeamEnterSITAll"], "Carry_lhs_697674"],
                     ShareDefine.EntFBAskRet_CrossPKMatching:[["CrossMatching9", "CrossMatching10"],
                                                  ["CrossMatching11", "CrossMatching12"], "CrossMatching8"],
                     ShareDefine.EntFBAskRet_Other:[["TeamMatchingDefaultMe", "TeamMatchingDefaultAll"], 
                                                   ["TeamEnterDefaultMe", "TeamEnterDefaultAll"], "SingleEnterDefaul"],
                     }
@@ -2876,6 +2909,23 @@
    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)
@@ -2897,8 +2947,66 @@
            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):