#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#---------------------------------------------------------------------  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
##@package PlayerTeam  
 | 
# @todo: ×é¶ÓÂß¼´¦Àí  
 | 
#  
 | 
# @author: panwei  
 | 
# @date 2010-4-28  
 | 
# @version 1.3  
 | 
#  
 | 
# @note:   
 | 
#---------------------------------------------------------------------  
 | 
# @change: "2013-04-17 20:35" Alee buff±ä¸üË¢ÐÂЧ¹ûÔÙËãÊôÐÔ£¬É¾³ýÎåÐÐ  
 | 
# @change: "2015-08-24 11:00" xdh Ôö¼Ó×é¶Ó³É¾Í  
 | 
# @change: "2016-11-23 19:30" hxp ½øÍ˶ÓÎéʱͬ²½±ä¸üboss×î´ó³ðºÞ¹éÊôbuff  
 | 
#------------------------------------------------------------------------------   
 | 
#"""Version = 2016-11-23 19:30"""  
 | 
#------------------------------------------------------------------------------  
 | 
import BuffSkill  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import FBLogic  
 | 
import ChConfig  
 | 
import SkillCommon  
 | 
import IPY_GameWorld  
 | 
#import PlayerTruck  
 | 
import ShareDefine  
 | 
import SkillShell  
 | 
import PlayerSuccess  
 | 
import PyGameData  
 | 
import PlayerVip  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
#// B9 04 Ð޸ĶÓÎéÏà¹ØÉóºË״̬ #tagCMChangeTeamCheckState  
 | 
#  
 | 
#struct    tagCMChangeTeamCheckState  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        JoinReqCheck; //Èë¶ÓÉêÇëÊÇ·ñÐèÒªÉóºË, 0·ñ1ÊÇ, Ä¬ÈÏ·ñ, ¼´×Ô¶¯½ÓÊÜ  
 | 
#    BYTE        InviteCheck; //×é¶ÓÑûÇëÊÇ·ñÐèÒªÉóºË, 0·ñ1ÊÇ, Ä¬ÈÏ·ñ, ¼´×Ô¶¯½ÓÊÜ  
 | 
#};  
 | 
def OnChangeTeamCheckState(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    joinReqCheck = clientData.JoinReqCheck  
 | 
    inviteCheck = clientData.InviteCheck  
 | 
    checkState = joinReqCheck * 10 + inviteCheck  
 | 
    PlayerControl.SetTeamCheckState(curPlayer, checkState)  
 | 
    GameWorld.DebugLog("Ð޸ĶÓÎéÏà¹ØÉóºË״̬: Èë¶ÓÉêÇëÊÇ·ñÐèÒªÉóºË=%s,×é¶ÓÑûÇëÊÇ·ñÐèÒªÉóºË=%s,checkState=%s"   
 | 
                       % (joinReqCheck, checkState, checkState), curPlayer.GetPlayerID())  
 | 
    return  
 | 
  
 | 
def NotifyPosInfoToPlayer(curPlayer, tick):  
 | 
    ## °ÑλÖÃÐÅϢ֪ͨ¸øÕâ¸öÍæ¼Ò  
 | 
    #===============================================================================================  
 | 
    # team = curPlayer.GetTeam()  
 | 
    # if team == None:  
 | 
    #    return  
 | 
    #   
 | 
    # team.SyncMemberPos(curPlayer)  
 | 
    #===============================================================================================  
 | 
    return  
 | 
  
 | 
def PlayerLoginSetTeam(curPlayer, tick):  
 | 
    ## Íæ¼ÒµÇ¼·þÎñÆ÷ÉèÖöÓÎé   
 | 
    #Íæ¼Ò¸ÕµÇ¼, Ê²Ã´Ò²²»×ö, µÈ´ýGameServerË¢ÐÂ×Ô¼º  
 | 
    return  
 | 
  
 | 
## ÓÎÏ··þÎñÆ÷ˢжÓÎé(·â°ü²ÎÊý)  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä   
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GameServer_OnTeam(index, tick):  
 | 
    GameWorld.GetPsycoFunc(__Func_GameServer_OnTeam)(index, tick)  
 | 
    return  
 | 
  
 | 
## ÓÎÏ··þÎñÆ÷ˢжÓÎé(·â°ü²ÎÊý)  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä   
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __Func_GameServer_OnTeam(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if curPlayer == None:  
 | 
        GameWorld.Log("µØÍ¼·þÎñÆ÷ѰÕÒ×é¶ÓÍæ¼Òʧ°Üindex = "+str(index))  
 | 
        return  
 | 
      
 | 
    if curPlayer.IsEmpty():  
 | 
        GameWorld.Log("µØÍ¼·þÎñÆ÷ѰÕÒ×é¶ÓÍæ¼Òʧ°Üindex = %d, Íæ¼ÒΪ¿Õ"%index)  
 | 
        return  
 | 
      
 | 
    recvPack = IPY_GameWorld.IPY_MTeamRefresh()  
 | 
      
 | 
    if recvPack.GetPlayerID() != curPlayer.GetID():  
 | 
        #²»ÊǸø×Ô¼ºµÄ·â°ü  
 | 
        GameWorld.DebugLog("²»ÊǸø×Ô¼ºµÄ·â°ü! packPlayerID=%s" % recvPack.GetPlayerID(), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    teamID = recvPack.GetTeamID()  
 | 
    # Õâ¸ö·â°üÖ»´¦ÀíteamIDΪ0µÄÇé¿ö£¬ teamID²»Îª0µÄÇé¿öÔÚpy°ü GameServer_TeamInfo ´¦Àí  
 | 
    if teamID:  
 | 
        #GameWorld.DebugLog("OnTeam teamID=%s, ´óÓÚ0²»´¦Àí£¡" % teamID, curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    GameWorld.DebugLog("OnTeam teamID=%s, Íæ¼ÒÎÞ¶ÓÎé¸üУ¡" % teamID, curPlayer.GetPlayerID())  
 | 
    RefreshPlayerTeamID(curPlayer, teamID, recvPack.GetTeamLV(), tick)  
 | 
    return True  
 | 
  
 | 
#// 05 02 ¶ÓÎéÐÅϢˢР#tagGMTeamInfo  
 | 
#  
 | 
#struct    tagGMTeamMemInfo  
 | 
#{  
 | 
#    DWORD        PlayerID; //¶ÓÔ±ID  
 | 
#    DWORD        MapID; //ËùÔÚµØÍ¼  
 | 
#    BYTE        VIPLV; //ÓÐЧVIPµÈ¼¶£¬0´ú±íÎÞVIP»òÒѹýÆÚ  
 | 
#};  
 | 
#  
 | 
#struct    tagGMTeamInfo  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        PlayerID;  
 | 
#    DWORD        TeamID;  
 | 
#    BYTE        TeamLV;  
 | 
#    BYTE        MemCnt;  
 | 
#    tagGMTeamMemInfo    MemInfoList[MemCnt];  
 | 
#};  
 | 
def GameServer_TeamInfo(curPackData, tick):  
 | 
    playerID = curPackData.PlayerID  
 | 
    teamID = curPackData.TeamID  
 | 
    teamLV = curPackData.TeamLV  
 | 
      
 | 
    GameWorld.DebugLog("GameServer_TeamInfo playerID=%s,teamID=%s,teamLV=%s" % (playerID, teamID, teamLV), playerID)  
 | 
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  
 | 
    if not curPlayer or curPlayer.IsEmpty():  
 | 
        return  
 | 
      
 | 
    RefreshPlayerTeamID(curPlayer, teamID, teamLV, tick)  
 | 
      
 | 
    sameMapMemCount = 0 # Í¬µØÍ¼¶ÓÔ±Êý  
 | 
    sameMapVIPLV = 0 # Í¬µØÍ¼VIP¼Ó³ÉµÈ¼¶  
 | 
    mapID = curPlayer.GetMapID()  
 | 
    teamVIPBuffIpyData = PlayerVip.GetVipPrivilegeData(ChConfig.VIPPrivilege_TeamVIPBuff)  
 | 
    # ´¦Àí¶ÓÎéÈËÊýÓ°ÏìµÄÄÚÈÝ£¨¶ÓÎé¾Ñé¼Ó³É¡¢VIPbuffµÈ£©  
 | 
    for memInfo in curPackData.MemInfoList:  
 | 
        #memPlayerID = memInfo.PlayerID  
 | 
        #GameWorld.DebugLog("    MemInfo memPlayerID=%s,MapID=%s,VIPLV=%s" % (memPlayerID, memInfo.MapID, memInfo.VIPLV))  
 | 
        if mapID != memInfo.MapID:  
 | 
            continue  
 | 
          
 | 
        # VIPbuff  
 | 
        if teamVIPBuffIpyData and hasattr(teamVIPBuffIpyData, "GetVIP%d" % memInfo.VIPLV) \  
 | 
            and getattr(teamVIPBuffIpyData, "GetVIP%d" % memInfo.VIPLV)():  
 | 
            sameMapVIPLV += 1  
 | 
              
 | 
        # Í¬µØÍ¼ÈËÊý  
 | 
        sameMapMemCount += 1  
 | 
          
 | 
    teamExpRate = max(0, (sameMapMemCount - 1) * 1000) # Ã¿¶à1¸öͬµØÍ¼¶ÓÔ±Ôö¼Ó 10%  
 | 
    UpdTeamExpRate(curPlayer, teamExpRate)  
 | 
      
 | 
    __RefreshTeamVIPBuff(curPlayer, sameMapVIPLV, tick)  
 | 
    return  
 | 
  
 | 
def __RefreshTeamVIPBuff(curPlayer, sameMapVIPLV, tick):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    findBuff, buffManager, buffType, findSkill = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_TeamVIPBuff)  
 | 
    isAddTeamVIPBuff = False  
 | 
    if not findBuff and sameMapVIPLV:  
 | 
        isAddTeamVIPBuff = True  
 | 
        #GameWorld.DebugLog("ûÓжÓÎéVIPbuff£¬¿ÉÒÔÌí¼Ó", playerID)  
 | 
    if findBuff and sameMapVIPLV:  
 | 
        buffLV = findBuff.GetSkill().GetSkillLV()  
 | 
        if buffLV != sameMapVIPLV:  
 | 
            isAddTeamVIPBuff = True  
 | 
        #    GameWorld.DebugLog("ÓжÓÎéVIPbuff, µ«µÈ¼¶²»Ò»Ñù, ¿ÉÒÔÌí¼Ó!buffLV=%s,sameMapVIPLV=%s" % (buffLV, sameMapVIPLV), playerID)  
 | 
        #else:  
 | 
        #    GameWorld.DebugLog("ÓжÓÎéVIPbuff, µ«µÈ¼¶Ò»Ñù, ²»¿ÉÌí¼Ó!buffLV=%s,sameMapVIPLV=%s" % (buffLV, sameMapVIPLV), playerID)  
 | 
          
 | 
    GameWorld.DebugLog("    Í¬µØÍ¼¶ÓԱͳ¼Æ: sameMapVIPLV=%s,isAddTeamVIPBuff=%s" % (sameMapVIPLV, isAddTeamVIPBuff), playerID)  
 | 
    if (findBuff and not sameMapVIPLV) or isAddTeamVIPBuff:  
 | 
        __DelTeamVIPBuff(curPlayer, tick)  
 | 
        #GameWorld.DebugLog("__DelTeamVIPBuff", playerID)  
 | 
          
 | 
    if isAddTeamVIPBuff:  
 | 
        isOK = SkillCommon.AddBuffBySkillType(curPlayer, ChConfig.Def_SkillID_TeamVIPBuff, tick, sameMapVIPLV)  
 | 
        GameWorld.DebugLog("__AddTeamVIPBuff sameMapVIPLV=%s,isOK=%s" % (sameMapVIPLV, isOK), playerID)  
 | 
    return  
 | 
  
 | 
## Ë¢ÐÂÍæ¼Ò¶ÓÎéID   
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param teamID ¶ÓÎéID  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def RefreshPlayerTeamID(curPlayer, teamID, teamLV, tick):  
 | 
    #playerID = curPlayer.GetPlayerID()  
 | 
    playerTeamID = curPlayer.GetTeamID()  
 | 
    #GameWorld.DebugLog("Ë¢ÐÂÍæ¼Ò¶ÓÎéÐÅÏ¢: teamID=%s,playerTeamID=%s,teamLV=%s" % (teamID, playerTeamID, teamLV), playerID)  
 | 
    curTeam = curPlayer.GetTeam()  
 | 
    curPlayer.SetTeamID(teamID)  
 | 
    curPlayer.SetTeamLV(teamLV)  
 | 
    #--------------ÊÀ½ç·þÎñÆ÷×é¶Ó±íÖÐÎÞ¶ÓÎé  
 | 
    if not teamID:  
 | 
        if not playerTeamID and not curTeam:  
 | 
            #GameWorld.DebugLog("    Íæ¼ÒÎÞ¶ÓÎé,ÎÞÐè´¦Àí£¡", playerID)  
 | 
            pass  
 | 
        else:  
 | 
            #GameWorld.DebugLog("    Íæ¼ÒÓжÓÎé,´¦ÀíÍæ¼ÒÀë¶Ó£¡", playerID)  
 | 
            __OnLeaveTeam(curPlayer, tick)  
 | 
              
 | 
        sameMapVIPLV = 0  
 | 
        playerVIPLV = curPlayer.GetVIPLv()  
 | 
        teamVIPBuffIpyData = PlayerVip.GetVipPrivilegeData(ChConfig.VIPPrivilege_TeamVIPBuff)  
 | 
        if teamVIPBuffIpyData and hasattr(teamVIPBuffIpyData, "GetVIP%d" % playerVIPLV) \  
 | 
            and getattr(teamVIPBuffIpyData, "GetVIP%d" % playerVIPLV)():  
 | 
            sameMapVIPLV += 1  
 | 
        __RefreshTeamVIPBuff(curPlayer, sameMapVIPLV, tick)  
 | 
        return  
 | 
      
 | 
    #--------------ÊÀ½ç·þÎñÆ÷×é¶Ó±íÖÐÓжÓÎé  
 | 
      
 | 
    # £¡£¡£¡¶ÓÎé¹ÜÀíÆ÷ÔÚ·ÖÏßÄڵĠ ÐèÒª»ñÈ¡·ÖÏߵĶÓÎé¹ÜÀíÆ÷£¬²»È»¶ÓÎé¶¼ÊÇÔÚ1Ïß´´½¨  
 | 
    curGameWorld = IPY_GameWorld.IPY_GameWorld(curPlayer.GetCopyMapID())  
 | 
    curMapTeam = curGameWorld.GetTeamManager().FindTeam(teamID)  
 | 
      
 | 
    if curMapTeam == None:  
 | 
        #GameWorld.DebugLog("    µØÍ¼ÎÞ´ËID¶ÓÎ飬´´½¨¶ÓÎ飡teamID=%s" % teamID, playerID)  
 | 
        curMapTeam = curGameWorld.GetTeamManager().CreateTeam(teamID)  
 | 
        if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam:  
 | 
            curPlayer.SetCurrentFBProperty(teamID)  
 | 
        #curMapTeam.SetTeamType(recvPack.GetTeamType())  
 | 
              
 | 
    if playerTeamID != teamID or not curTeam:  
 | 
        isNewTeam = playerTeamID != teamID # ÇеØÍ¼/ÉÏÏßʱteamID¿ÉÄܲ»±ä£¬µ«ÊÇteamΪNone  
 | 
        #GameWorld.DebugLog("    Íæ¼Òµ±Ç°ÎÞ¶ÓÎé,´¦ÀíÍæ¼Ò½ø¶Ó£¡isNewTeam=%s" % isNewTeam, playerID)  
 | 
        __OnEnterTeam(curPlayer, curMapTeam, isNewTeam, tick)  
 | 
          
 | 
    return  
 | 
  
 | 
  
 | 
## Íæ¼ÒÍ˳ö¶ÓÎé  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __OnLeaveTeam(curPlayer, tick):  
 | 
    curTeam = curPlayer.GetTeam()  
 | 
    if curTeam:  
 | 
        #Íæ¼ÒÍÑÀë¶ÓÎé  
 | 
        curTeam.DeleteMember(curPlayer.GetID())  
 | 
          
 | 
        #¾É¶ÓÎéÎÞÈË,ɾ³ý¾É¶ÓÎé  
 | 
        if curTeam.GetMemberCount() == 0:  
 | 
            GameWorld.GetTeamManager().DeleteTeam(curTeam.GetTeamID())  
 | 
              
 | 
    curPlayer.SetTeam(None)  
 | 
    curPlayer.SetTeamID(0)  
 | 
    curPlayer.SetTeamLV(0)  
 | 
    __DelPlayerIDFromTeamPlayer(curPlayer.GetPlayerID(), False)  
 | 
      
 | 
    #¸Ä±äïÚ³µÉíÉϼǼµÄÖ÷ÈËÐÅÏ¢  
 | 
    #PlayerTruck.ChangeTruckNoteInfo(curPlayer)  
 | 
      
 | 
    #×Ô¼ºÀ뿪¶ÓÎé, É¾³ý×Ô¼ºµÄbuff  
 | 
    __CleanTeamEffect(curPlayer, tick)  
 | 
          
 | 
    #¸±±¾ÖУ¬Èç¹ûÖ»ÓÐÒ»¸öÍæ¼Ò£¬Õâ¸öÍæ¼ÒÀ뿪×é¶Ó£¬ÉèÖø±±¾IDΪ0  
 | 
    if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1 and GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.tmtTeam:  
 | 
        curPlayer.SetCurrentFBProperty(0)  
 | 
          
 | 
    return  
 | 
  
 | 
## ½øÈë¶ÓÎé  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __OnEnterTeam(curPlayer, curMapTeam, isNewTeam, tick):  
 | 
    teamID = curMapTeam.GetTeamID()  
 | 
    memCount = curMapTeam.GetMemberCount()  
 | 
    if memCount >= ShareDefine.Def_Team_MaxPlayerCount:  
 | 
        GameWorld.ErrLog("¶ÓÎéÈËÊýÒÑÂú£¬Íæ¼ÒÈë¶Óʧ°Ü!teamID=%s,memCount=%s" % (teamID, memCount), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    #¸æËßGameServer×Ô¼ºµÄ¸±±¾×´Ì¬  
 | 
    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam:  
 | 
        curPlayer.GameServer_TeamEnterFB(1)  
 | 
          
 | 
    curPlayer.SetTeam(curMapTeam)  
 | 
    curPlayer.SetTeamID(teamID)  
 | 
    curMapTeam.AddMember(curPlayer)  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    teamPlayerIDList = PyGameData.g_teamPlayerDict.get(teamID, [])  
 | 
    if playerID not in teamPlayerIDList:  
 | 
        teamPlayerIDList.append(playerID)  
 | 
        PyGameData.g_teamPlayerDict[teamID] = teamPlayerIDList  
 | 
        GameWorld.DebugLog("Íæ¼Ò¼ÓÈë¶ÓÎé: teamID=%s,playerID=%s,%s" % (teamID, playerID, PyGameData.g_teamPlayerDict))  
 | 
          
 | 
    #¸Ä±äïÚ³µÉíÉϼǼµÄÖ÷ÈËÐÅÏ¢  
 | 
    #PlayerTruck.ChangeTruckNoteInfo(curPlayer)  
 | 
      
 | 
    #ÒÔÏÂΪ½øÈëÒ»¸öеĶÓÎé¶îÍâ´¦Àí  
 | 
    if not isNewTeam:  
 | 
        return  
 | 
    return  
 | 
   
 | 
## Çå³ý×é¶Óbuff  
 | 
#  @param   
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.         
 | 
def __CleanTeamEffect(curPlayer, tick):  
 | 
    UpdTeamExpRate(curPlayer, 0)  
 | 
    #__DelTeamVIPBuff(curPlayer, tick) # ¸ÄΪÎÞ×é¶ÓģʽÏÂÒ²ÓÐÓã¬ËùÒÔÕâÀï²»Çå³ý  
 | 
    BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_DropOwnerBuff, tick) # Í˶ÓÇå³ý¹éÊôbuff  
 | 
    return  
 | 
  
 | 
def __DelTeamVIPBuff(curPlayer, tick):  
 | 
    if BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_TeamVIPBuff, tick):  
 | 
          
 | 
        #ͳһˢÐÂ״̬  
 | 
        playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
        playerControl.RefreshPlayerAttrByBuff()  
 | 
    return  
 | 
  
 | 
  
 | 
def UpdTeamExpRate(curPlayer, updExpRate):  
 | 
    # ¸üжÓÎé¾Ñé±¶ÂÊ¼Ó³É  
 | 
    if updExpRate == curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TeamExpRate):  
 | 
        return  
 | 
    curPlayer.SetDict(ChConfig.Def_PlayerKey_TeamExpRate, updExpRate)  
 | 
    #GameWorld.DebugLog("UpdTeamExpRate updExpRate=%s" % updExpRate, curPlayer.GetPlayerID())  
 | 
    PlayerControl.Sync_ExpRateChange(curPlayer)  
 | 
    return  
 | 
  
 | 
def TeamPlayerLeaveMap(curPlayer, tick, isDisconnect):  
 | 
    ## ×é¶ÓÍæ¼ÒÀ뿪µØÍ¼/ÏÂÏßÂß¼  
 | 
      
 | 
    curTeam = curPlayer.GetTeam()  
 | 
      
 | 
    if curTeam == None:  
 | 
        #ÎÞ¶ÓÎéÍæ¼Ò,²»´¦Àí  
 | 
        return  
 | 
      
 | 
    __CleanTeamEffect(curPlayer, tick)  
 | 
    #É趨µ±Ç°Íæ¼Ò¶ÓÎéΪNone, ·ñÔòÔÚÍæ¼Ò״̬ˢеÄʱºò, ¿ÉÄÜÈ¡µ½ÂÒÖ¸Õë  
 | 
    curPlayer.SetTeam(None)  
 | 
    #ÏÂÏßµÄʱºò²»ÄܰÑTeamIDÉèÖÃΪ0, ·ñÔòÍæ¼ÒÉÏÏß¾ÍÕÒ²»µ½¶ÓÎéÁË  
 | 
    #curPlayer.SetTeamID(0)  
 | 
      
 | 
    teamID = curTeam.GetTeamID()  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    #Èç¹û¶ÓÎéÎÞÈË,MapServerÖÐɾ³ý¶ÓÎé  
 | 
    if curTeam.GetMemberCount() <= 1:  
 | 
        GameWorld.GetTeamManager().DeleteTeam(teamID)  
 | 
    else:  
 | 
        #Èç¹û¶ÓÎ黹ÓÐÆäËûÈË,À뿪¶ÓÎé  
 | 
        curTeam.DeleteMember(playerID)  
 | 
        #GameWorld.Log("Íæ¼ÒÏÂÏß %d, ´Ó¶ÓÎé %d ÖÐɾ³ýÍæ¼Ò"%(curPlayer.GetPlayerID(), curTeam.GetTeamID()))  
 | 
          
 | 
    if not isDisconnect:  
 | 
        __DelPlayerIDFromTeamPlayer(playerID, True)  
 | 
    return True  
 | 
  
 | 
def __DelPlayerIDFromTeamPlayer(playerID, isleaveMap):  
 | 
    for teamID, teamPlayerIDList in PyGameData.g_teamPlayerDict.items():  
 | 
        if playerID not in teamPlayerIDList:  
 | 
            continue  
 | 
        teamPlayerIDList.remove(playerID)  
 | 
        GameWorld.DebugLog("Íæ¼ÒÀ뿪¶ÓÎé!isleaveMap=%s,teamID=%s,playerID=%s" % (isleaveMap, teamID, playerID))  
 | 
        if not teamPlayerIDList:  
 | 
            PyGameData.g_teamPlayerDict.pop(teamID)  
 | 
            GameWorld.DebugLog("    µØÍ¼¶ÓÎéûÈËÁË£¬É¾³ý¶ÓÎ飡teamID=%s" % (teamID))  
 | 
        GameWorld.DebugLog("    PyGameData.g_teamPlayerDict=%s" % (PyGameData.g_teamPlayerDict))  
 | 
    return  
 | 
  
 | 
def GetMapTeamPlayerIDList(teamID):  
 | 
    # µØÍ¼¶ÓÎéÍæ¼ÒIDÁÐ±í£¬º¬ÀëÏßÍæ¼Ò£¬Èç¹ûËùÓжÓÔ±¶¼ÀëÏߣ¬´ËʱµØÍ¼µÄTeamÊDz»´æÔڵ쬵«ÊÇÀëÏß±£»¤Ê±¼äÄڵĶÓÔ±Íæ¼ÒID»¹ÊÇ»áÔÚ´ËÁбíÖÐ  
 | 
    return PyGameData.g_teamPlayerDict.get(teamID, [])  
 | 
  
 | 
def OnCheckTeamPlayerDisconnectTimeout(tick):  
 | 
    ## ¼ì²é¶ÓÎéÍæ¼Ò, Ã¿·ÖÖÓ¼ì²éÒ»´Î  
 | 
      
 | 
    #GameWorld.DebugLog("¼ì²é¶ÓÎéÍæ¼ÒÀëÏß³¬Ê±Çé¿ö: PyGameData.g_teamPlayerDict=%s" % PyGameData.g_teamPlayerDict)  
 | 
    isTimeout = False  
 | 
    for teamID, teamPlayerIDList in PyGameData.g_teamPlayerDict.items():  
 | 
        timeoutPlayerIDList = []  
 | 
        for playerID in teamPlayerIDList:  
 | 
            leaveTick = PlayerControl.GetPlayerLeaveServerTick(playerID)  
 | 
            if not leaveTick:  
 | 
                continue  
 | 
            # ³¬¹ýÀëÏß±£»¤  
 | 
            if tick - leaveTick > ChConfig.Def_PlayerOfflineProtectTime:  
 | 
                timeoutPlayerIDList.append(playerID)  
 | 
                GameWorld.DebugLog("    ÒƳýÀëÏß±£»¤µÄ¶ÓÔ±: teamID=%s,leaveTick=%s,tick=%s,playerID=%s" % (teamID, leaveTick, tick, playerID))  
 | 
                isTimeout = True  
 | 
                  
 | 
        for timeoutPlayerID in timeoutPlayerIDList:  
 | 
            teamPlayerIDList.remove(timeoutPlayerID)  
 | 
              
 | 
        if not teamPlayerIDList:  
 | 
            PyGameData.g_teamPlayerDict.pop(teamID)  
 | 
            GameWorld.DebugLog("    ¶ÓÎéÒÑûÓб£»¤ÖеĶÓÔ±, É¾³ý¶ÓÎé¼Ç¼!teamID=%s" % teamID)  
 | 
              
 | 
    if isTimeout:  
 | 
        GameWorld.DebugLog("    PyGameData.g_teamPlayerDict=%s" % PyGameData.g_teamPlayerDict)  
 | 
    return  
 | 
  
 | 
## À뿪¸±±¾£¨gameµ÷Óã©  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GameServer_LeaveFB(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    FBLogic.GameServer_LeaveFB(curPlayer, tick)  
 | 
    return  
 | 
  
 | 
  
 |