#!/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
|
|
|