#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
##@package PlayerTeam
|
# @todo: Íæ¼Ò×é¶ÓÂß¼¹ÜÀíÆ÷
|
#
|
# @author: panwei
|
# @date 2010-05-10
|
# @version 1.0
|
#
|
# @note:
|
#---------------------------------------------------------------------
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2015-07-17 13:50"""
|
#---------------------------------------------------------------------
|
|
import PlayerAssist
|
#import PlayerRequest
|
import GameWorldBoss
|
import IpyGameDataPY
|
import NetPackCommon
|
import IPY_GameServer
|
import ChGameToMapPyPack
|
import ChPyNetSendPack
|
import DataRecordPack
|
import PlayerControl
|
import PlayerFriend
|
import ShareDefine
|
import PyGameData
|
import GameWorld
|
import ChConfig
|
import PlayerFB
|
|
import copy
|
import time
|
import random
|
|
#---------------------------------------------------------------------
|
TeamFBAskType_Match = 0 # ×é¶Ó¸±±¾½øÈëѯÎÊÀàÐÍ - Æ¥Åä
|
TeamFBAskType_Enter = 1 # ×é¶Ó¸±±¾½øÈëѯÎÊÀàÐÍ - µã»÷½øÈë
|
TeamFBAskType_PrepareOK = 2 # ×é¶Ó¸±±¾½øÈëѯÎÊÀàÐÍ - ×¼±¸Íê±ÏºóÑéÖ¤
|
|
# ¶ÓÎé³ÉÔ±×¼±¸×´Ì¬
|
TeamMemPrepareStateList = (
|
TeamMemPrepareState_None, # 0 δ֪
|
TeamMemPrepareState_OK, # 1 ÒÑ×¼±¸
|
TeamMemPrepareState_Refuse, # 2 ¾Ü¾ø
|
TeamMemPrepareState_Offline, # 3 µôÏß
|
TeamMemPrepareState_LeaveTeam, # 4 Í˳ö¶ÓÎé, ÈçÎÞÍÑ»úʱ¼äµôÏßµÈ
|
) = range(5)
|
|
## ¶ÓÎéÏà¹ØÏà¹ØÉóºË¿ª¹Ø×´Ì¬
|
def SetTeamCheckState(curPlayer, checkState):
|
curPlayer.SetExAttr2(checkState)
|
GameWorld.DebugLog("¶ÓÎéÏà¹ØÏà¹ØÉóºË¿ª¹Ø×´Ì¬±ä¸ü: %s" % checkState, curPlayer.GetPlayerID())
|
return
|
## ÇëÇó¼ÓÈë¶ÓÎéÊÇ·ñÐèÒªÉóºË
|
def IsTeamJoinReqNeedCheck(curPlayer): return curPlayer.GetExAttr2() / 10
|
## ÑûÇë×é¶ÓÊÇ·ñÐèÒªÉóºË
|
def IsTeamInvateNeedCheck(curPlayer): return curPlayer.GetExAttr2() % 10
|
|
## ³¡¾°µØÍ¼ID¶ÓÎéID×Öµä
|
def GetSceneTeamIDDict(): return PyGameData.g_sceneTeamIDDict
|
def AddTeamIDToSceneList(teamID, mapID, tick):
|
'''Ìí¼Ó¶ÓÎéIDµ½³¡¾°¶ÓÎéÁбíÖÐ
|
´´½¨¶ÓÎé¡¢¶Ó³¤±ä¸ü¡¢¶Ó³¤Çл»µØÍ¼¡¢ÉÏÏßʱ¶ÓÎéÖ»ÓÐÒ»ÈË
|
'''
|
teamIDList = PyGameData.g_sceneTeamIDDict.get(mapID, [])
|
if teamID not in teamIDList:
|
teamIDList.append(teamID)
|
PyGameData.g_sceneTeamIDDict[mapID] = teamIDList
|
GameWorld.DebugLog("Ìí¼Ó³¡¾°¶ÓÎé: mapID=%s,teamID=%s,sceneTeam=%s" % (mapID, teamID, PyGameData.g_sceneTeamIDDict))
|
#UpdSceneTeamVersion(mapID, tick)
|
return
|
def DelTeamIDFromSceneList(teamID, tick):
|
'''°Ñ¶ÓÎéID´Ó³¡¾°¶ÓÎéÁбíÖÐÒÆ³ý
|
ɾ³ý¶ÓÎé¡¢¶Ó³¤±ä¸ü¡¢¶Ó³¤Çл»µØÍ¼¡¢ÏÂÏßʱ¶ÓÎéÖ»ÓÐÒ»ÈË
|
'''
|
for mapID, teamIDList in PyGameData.g_sceneTeamIDDict.items():
|
if teamID in teamIDList:
|
teamIDList.remove(teamID)
|
if not teamIDList:
|
PyGameData.g_sceneTeamIDDict.pop(mapID)
|
GameWorld.DebugLog("ɾ³ý³¡¾°¶ÓÎé: mapID=%s,teamID=%s,sceneTeam=%s" % (mapID, teamID, PyGameData.g_sceneTeamIDDict))
|
#UpdSceneTeamVersion(mapID, tick)
|
if teamID in PyGameData.g_tagMapTeamTimeDict:
|
UpdateTeamTagMapTime(teamID, mapID)
|
break
|
return
|
|
#def UpdSceneTeamVersion(mapID, tick):
|
# '''³¡¾°¶ÓÎéÐÅÏ¢¿ÉÄܱä¸üµÄÇé¿ö
|
# ´´½¨¶ÓÎ顢ɾ³ý¶ÓÎé¡¢¶Ó³¤±ä¸ü¡¢¶Ó³¤Çл»µØÍ¼¡¢Ôö¼Ó³ÉÔ±¡¢É¾³ý³ÉÔ±¡¢¸ü¸Ä¶ÓÎéÐÅÏ¢
|
# '''
|
# PyGameData.g_sceneTeamServerVersion[mapID] = tick
|
# GameWorld.DebugLog("³¡¾°¶ÓÎéÐÅÏ¢°æ±¾±ä¸ü: mapID=%s,version=%s, %s" % (mapID, tick, PyGameData.g_sceneTeamServerVersion))
|
# return
|
|
def GetScenePlayerIDDict(): return PyGameData.g_scenePlayerIDDict
|
def AddPlayerIDToSceneList(playerID, mapID):
|
'''Ìí¼ÓÍæ¼ÒIDµ½³¡¾°Íæ¼ÒÁбíÖÐ
|
ÉÏÏß¡¢Çл»µØÍ¼
|
'''
|
playerIDList = PyGameData.g_scenePlayerIDDict.get(mapID, [])
|
if playerID not in playerIDList:
|
playerIDList.append(playerID)
|
PyGameData.g_scenePlayerIDDict[mapID] = playerIDList
|
GameWorld.DebugLog("Ìí¼Ó³¡¾°Íæ¼Ò: mapID=%s,playerID=%s,scenePlayerID=%s"
|
% (mapID, playerID, PyGameData.g_scenePlayerIDDict))
|
return
|
def DelPlayerIDFromSceneList(playerID):
|
'''°ÑÍæ¼ÒID´Ó³¡¾°Íæ¼ÒÁбíÖÐÒÆ³ý
|
ÏÂÏß¡¢Çл»µØÍ¼
|
'''
|
for mapID, playerIDList in PyGameData.g_scenePlayerIDDict.items():
|
if playerID in playerIDList:
|
playerIDList.remove(playerID)
|
if not playerIDList:
|
PyGameData.g_scenePlayerIDDict.pop(mapID)
|
GameWorld.DebugLog("ɾ³ý³¡¾°Íæ¼Ò: mapID=%s,playerID=%s,scenePlayerID=%s"
|
% (mapID, playerID, PyGameData.g_scenePlayerIDDict))
|
break
|
return
|
|
|
## Ä¿±êµØÍ¼¶ÓÎéID×Öµä
|
def AddTeamIDToTagMapTeamDict(teamID, tagMapID):
|
## ´´½¨¶ÓÎé¡¢¸Ä±ä¶ÓÎéÄ¿±ê¡¢ÉÏÏßʱ¶ÓÎéÖ»ÓÐÒ»ÈË
|
teamIDList = PyGameData.g_tagMapTeamDict.get(tagMapID, [])
|
if teamID not in teamIDList:
|
teamIDList.append(teamID)
|
PyGameData.g_tagMapTeamDict[tagMapID] = teamIDList
|
GameWorld.DebugLog("Ìí¼ÓÄ¿±ê¶ÓÎé: tagMapID=%s,teamID=%s,tagMapTeam=%s"
|
% (tagMapID, teamID, PyGameData.g_tagMapTeamDict))
|
if tagMapID:
|
UpdateTeamTagMapTime(teamID, tagMapID, True)
|
return
|
def DelTeamIDFromTagMapTeamDict(teamID):
|
## ɾ³ý¶ÓÎé¡¢¸Ä±ä¶ÓÎéÄ¿±ê¡¢ÏÂÏßʱ¶ÓÎéÖ»ÓÐÒ»ÈË
|
for tagMapID, teamIDList in PyGameData.g_tagMapTeamDict.items():
|
if teamID in teamIDList:
|
teamIDList.remove(teamID)
|
if not teamIDList:
|
PyGameData.g_tagMapTeamDict.pop(tagMapID)
|
GameWorld.DebugLog("ɾ³ýÄ¿±ê¶ÓÎé: tagMapID=%s,teamID=%s,tagMapTeam=%s"
|
% (tagMapID, teamID, PyGameData.g_tagMapTeamDict))
|
if teamID in PyGameData.g_tagMapTeamTimeDict:
|
PyGameData.g_tagMapTeamTimeDict.pop(teamID)
|
return
|
|
def UpdateTeamTagMapTime(teamID, tagMapID, isForce=False):
|
lastTime = 0
|
if not isForce and teamID in PyGameData.g_tagMapTeamTimeDict:
|
mapID, lastTime = PyGameData.g_tagMapTeamTimeDict[teamID]
|
if tagMapID != mapID:
|
#GameWorld.DebugLog("·Ç¶ÓÎéÄ¿±êµØÍ¼£¬²»¸üÐÂʱ¼ä! tagMapID=%s,mapID=%s" % (tagMapID, mapID))
|
return
|
curTime = time.time()
|
PyGameData.g_tagMapTeamTimeDict[teamID] = [tagMapID, curTime]
|
GameWorld.DebugLog("¸üжÓÎéÄ¿±êʱ¼ä: teamID=%s,tagMapID=%s,curTime=%s,lastTime=%s" % (teamID, tagMapID, curTime, lastTime))
|
return
|
def ResetTeamTagMapByTime():
|
curTime = time.time()
|
teamMgr = GameWorld.GetTeamManager()
|
for teamID, tagMapTimeInfo in PyGameData.g_tagMapTeamTimeDict.items():
|
tagMapID, lastTime = tagMapTimeInfo
|
if curTime - lastTime < 1200:
|
continue
|
if IsTeamMatchingPlayer(teamID):
|
continue
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
if DoChangeTeamTagMap(None, team, 0):
|
GameWorld.DebugLog("ÖØÖöÓÎéÄ¿±ê! teamID=%s,tagMapID=%s,curTime=%s,lastTime=%s" % (teamID, tagMapID, curTime, lastTime))
|
return
|
|
## ¸±±¾Æ¥ÅäÖеĶÓÎéID
|
def AddTeamIDToMatchingList(curTeam, tagMapID, tagMapEx):
|
## ¿ªÊ¼Æ¥Åäʱ¼ÓÈë
|
key = (tagMapID, tagMapEx)
|
teamID = curTeam.GetTeamID()
|
teamIDList = PyGameData.g_matchingTeamDict.get(key, [])
|
if teamID not in teamIDList:
|
teamIDList.append(teamID)
|
PyGameData.g_matchingTeamDict[key] = teamIDList
|
# ͬ²½¿Í»§¶ËÆ¥Åä״̬
|
statePack = ChPyNetSendPack.tagGCTeamMatchState()
|
statePack.IsMatching = 1
|
SendTeamFakePack(curTeam, statePack)
|
GameWorld.DebugLog("Ìí¼ÓÆ¥Åä¶ÓÎé: tagMapID=%s,tagMapEx=%s,teamID=%s,matchingTeam=%s"
|
% (tagMapID, tagMapEx, teamID, PyGameData.g_matchingTeamDict))
|
return
|
def DelTeamIDFromMatchingList(curTeam):
|
## È¡ÏûÆ¥Åä¡¢ÂúԱʱ(Æ¥Åä¡¢·ÇÆ¥Åä)¡¢É¾³ý¶ÓÎé¡¢ÏÂÏßʱ¶ÓÎéÖ»ÓÐÒ»ÈË
|
teamID = curTeam.GetTeamID()
|
for key, teamIDList in PyGameData.g_matchingTeamDict.items():
|
if teamID in teamIDList:
|
tagMapID, tagMapEx = key
|
teamIDList.remove(teamID)
|
if not teamIDList:
|
PyGameData.g_matchingTeamDict.pop(key)
|
# ͬ²½¿Í»§¶ËÆ¥Åä״̬
|
statePack = ChPyNetSendPack.tagGCTeamMatchState()
|
SendTeamFakePack(curTeam, statePack)
|
GameWorld.DebugLog("ɾ³ýÆ¥Åä¶ÓÎé: tagMapID=%s,tagMapEx=%s,teamID=%s,matchingTeam=%s"
|
% (tagMapID, tagMapEx, teamID, PyGameData.g_matchingTeamDict))
|
return
|
def IsTeamMatchingPlayer(teamID):
|
for teamIDList in PyGameData.g_matchingTeamDict.values():
|
if teamID in teamIDList:
|
return True
|
return False
|
|
## ¸±±¾Æ¥ÅäÖеÄÍæ¼ÒID
|
def AddPlayerIDToMatchingList(curPlayer, tagMapID, tagMapEx):
|
## ¿ªÊ¼Æ¥Åäʱ¼ÓÈë
|
key = (tagMapID, tagMapEx)
|
playerIDList = PyGameData.g_matchingPlayerDict.get(key, [])
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in playerIDList:
|
playerIDList.append(playerID)
|
PyGameData.g_matchingPlayerDict[key] = playerIDList
|
# ͬ²½¿Í»§¶ËÆ¥Åä״̬
|
Sync_TeamMatchState(curPlayer, True)
|
GameWorld.DebugLog("Ìí¼ÓÆ¥ÅäÍæ¼Ò: tagMapID=%s,tagMapEx=%s,playerID=%s,matchingPlayer=%s"
|
% (tagMapID, tagMapEx, playerID, PyGameData.g_matchingPlayerDict))
|
return
|
def DelPlayerIDFromMatchingList(curPlayer):
|
## È¡ÏûÆ¥Åä¡¢¼ÓÈë¶ÓÎé(Æ¥Åä¡¢·ÇÆ¥Åä)¡¢ÏÂÏß
|
playerID = curPlayer.GetPlayerID()
|
for key, playerIDList in PyGameData.g_matchingPlayerDict.items():
|
if playerID in playerIDList:
|
tagMapID, tagMapEx = key
|
playerIDList.remove(playerID)
|
if not playerIDList:
|
PyGameData.g_matchingPlayerDict.pop(key)
|
# ͬ²½¿Í»§¶ËÆ¥Åä״̬
|
Sync_TeamMatchState(curPlayer, False)
|
GameWorld.DebugLog("ɾ³ýÆ¥ÅäÍæ¼Ò: tagMapID=%s,tagMapEx=%s,playerID=%s,matchingPlayer=%s"
|
% (tagMapID, tagMapEx, playerID, PyGameData.g_matchingPlayerDict))
|
return
|
def IsPlayerMatchingTeam(playerID):
|
for tagMapInfo, playerIDList in PyGameData.g_matchingPlayerDict.items():
|
if playerID in playerIDList:
|
return tagMapInfo
|
return False
|
|
def Sync_TeamMatchState(curPlayer, isMatching):
|
statePack = ChPyNetSendPack.tagGCTeamMatchState()
|
statePack.IsMatching = int(isMatching)
|
NetPackCommon.SendFakePack(curPlayer, statePack)
|
return
|
|
#// B9 01 ´´½¨¶ÓÎé #tagCGCreateTeam
|
#
|
#struct tagCGCreateTeam
|
#{
|
# tagHead Head;
|
# DWORD TagMapID; // Ä¿±êµØÍ¼
|
# WORD TagMapEx; // Ä¿±êµØÍ¼À©Õ¹
|
# WORD ReqMinLV; // ¶ÓÔ±×îµÍµÈ¼¶ÏÞÖÆ
|
# WORD ReqMaxLV; // ¶ÓÔ±×î¸ßµÈ¼¶ÏÞÖÆ
|
#};
|
def OnCreateTeam(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
tagMapID = clientData.TagMapID
|
tagMapEx = clientData.TagMapEx
|
reqMinLV = clientData.ReqMinLV
|
reqMaxLV = clientData.ReqMaxLV
|
|
#²»¿É×é¶Ó
|
if not __CheckCanTeamComm(curPlayer):
|
return
|
|
curPlayerTeam = curPlayer.GetTeam()
|
curPlayerID = curPlayer.GetPlayerID()
|
|
if curPlayerTeam != None:
|
# ÒÑÓжÓÎ飬²»ÄÜ´´½¨
|
GameWorld.DebugLog("Íæ¼ÒÒÑÓжÓÎ飬²»ÄÜ´´½¨!", curPlayerID)
|
return
|
DoCreateTeam(curPlayer, tick, tagMapID, tagMapEx, reqMinLV, reqMaxLV)
|
return
|
|
def DoCreateTeam(curPlayer, tick, tagMapID=0, tagMapEx=0, reqMinLV=1, reqMaxLV=0, isSync=True):
|
curPlayerID = curPlayer.GetPlayerID()
|
if not reqMaxLV:
|
reqMaxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV")
|
#×é³ÉжÓÎé
|
curNewTeam = GameWorld.GetTeamManager().CreateTeam(IPY_GameServer.ttNormal, tagMapID, tagMapEx, reqMinLV, reqMaxLV)
|
if curNewTeam == None:
|
GameWorld.ErrLog("×î´ó¶ÓÎéÊýÁ¿ÒÑÂú, ´´½¨Ê§°Ü£¡", curPlayerID)
|
return
|
teamID = curNewTeam.GetTeamID()
|
AddTeamIDToSceneList(teamID, curPlayer.GetMapID(), tick)
|
AddTeamIDToTagMapTeamDict(teamID, tagMapID)
|
|
#Ìí¼Ó³ÉÔ±
|
curPlayer.SetTeam(curNewTeam)
|
curNewTeam.AddMember(curPlayer)
|
|
#ÉèÖõ±Ç°Íæ¼ÒΪ¶Ó³¤
|
curNewTeamMenber = curNewTeam.GetMemberByID(curPlayerID)
|
if curNewTeamMenber == None:
|
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, "Create", {"Leader":curPlayerID, "tagMapID":tagMapID, "tagMapEx":tagMapEx, "reqMinLV":reqMinLV, "reqMaxLV":reqMaxLV})
|
|
DelPlayerIDFromMatchingList(curPlayer)
|
return curNewTeam
|
|
|
#// B9 02 ÑûÇëÍæ¼Ò¼ÓÈë¶ÓÎé #tagCGInvitePlayerJoinTeam
|
#
|
#struct tagCGInvitePlayerJoinTeam
|
#{
|
# tagHead Head;
|
# DWORD PlayerID; // Ä¿±êÍæ¼ÒID
|
#};
|
def OnInvitePlayerJoinTeam(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
tagPlayerID = clientData.PlayerID
|
|
#ÑûÇëµÄÍæ¼Ò¶ÔÏó
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
#Ä¿±êÍæ¼ÒÊÇ·ñ´æÔÚ
|
if tagPlayer == None:
|
GameWorld.Log("Ä¿±êÍæ¼Ò²»ÔÚÏß»ò²»´æÔÚ£¬ÎÞ·¨×é¶Ó£¡tagPlayerID=%s" % (tagPlayerID), playerID)
|
PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_500807")
|
return
|
|
#»ñµÃË«·½µÄ¶ÓÎé
|
curPlayerTeam = curPlayer.GetTeam()
|
tagPlayerTeam = tagPlayer.GetTeam()
|
|
#ÑûÇë×é¶ÓµÄʱºò£¬Ë«·½¶¼ÓжÓÎé²»´¦Àí
|
if curPlayerTeam != None and tagPlayerTeam != None:
|
#¸ÃÍæ¼ÒÒÑÔÚËûÈ˶ÓÎéÖУ¬ÑûÇëÈë¶Óʧ°Ü£¡
|
PlayerControl.NotifyCode(curPlayer, "InviteEnterLost02")
|
#InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick)
|
return
|
|
if tagPlayerTeam == None:
|
#Ä¿±êÍæ¼ÒûÓжÓÎé, ÑûÇëÍæ¼Ò¼ÓÈë, Ö§³ÖÎÞ¶ÓÎéË«·½ÎÞ¶ÓÎéÑûÇë
|
InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick)
|
|
elif curPlayerTeam == None and tagPlayerTeam != None:
|
#ÇëÇó¼ÓÈë¶ÓÎé(#±»ÑûÇëµÄÍæ¼ÒÓжӣ¬ÇëÇó¼ÓÈëÆä¶ÓÎé)
|
RequestJoinTeamReq(curPlayer, tagPlayerTeam, tick)
|
|
else:
|
GameWorld.Log("OnInvitePlayerJoinTeam ->×é¶ÓϵͳÒì³£" , curPlayer.GetPlayerID())
|
|
return
|
|
#// B9 11 ÇëÇó¼ÓÈë¶ÓÎé #tagCGRequestJoinTeam
|
#
|
#struct tagCGRequestJoinTeam
|
#{
|
# tagHead Head;
|
# DWORD TeamID; // Ä¿±ê¶ÓÎéID
|
#};
|
def OnRequestJoinTeam(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
teamID = clientData.TeamID
|
tagPlayerTeam = GameWorld.GetTeamManager().FindTeam(teamID)
|
if tagPlayerTeam == None:
|
# TeamNoExist ¶ÓÎé²»´æÔÚ
|
PlayerControl.NotifyCode(curPlayer, "TeamNoExist")
|
return
|
RequestJoinTeamReq(curPlayer, tagPlayerTeam, tick)
|
return
|
|
#//09 09 ÇëÇó¼ÓÈë¶ÓÎé#tagCRequestJoinTeam
|
#
|
#struct tagCRequestJoinTeam
|
#{
|
# tagHead Head;
|
# DWORD PlayerID;
|
#};
|
def RequestJoinTeam(index, tick):
|
#»ñµÃ·â°ü
|
sendPack = IPY_GameServer.IPY_CRequestJoinTeam()
|
#·¢³öÇëÇóµÄÍæ¼ÒID
|
tagPlayerID = sendPack.GetPlayerID()
|
__Func_RequestJoinTeam(index, tagPlayerID, tick)
|
return
|
|
def __Func_RequestJoinTeam(index, tagPlayerID, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
|
|
#ÑûÇëµÄÍæ¼Ò¶ÔÏó
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
#Ä¿±êÍæ¼ÒÊÇ·ñ´æÔÚ
|
if tagPlayer == None:
|
GameWorld.Log("Ä¿±ê×é¶ÓÍæ¼Ò²»ÔÚÏߣ¬ÎÞ·¨×é¶Ó£¡tagPlayerID=%s" % (tagPlayerID), playerID)
|
PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_500807")
|
return
|
|
#»ñµÃË«·½µÄ¶ÓÎé
|
curPlayerTeam = curPlayer.GetTeam()
|
tagPlayerTeam = tagPlayer.GetTeam()
|
|
#ÇëÇó¼ÓÈëµÄʱºò£¬Ë«·½¶¼ÓжÓÎéÒ²¿ÉÇëÇó¼ÓÈ룬֧³ÖÍ˳ö¶ÓÎéÇëÇó¼ÓÈë
|
if curPlayerTeam != None and tagPlayerTeam != None:
|
#ÄúÒÑÓжÓÎ飬ÇëÏÈÍ˳öÔÙÉêÇë
|
PlayerControl.NotifyCode(curPlayer, "Friend_HaveTeam")
|
return
|
|
if tagPlayerTeam == None:
|
# TeamNoExist ¶ÓÎé²»´æÔÚ
|
#PlayerControl.NotifyCode(curPlayer, "TeamNoExist")
|
#Ä¿±êÍæ¼ÒûÓжÓÎé, ÑûÇëÍæ¼Ò¼ÓÈë, Ö§³ÖÎÞ¶ÓÎéË«·½ÎÞ¶ÓÎéÑûÇë
|
#InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick)
|
|
#Ö§³ÖË«·½ÎÞ¶ÓÎéÇëÇó¼ÓÈ룬ֱ½Ó·¢Ë͸ø±»ÇëÇó·½È·ÈÏ
|
#֪ͨ¿Í»§¶Ëµ¯´°¿Ú(Ä¿±êµ¯¿ò)
|
requestPack = ChPyNetSendPack.tagGCRequestJoinTeam()
|
requestPack.PlayerID = playerID
|
requestPack.Name = curPlayer.GetName()
|
requestPack.NameLen = len(requestPack.Name)
|
requestPack.LV = curPlayer.GetLV()
|
requestPack.Job = curPlayer.GetJob()
|
requestPack.RealmLV = curPlayer.GetOfficialRank()
|
NetPackCommon.SendFakePack(tagPlayer, requestPack)
|
|
#TeamAskSuccess: Òѳɹ¦·¢ËÍÈë¶ÓÉêÇë
|
PlayerControl.NotifyCode(curPlayer, "TeamAskSuccess")
|
else:
|
# ÇëÇó¼ÓÈë¶ÓÎé(#±»ÇëÇóµÄÍæ¼ÒÓжӣ¬ÇëÇó¼ÓÈëÆä¶ÓÎé)
|
RequestJoinTeamReq(curPlayer, tagPlayerTeam, tick)
|
|
return
|
|
def InvitePlayerJoinTeamReq(curPlayer, tagPlayer, curPlayerTeam, tick):
|
'''ÑûÇëÍæ¼Ò¼ÓÈë/Ò»Æð×é¶Ó, Ö§³ÖË«·½ÎÞ¶ÓÎéÑûÇë
|
@param curPlayer: ÑûÇë·½
|
@param tagPlayer: ±»ÑûÇë·½
|
@param curPlayerTeam: ÑûÇë·½µ±Ç°¶ÓÎ飬¿ÉÄÜΪNone
|
'''
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
tagMapID, tagMapEx = 0, 0 # ĬÈÏÎÞÄ¿±ê¶ÓÎé
|
# Èç¹ûÑûÇë·½ÓжÓÎé
|
if curPlayerTeam:
|
#Åж϶ÓÎéÈËÊý
|
if curPlayerTeam.IsTeamFull():
|
#GeRen_chenxin_570355 ¶Ô²»Æð,ÎÒ·½¶ÓÎéÒÑÂúÔ±£¡
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_570355")
|
return
|
|
#²ß»®Ð޸ĹæÔò£¬ÈκζÓÔ±¶¼ÓÐÕÐÈËȨÏÞ
|
#===========================================================================================
|
# #ÅжÏÊÇ·ñÓÐȨÏÞ
|
# if not CheckTeamLV(curPlayer):
|
# #ApplyEnterLost04 <n color="255,255,0">¶Ô²»Æð,ÄúûÓÐÊÕÈËȨÏÞ,ÕÐÊÕ¶ÓԱʧ°Ü!</n> 25 - - Ìí¼ÓÒ»ÏÂ
|
# PlayerControl.NotifyCode(curPlayer, "ApplyEnterLost04")
|
# return
|
#===========================================================================================
|
|
tagMapID = curPlayerTeam.GetTagMapID()
|
tagMapEx = curPlayerTeam.GetTagMapEx()
|
|
curPlayerID = curPlayer.GetPlayerID()
|
tagPlayerID = tagPlayer.GetPlayerID()
|
#Ìí¼ÓÆÕͨ×é¶ÓÇëÇó
|
#curPlayer.AddRequest(tagPlayerID, IPY_GameServer.reqTeam, tick, ChConfig.Def_EventClearTime)
|
#GameWorld.Log("Íæ¼Ò%sÌí¼Ó:ÑûÇë¼ÓÈëÆÕͨ×é¶ÓÇëÇó³É¹¦"%(curPlayerID), curPlayerID, tagPlayerID)
|
#GameWorld.Log("Íæ¼Ò%sÌí¼Ó:ÑûÇë¼ÓÈëÆÕͨ×é¶ÓÇëÇó³É¹¦"%(tagPlayerID), curPlayerID, tagPlayerID)
|
|
GameWorld.DebugLog("ÑûÇë×é¶Ó, tagMapID=%s,tagMapEx=%s,tagPlayerID=%s" % (tagMapID, tagMapEx, tagPlayerID), curPlayerID)
|
|
isTjg = PlayerControl.GetIsTJG(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 True
|
|
#֪ͨ¿Í»§¶Ëµ¯´°¿Ú(Ä¿±êµ¯¿ò)
|
#tagPlayer.TeamAskIfJoin(curPlayer.GetPlayerID(), curPlayer.GetName(), teamType) # //09 01 ¶Ó³¤ÑûÇëÍæ¼Ò¼ÓÈë¶ÓÎé#tagLeaderAskJoin
|
invitePack = ChPyNetSendPack.tagGCInviteJoinTeamInfo()
|
invitePack.PlayerID = curPlayerID
|
invitePack.Name = curPlayer.GetName()
|
invitePack.NameLen = len(invitePack.Name)
|
invitePack.LV = curPlayer.GetLV()
|
invitePack.Job = curPlayer.GetJob()
|
invitePack.RealmLV = curPlayer.GetOfficialRank()
|
invitePack.TagMapID = tagMapID
|
invitePack.TagMapEx = tagMapEx
|
NetPackCommon.SendFakePack(tagPlayer, invitePack)
|
|
#TeamInviteSuccess: Òѳɹ¦·¢ËÍ×é¶ÓÑûÇë
|
PlayerControl.NotifyCode(curPlayer, "TeamInviteSuccess")
|
return True
|
|
def RequestJoinTeamReq(curPlayer, tagPlayerTeam, tick):
|
'''ÇëÇó¼ÓÈë¶ÓÎé
|
@param curPlayer: ÇëÇó·½
|
@param tagPlayerTeam: Ä¿±ê¶ÓÎé
|
'''
|
if not tagPlayerTeam:
|
return
|
|
# ÇëÇóÈë¶ÓµÄÐÅÏ¢ÍÆË͸øÄ¿±ê¶ÓÎé¶Ó³¤£¬Óɶӳ¤½øÐÐÉóºË
|
tagPlayer = GetTeamLeader(tagPlayerTeam)
|
if not tagPlayer:
|
return
|
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
if not (tagPlayerTeam.GetReqMinLV() <= curPlayer.GetLV() <= tagPlayerTeam.GetReqMaxLV()):
|
PlayerControl.NotifyCode(curPlayer, "TeamAskLost")
|
return
|
|
#Åж϶ÓÎéÈËÊý
|
if tagPlayerTeam.IsTeamFull():
|
#GeRen_chenxin_227479 Ä¿±ê¶ÓÎéÒÑÂúÔ±£¡
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_227479")
|
return
|
|
curPlayerID = curPlayer.GetPlayerID()
|
tagPlayerID = tagPlayer.GetPlayerID()
|
|
#Ìí¼ÓÆÕͨ×é¶ÓÇëÇó
|
#curPlayer.AddRequest(tagPlayerID, IPY_GameServer.reqTeam, tick, ChConfig.Def_EventClearTime)
|
#GameWorld.Log("Íæ¼Ò%sÌí¼Ó:ÉêÇë¼ÓÈëÆÕͨ×é¶ÓÇëÇó³É¹¦"%(curPlayerID), curPlayerID, tagPlayerID)
|
#GameWorld.Log("Íæ¼Ò%sÌí¼Ó:ÉêÇë¼ÓÈëÆÕͨ×é¶ÓÇëÇó³É¹¦"%(tagPlayerID), curPlayerID, tagPlayerID)
|
|
GameWorld.DebugLog("ÇëÇó¼ÓÈë¶ÓÎé,teamID=%s,tagPlayerID=%s" % (tagPlayerTeam.GetTeamID(), tagPlayerID), curPlayerID)
|
|
isTjg = PlayerControl.GetIsTJG(tagPlayer)
|
if isTjg or not IsTeamJoinReqNeedCheck(tagPlayer):
|
GameWorld.DebugLog("±»ÇëÇó¼ÓÈëµÄ¶Ó³¤´¦ÓÚÍÑ»ú״̬»ò²»ÐèÒªÉóºËµÄ£¬Ö±½ÓÈë¶Ó! tagPlayerID=%s,isTjg=%s"
|
% (tagPlayerID, isTjg), curPlayerID)
|
DoPlayerJoinTeam(curPlayer, tagPlayer, tagPlayerTeam, tick, curPlayer)
|
return True
|
|
#֪ͨ¿Í»§¶Ëµ¯´°¿Ú(Ä¿±êµ¯¿ò)
|
#tagPlayer.PlayerJoinTeamAsk(curPlayer.GetPlayerID(), curPlayer.GetName()) # //09 07 ÊÇ·ñÔÊÐí¶ÓÔ±¼ÓÈë#tagPlayerAskJoinTeam
|
requestPack = ChPyNetSendPack.tagGCRequestJoinTeam()
|
requestPack.PlayerID = curPlayerID
|
requestPack.Name = curPlayer.GetName()
|
requestPack.NameLen = len(requestPack.Name)
|
requestPack.LV = curPlayer.GetLV()
|
requestPack.Job = curPlayer.GetJob()
|
requestPack.RealmLV = curPlayer.GetOfficialRank()
|
NetPackCommon.SendFakePack(tagPlayer, requestPack)
|
|
#TeamAskSuccess: Òѳɹ¦·¢ËÍÈë¶ÓÉêÇë
|
PlayerControl.NotifyCode(curPlayer, "TeamAskSuccess")
|
return True
|
|
def Sync_TeamMemberInfo(curTeam):
|
olPlayerList = []
|
teamMemberInfo = ChPyNetSendPack.tagGCTeamMemberInfo()
|
teamMemberInfo.TeamID = curTeam.GetTeamID()
|
teamMemberInfo.TagMapID = curTeam.GetTagMapID()
|
teamMemberInfo.TagMapEx = curTeam.GetTagMapEx()
|
teamMemberInfo.ReqMinLV = curTeam.GetReqMinLV()
|
teamMemberInfo.ReqMaxLV = curTeam.GetReqMaxLV()
|
teamMemberInfo.MemberList = []
|
for i in xrange(curTeam.GetMemberCount()):
|
memberInfo = curTeam.GetMemberInfo(i)
|
playerID = memberInfo.GetPlayerID()
|
if not playerID:
|
continue
|
member = ChPyNetSendPack.tagGCTeamMember()
|
member.Index = i
|
member.PlayerID = playerID
|
member.Name = memberInfo.GetPlayerName()
|
member.NameLen = len(member.Name)
|
member.MemberLV = memberInfo.GetTeamLV()
|
member.LV = memberInfo.GetPlayerLV()
|
member.Job = memberInfo.GetPlayerJob()
|
member.JobLevel = memberInfo.GetPlayerJobLevel()
|
member.RealmLV = memberInfo.GetPlayerRealmLV()
|
|
memberPlayer = curTeam.GetMemberPlayer(i)
|
if memberPlayer and memberPlayer.GetPlayerID():
|
member.PlayerState = not PlayerControl.GetIsTJG(memberPlayer) # 0: ÀëÏß 1:ÔÚÏß
|
member.MapID = memberPlayer.GetMapID()
|
member.LineID = memberPlayer.GetFBID()
|
olPlayerList.append(memberPlayer)
|
|
teamMemberInfo.MemberList.append(member)
|
teamMemberInfo.MemberCount = len(teamMemberInfo.MemberList)
|
|
for player in olPlayerList:
|
NetPackCommon.SendFakePack(player, teamMemberInfo)
|
return
|
|
def __CheckCanTeamComm(curPlayer, tagPlayer=None):
|
# ×é¶Ó³£¹æÑéÖ¤
|
|
curPlayerID = curPlayer.GetPlayerID()
|
curMapID = curPlayer.GetMapID()
|
curMapData = GameWorld.GetMap(curMapID)
|
if not curMapData:
|
return False
|
#²»¿É×é¶Ó»ò±ä¸ü¶ÓÎé¹ØÏµµÄµØÍ¼
|
if curMapData.GetTeamLimit() or curMapData.GetMapFBType() == ChConfig.fbtTeam:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_986912")
|
return False
|
|
curTeamID = curPlayer.GetTeamID()
|
if IsInEnterFBTeamAsk(curTeamID):
|
PlayerControl.NotifyCode(curPlayer, "TeamEnterForbid")
|
return False
|
if IsInEnterFBTeamPrepare(curTeamID):
|
PlayerControl.NotifyCode(curPlayer, "TeamEnterForbid")
|
return False
|
|
if PlayerControl.GetAssistTagPlayerID(curPlayer):
|
#ÐÖúÖÐÎÞ·¨Ö´Ðд˲Ù×÷
|
PlayerControl.NotifyCode(curPlayer, "InAssistForbid")
|
return False
|
|
if tagPlayer:
|
tagPlayerID = tagPlayer.GetPlayerID()
|
#¼ì²éID
|
if curPlayerID == tagPlayerID:
|
GameWorld.Log("Ä¿±êÍæ¼ÒID´íÎó£¬ÎÞ·¨ÑûÇ룡tagPlayerID=%s" % (tagPlayerID), curPlayerID)
|
return False
|
|
tagMapID = tagPlayer.GetMapID()
|
tagMapData = GameWorld.GetMap(tagMapID)
|
if not tagMapData:
|
return False
|
#½ÓÊÕ·½²»¿É×é¶Ó»ò±ä¸ü¶ÓÎé¹ØÏµµÄµØÍ¼
|
if tagMapData.GetTeamLimit() or tagMapData.GetMapFBType() == ChConfig.fbtTeam:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lwh_0")
|
return False
|
|
tagTeamID = tagPlayer.GetTeamID()
|
if IsInEnterFBTeamAsk(tagTeamID):
|
PlayerControl.NotifyCode(curPlayer, "TeamEnterForbid")
|
return False
|
if IsInEnterFBTeamPrepare(tagTeamID):
|
PlayerControl.NotifyCode(curPlayer, "TeamEnterForbid")
|
return False
|
|
if PlayerControl.GetAssistTagPlayerID(tagPlayer):
|
#¶Ô·½ÐÖúÖУ¬ÎÞ·¨Ö´Ðд˲Ù×÷
|
PlayerControl.NotifyCode(curPlayer, "TagInAssistForbid")
|
return False
|
|
return True
|
|
#===============================================================================
|
# //09 03 ×é¶ÓÇëÇó»ØÓ¦#tagCTeamReq
|
# tagCTeamReq * GettagCTeamReq();
|
#
|
# class IPY_CTeamReq
|
# {
|
# public:
|
#
|
# int GetPlayerID();
|
# //×é¶ÓÀàÐÍ
|
# int GetTeamType();
|
# //0 : ¾Ü¾ø 1 : ͬÒâ 2: ÎÞÏìÓ¦
|
# int GetType();
|
# };
|
#===============================================================================
|
##±»ÑûÇëµÄÍæ¼ÒÎÞ¶Ó£¬¼ÓÈë·¢³öÑûÇëÍæ¼Ò¶ÓÎ黨Ӧ
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //09 03 ×é¶ÓÇëÇó»ØÓ¦#tagCTeamReq; ±»ÈËÑûÇë¼ÓÈë¶ÓÎéʱµÄ»ØÓ¦
|
def TeamReqReply(index, tick):
|
#»ñµÃ·â°ü
|
sendPack = IPY_GameServer.IPY_CTeamReq()
|
tagPlayerID = sendPack.GetPlayerID() # ·¢³öÑûÇëµÄÍæ¼ÒID
|
isAgree = sendPack.GetType() # ÊÇ·ñͬÒâ
|
__Func_TeamReqReply(index, tagPlayerID, isAgree, tick)
|
return
|
|
def __Func_TeamReqReply(index, tagPlayerID, isAgree, tick):
|
#±»ÑûÇëÍæ¼Ò
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#·¢³öÑûÇëµÄÍæ¼Ò
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
|
if tagPlayer == None:
|
#GeRen_hwj35_500807 ¶Ô²»Æð,ÑûÇëÄã½øÈë¶ÓÎéµÄÍæ¼ÒÒѾÏÂÏß!
|
PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_500807")
|
return
|
|
#Ë«·½µÄ¶ÓÎé
|
curPlayerTeam = curPlayer.GetTeam()
|
tagPlayerTeam = tagPlayer.GetTeam()
|
|
if tagPlayerTeam == None:
|
GameWorld.DebugLog("ÑûÇë×é¶ÓµÄ¶ÓÎéÒѾ²»´æÔÚ£¡")
|
PlayerControl.NotifyCode(curPlayer, "TeamNoExist")
|
return
|
|
if curPlayerTeam != None:
|
#ÄúÒÑÓжÓÎ飬ÇëÏÈÍ˳öÔÙÉêÇë
|
PlayerControl.NotifyCode(curPlayer, "Friend_HaveTeam")
|
return
|
|
#×é¶ÓÀàÐÍ
|
#teamType = sendPack.GetTeamType()
|
|
#ÊÇ·ñͬÒâ
|
if isAgree != 1:
|
#InviteEnterLost01 ÑûÇëÈë¶Óʧ°Ü£¬Ä¿±êÍæ¼Ò¾Ü¾øÁËÄúµÄÑûÇ룡
|
PlayerControl.NotifyCode(tagPlayer, "InviteEnterLost01")
|
return
|
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
#===============================================================================================
|
# #Á½¸öÍæ¼Ò×é³ÉжÓÎé(·¢³öÑûÇëµÄÍæ¼Ò,Ϊ¶Ó³¤)
|
# if tagPlayerTeam == None:
|
# if not CreateNewTeam(curPlayer, tagPlayer, teamType):
|
# return False
|
#
|
# tagPlayerTeam = tagPlayer.GetTeam()
|
#
|
# #¼ÓÈ뵱ǰ¶ÓÎé
|
# else:
|
#===============================================================================================
|
DoPlayerJoinTeam(curPlayer, tagPlayer, tagPlayerTeam, tick, curPlayer)
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //09 0A ÇëÇó¼ÓÈë×é¶Ó»ØÓ¦#tagCRequestJoinTeamReply
|
# tagCRequestJoinTeamReply * GettagCRequestJoinTeamReply();
|
#
|
# class IPY_CRequestJoinTeamReply
|
# {
|
# public:
|
#
|
# int GetPlayerID();
|
# //1:ͬÒâ 2:²»Í¬Òâ
|
# int GetType();
|
# };
|
#===============================================================================
|
##±»ÑûÇëµÄÍæ¼ÒÓжÓÎé,ÇëÇó¼ÓÈëÆä×é¶Ó»ØÓ¦
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //09 0A ÇëÇó¼ÓÈë×é¶Ó»ØÓ¦#tagCRequestJoinTeamReply; ¶ÓÎéÓÐÈËÇëÇó¼ÓÈëµÄ»ØÓ¦
|
def RequestJoinTeamReply(index, tick):
|
#»ñµÃ·â°ü
|
sendPack = IPY_GameServer.IPY_CRequestJoinTeamReply()
|
#·¢³öÉêÇëµÄÍæ¼ÒID
|
tagPlayerID = sendPack.GetPlayerID()
|
isAgree = sendPack.GetType()
|
__Func_RequestJoinTeamReply(index, tagPlayerID, isAgree, tick)
|
return
|
|
def __Func_RequestJoinTeamReply(index, tagPlayerID, isAgree, tick):
|
#±»ÑûÇëÍæ¼Ò(ÓжÓÎé)
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
#GameWorld.Log(str(tagPlayerID))
|
#·¢³öÉêÇëµÄÍæ¼Ò
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
|
if tagPlayer == None:
|
#PK_hwj35_21675 ¶Ô²»Æð,ÉêÇë½øÈë¶ÓÎéµÄÍæ¼ÒÒÑÏÂÏß,²Ù×÷ÎÞЧ
|
PlayerControl.NotifyCode(curPlayer, "PK_hwj35_21675")
|
return
|
|
#±»ÑûÇëµÄÍæ¼Ò¶ÓÎé
|
curPlayerTeam = curPlayer.GetTeam()
|
if curPlayerTeam == None:
|
pass
|
#ÆÁ±Î£¬ÐÞ¸ÄΪ֧³ÖÎÞ¶ÓÎé±»ÇëÇó¼ÓÈë
|
#GameWorld.DebugLog("Íæ¼ÒÎÞ¶ÓÎ飬ÎÞ·¨ÉóºË¼ÓÈë¶ÓÎéÇëÇó!" , playerID)
|
#PlayerControl.NotifyCode(tagPlayer, "TeamNoExist")
|
#return
|
|
#ÉêÇëÈë¶ÓµÄÔÊÐíË«·½¶¼ÓжÓÎé
|
#·¢³öÉêÇëµÄÍæ¼ÒµÄ¶ÓÎé
|
tagPlayerTeam = tagPlayer.GetTeam()
|
if tagPlayerTeam != None:
|
#¸ÃÍæ¼ÒÒÑÓжÓÎ飬ͬÒâʱ²ÅÌáʾ¶Ô·½ÓжÓÎé
|
if isAgree == 1:
|
PlayerControl.NotifyCode(curPlayer, "AcceptTeamLost")
|
return
|
|
#===============================================================================================
|
# #ÇëÇó¼ì²é,ÊÇ·ñÓÐÕâ¸öÇëÇó
|
# if not PlayerRequest.CheckRequest(tagPlayer, curPlayer, IPY_GameServer.reqTeam):
|
# PlayerControl.NotifyCode(curPlayer, "InviteEnterLost03")
|
# return
|
#===============================================================================================
|
|
#È·Èϼì²é
|
if isAgree != 1:
|
#ApplyEnterLost02 ÉêÇëÈë¶Óʧ°Ü£¬¶Ô·½¾Ü¾øÁËÄú¼ÓÈë¸Ã¶ÓµÄÇëÇó£¡
|
PlayerControl.NotifyCode(tagPlayer, "ApplyEnterLost02")
|
return
|
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
DoPlayerJoinTeam(tagPlayer, curPlayer, curPlayerTeam, tick, curPlayer)
|
return True
|
|
def DoPlayerJoinTeam(joinPlayer, teamPlayer, tagTeam, tick, notifyPlayer=None, isAutoMatchJoin=False):
|
''' Ö´ÐÐÍæ¼Ò¼ÓÈë¶ÓÎé
|
@param joinPlayer: ¼ÓÈë¶ÓÎéµÄÍæ¼Ò
|
@param teamPlayer: ÉóºËÊÇ·ñÔÊÐí¼ÓÈëµÄ¶ÓÔ±£¬Ò»°ãÊǶӳ¤
|
@param tagTeam: ¼ÓÈëµÄÄ¿±ê¶ÓÎé, ¿ÉÄÜΪNone
|
@param notifyPlayer: ϵͳÐÅÏ¢·´À¡µÄÄ¿±êÍæ¼Ò£¬ ÇëÇó¼ÓÈëʱ·´À¡¸øÇëÇóµÄÍæ¼Ò£¬Èë¶Ó¼ÓÈëʱ·´À¡¸ø¶Ó³¤, Ϊ¿Õʱ²»×öÐÅÏ¢·´À¡
|
@param isAutoMatchJoin: ÊÇ·ñ×Ô¶¯Æ¥Åä¼ÓÈëµÄ
|
'''
|
if not tagTeam:
|
# ûÓжÓÎéµÄ»°ÏÈ´´½¨Ä¬È϶ÓÎé
|
tagTeam = DoCreateTeam(teamPlayer, tick, isSync=False)
|
if not tagTeam:
|
return
|
|
#===============================================================================================
|
# #ÊÇ·ñÓÐÊÕÈËȨÏÞ
|
# if not CheckTeamLV(teamPlayer):
|
# GameWorld.Log("Ä¿±êÍæ¼ÒÎÞÕÐÊÕ¶ÓԱȨÏÞ£¡")
|
# return
|
#===============================================================================================
|
|
#Åж϶ÓÎéÊÇ·ñÂúÈË
|
if tagTeam.IsTeamFull():
|
#GeRen_chenxin_227479 Ä¿±ê¶ÓÎéÒÑÂúÔ±£¡
|
if notifyPlayer:
|
PlayerControl.NotifyCode(notifyPlayer, "GeRen_chenxin_227479")
|
return
|
|
if tagTeam.GetMemberByID(joinPlayer.GetPlayerID()) != None:
|
GameWorld.Log("ÒѾÓÐÕâ¸öÈË£¬²»ÐèÒªÖØÐ¼ÓÈ룡")
|
return
|
|
#Íæ¼Ò±¾ÉíÓжÓÎéʱ
|
if joinPlayer.GetTeam():
|
#===========================================================================================
|
# 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))
|
tagTeam.AddMember(joinPlayer)
|
#UpdSceneTeamVersion(teamPlayer.GetMapID(), tick)
|
|
#tagTeam.Sync_TeamState()
|
Sync_TeamMemberInfo(tagTeam)
|
|
#Çå¿ÕÇëÇó
|
# PlayerRequest.DelRequest(curTagPlayer, curPlayer, requestType)
|
#֪ͨMapServerd¶ÓÎé±ä¸ü
|
#teamPlayer.MapServer_Sync_Team(__GetPlayerTeamLV(teamPlayer))
|
#joinPlayer.MapServer_Sync_Team(__GetPlayerTeamLV(joinPlayer))
|
SyncMapServerTeamInfo(tagTeam, "Join", {"teamPlayer":teamPlayer.GetPlayerID(), "joinPlayer":joinPlayer.GetPlayerID()})
|
|
#֪ͨ
|
#EnterProcession <%S%>¼ÓÈëÁ˶ÓÎ飡 ¸ÄΪ GeRen_chenxin_543685
|
#PlayerControl.NotifyCode(tagTeam, "GeRen_chenxin_543685", [joinPlayer.GetName()])
|
|
#°ÑÈ«¶ÓÈ˵ÄÐÅϢ֪ͨ¸øÕâ¸öÈË
|
#tagPlayerTeam.Sync_OtherTeamMemberInfoToCurPlayer(joinPlayer) # 09 14 ¿çµØÍ¼³ÉÔ±ÐÅÏ¢#tagTeamMemberState
|
#֪ͨÕâ¸öÈ˵ÄÐÅÏ¢¸øÈ«¶Ó
|
#joinPlayer.Sync_TeamMemberState() # 09 14 ¿çµØÍ¼³ÉÔ±ÐÅÏ¢#tagTeamMemberState
|
#joinPlayer.NotifyCode("TeamOK")
|
#teamPlayer.NotifyCode("TeamOK")
|
|
#´¦ÀíÆ¥Åä
|
if IsPlayerMatchingTeam(joinPlayer.GetPlayerID()):
|
if isAutoMatchJoin:
|
PlayerControl.NotifyCode(joinPlayer, "TeamMatchingSucceed")
|
DelPlayerIDFromMatchingList(joinPlayer)
|
if IsTeamMatchingPlayer(teamID):
|
if tagTeam.IsTeamFull():
|
if isAutoMatchJoin:
|
PlayerControl.NotifyCode(teamPlayer, "TeamMatchingSucceed")
|
DelTeamIDFromMatchingList(tagTeam)
|
else:
|
Sync_TeamMatchState(joinPlayer, True)
|
|
__DoLogic_PlayerTeamChange(joinPlayer)
|
return True
|
|
def __GetPlayerTeamLV(curPlayer):
|
##»ñµÃÍæ¼ÒÔÚ¶ÓÎéÖеÄȨÏ޵ȼ¶
|
curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
return IPY_GameServer.tmlMember
|
|
teamMember = curTeam.GetMemberByID(curPlayer.GetPlayerID())
|
return teamMember.GetTeamLV()
|
|
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 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.MapID = memPlayer.GetMapID()
|
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.PlayerID = player.GetPlayerID()
|
teamInfo.TeamID = teamID
|
teamInfo.TeamLV = teamLV
|
teamInfo.MemInfoList = memInfoList
|
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
|
|
#---------------------------------------------------------------------
|
|
#// B9 03 Ð޸ĶÓÎéÐÅÏ¢ #tagCGChangeTeamInfo
|
#
|
#struct tagCGChangeTeamInfo
|
#{
|
# tagHead Head;
|
# DWORD TagMapID; // Ä¿±êµØÍ¼
|
# WORD TagMapEx; // Ä¿±êµØÍ¼À©Õ¹
|
# WORD ReqMinLV; // ¶ÓÔ±×îµÍµÈ¼¶ÏÞÖÆ
|
# WORD ReqMaxLV; // ¶ÓÔ±×î¸ßµÈ¼¶ÏÞÖÆ
|
#};
|
def OnChangeTeamInfo(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
tagMapID = clientData.TagMapID
|
tagMapEx = clientData.TagMapEx
|
reqMinLV = clientData.ReqMinLV
|
reqMaxLV = clientData.ReqMaxLV
|
|
DoChangeTeamTagMap(curPlayer, curPlayer.GetTeam(), tagMapID, tagMapEx, reqMinLV, reqMaxLV)
|
return
|
|
def DoChangeTeamTagMap(curPlayer, curTeam, tagMapID=0, tagMapEx=0, reqMinLV=1, reqMaxLV=0):
|
playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
|
#curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
GameWorld.DebugLog("Íæ¼ÒûÓжÓÎ飬ÎÞ·¨Ð޸ĶÓÎéÐÅÏ¢£¡", playerID)
|
return
|
|
#Ñé֤ȨÏÞ
|
if curPlayer:
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader :
|
GameWorld.ErrLog("²»ÊǶӳ¤£¬ÎÞ·¨Ð޸ĶÓÎéÄ¿±ê! curPlayerTeamLv=%s" % (curPlayerTeamLv), playerID)
|
return
|
|
teamID = curTeam.GetTeamID()
|
#¶ÓÎé×Ô¶¯Æ¥ÅäÖУ¬ÎÞ·¨±ä¸ü¶ÓÎéÐÅÏ¢
|
if IsTeamMatchingPlayer(teamID):
|
GameWorld.Log("¶ÓÎé×Ô¶¯Æ¥ÅäÖУ¬ÎÞ·¨±ä¸ü¶ÓÎéÐÅÏ¢!teamID=%s" % teamID, playerID)
|
return
|
|
if tagMapID and not GameWorld.GetMap(tagMapID):
|
GameWorld.ErrLog("Ä¿±êµØÍ¼²»´æÔÚ£¬ÎÞ·¨±ä¸ü¶ÓÎéÐÅÏ¢!tagMapID=%s" % tagMapID, playerID)
|
return
|
|
if not reqMaxLV:
|
reqMaxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV")
|
|
curTeam.SetTagMapID(tagMapID)
|
curTeam.SetTagMapEx(tagMapEx)
|
curTeam.SetReqMinLV(reqMinLV)
|
curTeam.SetReqMaxLV(reqMaxLV)
|
GameWorld.DebugLog("Ð޸ĶÓÎéÐÅÏ¢: teamID=%s,tagMapID=%s,mapEx=%s,reqLV(%s~%s)"
|
% (teamID, tagMapID, tagMapEx, reqMinLV, reqMaxLV), playerID)
|
if tagMapID:
|
UpdateTeamTagMapTime(teamID, tagMapID, True)
|
#UpdSceneTeamVersion(curPlayer.GetMapID(), tick)
|
|
#֪ͨ¿Í»§¶Ë
|
teamInfoChange = ChPyNetSendPack.tagGCTeamInfoChange()
|
teamInfoChange.TagMapID = tagMapID
|
teamInfoChange.TagMapEx = tagMapEx
|
teamInfoChange.ReqMinLV = reqMinLV
|
teamInfoChange.ReqMaxLV = reqMaxLV
|
SendTeamFakePack(curTeam, teamInfoChange)
|
|
# ÐÞ¸ÄÄ¿±êµØÍ¼¶ÓÎéID×Öµä, ÏÈÒÆ³ý£¬ÔÙÌí¼Ó
|
DelTeamIDFromTagMapTeamDict(teamID)
|
AddTeamIDToTagMapTeamDict(teamID, tagMapID)
|
return True
|
|
def SendTeamFakePack(curTeam, sendPack, ignorePlayerID=0):
|
for i in xrange(curTeam.GetMemberCount()):
|
memberInfo = curTeam.GetMemberInfo(i)
|
playerID = memberInfo.GetPlayerID()
|
if not playerID or playerID == ignorePlayerID:
|
continue
|
memberPlayer = curTeam.GetMemberPlayer(i)
|
if not memberPlayer:
|
continue
|
if not memberPlayer.GetPlayerID():
|
continue
|
|
if PlayerControl.GetIsTJG(memberPlayer):
|
continue
|
|
NetPackCommon.SendFakePack(memberPlayer, sendPack)
|
return
|
|
#===============================================================================
|
# //09 02 ¶Ó³¤Ìß³öÍæ¼Ò#tagCLeaderKickPlayer
|
# tagCLeaderKickPlayer * GettagCLeaderKickPlayer();
|
#
|
# class IPY_CLeaderKickPlayer
|
# {
|
# public:
|
#
|
# int GetPlayerID();
|
# };
|
#===============================================================================
|
##¶Ó³¤Ìß³öÍæ¼Ò
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //09 02 ¶Ó³¤Ìß³öÍæ¼Ò#tagCLeaderKickPlayer
|
def LeaderKickPlayer(index, tick):
|
#»ñµÃ·â°ü
|
sendPack = IPY_GameServer.IPY_CLeaderKickPlayer()
|
#ÒªÌß³öµÄÍæ¼ÒID
|
tagPlayerID = sendPack.GetPlayerID()
|
__Func_LeaderKickPlayer(index, tagPlayerID, tick)
|
return
|
|
def __Func_LeaderKickPlayer(index, tagPlayerID, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curPlayerID = curPlayer.GetID()
|
|
#»ñµÃ¶ÓÎé
|
curTeam = curPlayer.GetTeam()
|
|
if curTeam == None:
|
GameWorld.ErrLog('¶Ó³¤Ìß³öÍæ¼Ò, Íæ¼ÒÎÞ¶ÓÎé, ÎÞ·¨ÌßÈË£¡', curPlayerID)
|
return
|
|
#---ÑéÖ¤³ÉÔ±ÊôÐÔ---
|
curMember = curTeam.GetMemberByID(tagPlayerID)
|
|
if curMember == None:
|
GameWorld.ErrLog('¶Ó³¤Ìß³öÍæ¼Ò, ¶ÓÎéÎÞ´ËÍæ¼Ò = %s' % (tagPlayerID), curPlayerID)
|
return
|
|
#²»ÔÊÐíÌß³ö×Ô¼º
|
if curPlayerID == tagPlayerID:
|
return
|
|
#Ñé֤ȨÏÞ
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader:
|
GameWorld.ErrLog('²»ÊǶӳ¤£¬ÎÞ·¨Ìß³öÍæ¼Ò£¡ curPlayerTeamLv = %s' % (curPlayerTeamLv), curPlayerID)
|
return
|
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
#---Ìß³öÍæ¼Ò, ÔÊÐíÌß³ö²»ÔÚÏßµÄÍæ¼Ò---
|
|
#LeaveProcession <%S%>À뿪Á˶ÓÎ飡
|
#PlayerControl.NotifyCode(curTeam, "LeaveProcession", [curMember.GetPlayerName()])
|
|
#---ÌßÈ˳ɹ¦, Ñé֤ʣÓà¶ÓÎéÇé¿ö---
|
curTeamID = curTeam.GetTeamID()
|
|
#µ±Ç°ÒѾÊǶÓÎé×îСÈËÊýÅäÖã¬ÌßÈ˺ó, ½âÉ¢µ±Ç°¶ÓÎé
|
if curTeam.GetTeamPlayerCount() <= ChConfig.Def_Team_MinPlayerCount:
|
GameWorld.DebugLog("¶Ó³¤Ìß³öÍæ¼Òºó, Òò¶ÓÎéÈËÊý²»×㣬×Ô¶¯½âÉ¢, ¶ÓÎéID = %s" % (curTeamID), curPlayerID)
|
DoDismissTeam(curTeam)
|
return
|
|
#Ê£ÓàÈËÊýÂú×ã¶ÓÎé×îµÍÈËÊýÒªÇó
|
GameWorld.Log('Ìß³öÍæ¼Ò³É¹¦£¡teamID=%s, tagPlayerID=%s' % (curTeamID, tagPlayerID), curPlayerID)
|
|
__DoLogic_PlayerLeaveTeam(tagPlayer, tagPlayerID, curTeam, ChConfig.Def_Team_Sync_LeaveMsg_OtherKick, tick)
|
|
#ÍÑ»úÍæ¼Ò±»Ìߣ¬Ôò¼Ç¼
|
if tagPlayer and PlayerControl.GetIsTJG(tagPlayer):
|
kickTeamIDList = PyGameData.g_tjgKickPlayerTeamDict.get(tagPlayerID, [])
|
if curTeamID not in kickTeamIDList:
|
kickTeamIDList.append(curTeamID)
|
PyGameData.g_tjgKickPlayerTeamDict[tagPlayerID] = kickTeamIDList
|
return
|
#---------------------------------------------------------------------
|
|
def __SetTeamLV(curTeamMember, teamLV, isNotify=True):
|
'''ÉèÖóÉÔ±¶ÓÎéµÈ¼¶
|
@param curTeamMember ¶ÓԱʵÀý
|
@param teamLV ¶ÓÎéȨÏ޵ȼ¶
|
@param isNotify ÊÇ·ñ¹ã²¥¶ÓÔ±
|
'''
|
|
curTeamMember.SetTeamLV(teamLV)
|
tagPlayer = curTeamMember.GetPlayer()
|
|
if tagPlayer == None:
|
return
|
|
#if notifyMapServer:
|
# tagPlayer.MapServer_Sync_Team(teamLV)
|
|
if isNotify:
|
if teamLV == IPY_GameServer.tmlLeader:
|
#<n STYLE="UNDERLINE" color="0,190,255">{%S1%}</n><n color="255,255,0">³ÉΪÁËеĶӳ¤!</n>
|
PlayerControl.NotifyCode(tagPlayer.GetTeam(), "InsteadHeader", [tagPlayer.GetName()])
|
|
elif teamLV == IPY_GameServer.tmlMemberCanCall:
|
#<n STYLE="UNDERLINE" color="0,190,255">{%S1%}</n><n color="255,255,0">±»¶Ó³¤¸³ÓèÁËÕÐÈËȨÏÞ!</n>
|
# EndowPopedom ¸ÄΪ GeRen_chenxin_76326
|
PlayerControl.NotifyCode(tagPlayer.GetTeam(), "GeRen_chenxin_76326", [tagPlayer.GetName()])
|
|
elif teamLV == IPY_GameServer.tmlMember:
|
#֪ͨ:</n><n color="0,190,255">{%S1%}</n><n color="255,255,0">±»¶Ó³¤ÊÕ»ØÁËÕÐÈËȨÏÞ
|
PlayerControl.NotifyCode(tagPlayer.GetTeam(), "WithdrawalPopedom", [tagPlayer.GetName()])
|
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //09 06 ¶Ó³¤¸³Óè¶ÓԱȨÏÞ/½»¸¶¶Ó³¤ #tagCTeamChangeMemberState
|
# tagCTeamChangeMemberState * GettagCTeamChangeMemberState();
|
# class IPY_CTeamChangeMemberState
|
# {
|
# public:
|
# //Ä¿±êÍæ¼Ò
|
# int GetPlayerID();
|
# //Íæ¼Ò¶ÓÎéµÈ¼¶TTeamMemberLV
|
# int GetMemberLV();
|
# };
|
#===============================================================================
|
##¶Ó³¤¸ø¶ÓԱȨÏÞ.
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //09 06 ¶Ó³¤¸³Óè¶ÓԱȨÏÞ/½»¸¶¶Ó³¤ #tagCTeamChangeMemberState
|
def TeamChangeMemberState(index, tick):
|
#»ñµÃ·â°ü
|
sendPack = IPY_GameServer.IPY_CTeamChangeMemberState()
|
tagPlayerID = sendPack.GetPlayerID()
|
memberLV = sendPack.GetMemberLV()
|
__Func_TeamChangeMemberState(index, tagPlayerID, memberLV, tick)
|
return
|
|
def __Func_TeamChangeMemberState(index, tagPlayerID, memberLV, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curPlayerID = curPlayer.GetID()
|
|
#---ÑéÖ¤Ìõ¼þ---
|
|
#²»ÄÜ×Ô¼º¸ø×Ô¼ºÈ¨ÏÞ
|
if curPlayerID == tagPlayerID:
|
return
|
|
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
|
|
if tagPlayer == None:
|
PlayerControl.NotifyCode(curPlayer, "Team_Header_TransferLost")
|
return
|
|
curTeam = curPlayer.GetTeam()
|
if not curTeam:
|
GameWorld.ErrLog("¶Ó³¤¸ø¶ÓԱȨÏÞ,Íæ¼ÒÎÞ¶ÓÎé", curPlayerID)
|
return
|
|
#Ñé֤ȨÏÞ
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader:
|
GameWorld.ErrLog("¶Ó³¤¸ø¶ÓԱȨÏÞ, Íæ¼Ò·Ç¶Ó³¤£¬È¨Ï޵ȼ¶²»×ã! curPlayerTeamLv=%s" % (curPlayerTeamLv), curPlayerID)
|
return
|
|
if not __CheckCanTeamComm(curPlayer, tagPlayer):
|
return
|
|
#»ñÈ¡¶ÓÔ±
|
packMember = curTeam.GetMemberByID(tagPlayerID)
|
if packMember == None:
|
GameWorld.ErrLog("¶Ó³¤¸ø¶ÓԱȨÏÞ, ¶ÓÔ±²»ÔڸöÓÎ飡 tagPlayerID=%s" % (tagPlayerID), curPlayerID)
|
return
|
|
teamID = curTeam.GetTeamID()
|
|
#---Ñé֤ͨ¹ý, ¸øÈ¨ÏÞ---
|
#¸ø¶Ó³¤(½«¶ÓÔ±ÉèÖÃΪ¶Ó³¤, ¶Ó³¤±ØÐëÏȽµ¼¶, ±ÜÃâÒ»¸ö¶ÓÎéÓÐ2¸ö¶Ó³¤)
|
if memberLV == IPY_GameServer.tmlLeader:
|
leadMember = curTeam.GetMemberByID(curPlayerID)
|
__SetTeamLV(leadMember, IPY_GameServer.tmlMember, False)
|
__SetTeamLV(packMember, IPY_GameServer.tmlLeader)
|
|
# ÒÆ³ý¾É¶Ó³¤ËùÔÚ³¡¾°¶ÓÎ飬Ìí¼Óжӳ¤ËùÔÚ³¡¾°
|
DelTeamIDFromSceneList(teamID, tick)
|
AddTeamIDToSceneList(teamID, tagPlayer.GetMapID(), tick)
|
|
#¸øÕÐÈËȨÏÞ
|
elif memberLV == IPY_GameServer.tmlMemberCanCall:
|
#½«¶ÓÔ±ÉèÖÃΪӵÓÐÕÐÈËȨÏÞ
|
__SetTeamLV(packMember, memberLV)
|
#GeRen_chenxin_612029 ÄúÓÐÁËÕÐÊÕжÓÎé³ÉÔ±µÄȨÀû£¡
|
PlayerControl.NotifyCode(tagPlayer, "GeRen_chenxin_612029")
|
|
#¸øÆÕͨ¶ÓԱȨÏÞ
|
else:
|
__SetTeamLV(packMember, IPY_GameServer.tmlMember)
|
|
#֪ͨ¿Í»§¶Ë¶ÓÎé³ÉÔ±ÊôÐÔ±ä¸ü
|
#curTeam.Sync_TeamState()
|
Sync_TeamMemberInfo(curTeam)
|
SyncMapServerTeamInfo(curTeam, "ChangeMemTeamLV", {"tagPlayerID":tagPlayerID, "memberLV":memberLV})
|
return
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //09 07 À뿪¶ÓÎé#tagCLeaveTeam
|
# static tagCLeaveTeam g_tagCLeaveTeam;
|
#
|
# tagCLeaveTeam * GettagCLeaveTeam()
|
# {
|
# return &g_tagCLeaveTeam;
|
# }
|
#
|
# int IPY_CLeaveTeam::GetType()
|
# {
|
# return GettagCLeaveTeam()->Type;
|
# }
|
#===============================================================================
|
##À뿪¶ÓÎé
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks //09 07 À뿪¶ÓÎé#tagCLeaveTeam
|
def LeaveTeam(index, tick):
|
#µ±Ç°Íæ¼Ò
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#µ±Ç°Íæ¼ÒID
|
curPlayerID = curPlayer.GetID()
|
|
#ÊÇ·ñÓжÓÎé
|
curTeam = curPlayer.GetTeam()
|
|
if curTeam == None:
|
GameWorld.ErrLog("À뿪¶ÓÎéÒì³£, Íæ¼ÒÎÞ¶ÓÎé", curPlayerID)
|
return
|
|
if not __CheckCanTeamComm(curPlayer):
|
return
|
|
DoPlayerLeaveTeam(curPlayer, curTeam, tick)
|
return
|
|
def DoPlayerLeaveTeam(curPlayer, curTeam, tick):
|
#µ±Ç°Íæ¼ÒID
|
curPlayerID = curPlayer.GetID()
|
teamID = curTeam.GetTeamID()
|
|
#---¶ÓÎéÈËÊý²»×ã---
|
|
#µ±Ç°ÒѾÊǶÓÎé×îСÈËÊýÅäÖã¬ÌßÈ˺ó, ½âÉ¢µ±Ç°¶ÓÎé
|
if curTeam.GetTeamPlayerCount() <= ChConfig.Def_Team_MinPlayerCount:
|
GameWorld.DebugLog("À뿪¶ÓÎ飬Òò¶ÓÎéÈËÊý²»×㣬½âÉ¢¶ÓÎé teamID= %s" % (teamID), curPlayerID)
|
DoDismissTeam(curTeam)
|
return
|
|
#---¶ÓÎ黹ÄܳÉÁ¢---
|
GameWorld.DebugLog("Íæ¼ÒÀ뿪¶ÓÎé: teamID=%s" % teamID, curPlayerID)
|
|
#»ñµÃÍæ¼ÒÔÚ¶ÓÎéÖеÄʵÀý
|
teamMember = curTeam.GetMemberByID(curPlayerID)
|
|
#¶Ó³¤Àë¶Ó, ֪ͨ¶ÓԱеĶӳ¤ÉÏÈÎË¢ÐÂ
|
if teamMember.GetTeamLV() == IPY_GameServer.tmlLeader :
|
#¶Ó³¤Àë¶Ó, ÏÈÉèÖÃΪÆÕͨ¶ÓÔ±, ±ÜÃâ½»½Óºó, ÓÐ2¸ö¶Ó³¤
|
__SetTeamLV(teamMember, IPY_GameServer.tmlMember, False)
|
|
newLeader = __DoSetNewLeader(curTeam, curPlayerID)
|
if newLeader:
|
DelTeamIDFromSceneList(teamID, tick)
|
AddTeamIDToSceneList(teamID, newLeader.GetMapID(), tick)
|
|
#Àë¶ÓϵͳÌáʾ
|
#LeaveProcession <%S%>À뿪Á˶ÓÎ飡
|
#PlayerControl.NotifyCode(curTeam, "LeaveProcession", [curPlayer.GetName()])
|
|
#AlreadyLeave to GeRen_chenxin_498155
|
#GeRen_chenxin_498155 ÄúÒѾÀ뿪Á˶ÓÎ飡
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_498155")
|
#À뿪¶ÓÎé
|
__DoLogic_PlayerLeaveTeam(curPlayer, curPlayer.GetID(), curTeam, ChConfig.Def_Team_Sync_LeaveMsg_Self, tick)
|
return
|
|
def __DoSetNewLeader(curTeam, oldLeaderID):
|
'''ÓÉÓÚijЩÔÒòÐèÒª×ªÒÆ¶Ó³¤£¬Èç¶Ó³¤ÏÂÏß¡¢¶Ó³¤Àë¶ÓµÈ
|
ĿǰĬÈÏ×ªÒÆ¸øÔÚÏßµÄÏÂÒ»Ãû¶ÓÔ±
|
@return: жӳ¤playerʵÀý
|
'''
|
|
for i in xrange(curTeam.GetMemberCount()):
|
curMemberPlayer = curTeam.GetMemberPlayer(i)
|
curMemberInfo = curTeam.GetMemberInfo(i)
|
#¹ýÂ˲»ÔÚÏߵijÉÔ±
|
if curMemberPlayer == None or curMemberPlayer.GetPlayerID() == 0:
|
continue
|
|
#¹ýÂË֮ǰµÄ¶Ó³¤
|
if curMemberInfo.GetPlayerID() == oldLeaderID:
|
continue
|
|
#ÉèÖÃжӳ¤, ÔÚÕâ¸öÀïÃæ»á֪ͨMapServer
|
__SetTeamLV(curMemberInfo, IPY_GameServer.tmlLeader)
|
GameWorld.DebugLog("ϵͳÉèÖöÓÎéжӳ¤: teamID=%s,oldLeaderID=%s,newLeaderID=%s"
|
% (curTeam.GetTeamID(), curMemberPlayer.GetPlayerID(), oldLeaderID))
|
return curMemberPlayer
|
return
|
|
#---------------------------------------------------------------------
|
def __DoLogic_PlayerLeaveTeam(delPlayer, delPlayerID, curTeam, msg, tick):
|
##ÔÚÏßÍæ¼ÒÀë¶Ó
|
# @param delPlayer ɾ³ýÍæ¼ÒʵÀý(ÓпÉÄÜΪ¿Õ)
|
# @param delPlayerID ɾ³ýÍæ¼ÒID
|
# @param curTeam ¶ÓÎéʵÀý
|
# @param msg ×Ô¼ºÀ뿪Ϊ0, ±»ÈËÌß³öΪ1
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ÔÚÏßÍæ¼ÒÀë¶Ó
|
#֪ͨ¿Í»§¶Ë, Õâ¸ö±ØÐëÏÈ֪ͨ
|
|
curTeam.Sync_LeaveTeam(delPlayerID, msg) # //09 06 Íæ¼ÒÀ뿪¶ÓÎéµÄÏûÏ¢#tagPlayerLeaveTeamMsg
|
|
#GameServerɾ³ý¶ÓÔ±
|
curTeam.DeleteMember(delPlayerID)
|
|
#leaderPlayer = GetTeamLeader(curTeam)
|
#UpdSceneTeamVersion(leaderPlayer.GetMapID(), tick)
|
|
#ÒÔÏÂÂß¼Ö»¶ÔÔÚÏßÍæ¼Ò´¦Àí
|
if delPlayer != None:
|
SetTeamMemberPrepareState(delPlayer, TeamMemPrepareState_LeaveTeam, tick)
|
#GameServerÇå³ýÍæ¼Ò¶ÓÎéIDΪ¿Õ
|
delPlayer.SetTeam(None)
|
#֪ͨMapServerd¶ÓÎé±ä¸ü, ÔÚmapserver¹¹½¨Ä¿Ç°¶ÓÎé
|
#delPlayer.MapServer_Sync_Team(0)
|
SyncMapServerPlayerLeaveTeam(delPlayer, curTeam.GetTeamID())
|
#Íæ¼ÒÀ뿪¸±±¾
|
delPlayer.MapServer_LeaveFB()
|
if IsTeamMatchingPlayer(curTeam.GetTeamID()):
|
Sync_TeamMatchState(delPlayer, False)
|
__DoLogic_PlayerTeamChange(delPlayer)
|
|
#¹ã²¥¶ÓÎéË¢ÐÂ
|
#curTeam.Sync_TeamState()
|
Sync_TeamMemberInfo(curTeam)
|
SyncMapServerTeamInfo(curTeam, "Leave", {"delPlayerID":delPlayerID, "msg":msg})
|
|
#ÎÞÈËÔÚÏß
|
if curTeam.GetTeamPlayerCount() <= 0:
|
isTeamEmpty = True
|
for i in xrange(curTeam.GetMemberCount()):
|
memberInfo = curTeam.GetMemberInfo(i)
|
if memberInfo.GetPlayerID():
|
isTeamEmpty = False
|
break
|
if isTeamEmpty:
|
# ¶ÓÎéΪ¿Õ£¬ËµÃ÷ËùÓжÓÔ±¶¼ÏÂÏß³¬¹ýÀë¶Ó±£»¤Ê±¼äÁË£¬¶ÓÎé¿É½âɢɾ³ý
|
#GameWorld.DebugLog("Íæ¼ÒÀë¶Óºó£¬ÎÞ¶ÓÔ±ÔÚÏßÇÒ¶ÓÎéΪ¿Õ£¬Ôòɾ³ý¶ÓÎ飡teamID=%s" % curTeam.GetTeamID())
|
DeleteTeam(curTeam, tick)
|
return
|
|
def __DoLogic_PlayerTeamChange(curPlayer):
|
'''Íæ¼Ò¶ÓÎé±ä¸üͨÓô¦Àí£¬ Í˳öºÍ¼ÓÈëµÄͳһÂß¼
|
'''
|
#GameWorld.DebugLog("Íæ¼Ò¶ÓÎé±ä¸üͨÓô¦Àí,curTeamID=%s" % curPlayer.GetTeamID())
|
GameWorldBoss.OnPlayerTeamChange(curPlayer)
|
PlayerAssist.OnPlayerTeamChange(curPlayer)
|
return
|
|
#---------------------------------------------------------------------
|
def DoDismissTeam(curTeam):
|
##½âÉ¢¶ÓÎé
|
|
if not curTeam:
|
return
|
|
for i in xrange(curTeam.GetMemberCount()):
|
curMember = curTeam.GetMemberInfo(i)
|
curPlayer = curMember.GetPlayer()
|
#²»ÔÚÏßÍæ¼Ò
|
if curPlayer == None:
|
continue
|
|
#AlreadyLeave to GeRen_chenxin_498155
|
#ϵͳÌáʾ, GeRen_chenxin_498155 ÄãÒѾÀ뿪Á˶ÓÎé!
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_498155")
|
|
#GameServerÍæ¼Ò¶ÓÎéΪ¿Õ
|
curPlayer.SetTeam(None)
|
#֪ͨMapServerd¶ÓÎé±ä¸ü
|
#curPlayer.MapServer_Sync_Team(0)
|
SyncMapServerPlayerLeaveTeam(curPlayer, curTeam.GetTeamID())
|
__DoLogic_PlayerTeamChange(curPlayer)
|
|
if curMember.GetTeamLV() != IPY_GameServer.tmlLeader:
|
#·Ç¶Ó³¤ÈËԱȫ²¿À뿪¸±±¾
|
curPlayer.MapServer_LeaveFB()
|
#ɾ³ý¶ÓÎé
|
DeleteTeam(curTeam, GameWorld.GetGameWorld().GetTick())
|
return True
|
|
def DeleteTeam(curTeam, tick):
|
teamID = curTeam.GetTeamID()
|
DelTeamIDFromSceneList(teamID, tick)
|
DelTeamIDFromTagMapTeamDict(teamID)
|
DelTeamIDFromMatchingList(curTeam)
|
if teamID in PyGameData.g_teamFBEnterAskDict:
|
PyGameData.g_teamFBEnterAskDict.pop(teamID)
|
if teamID in PyGameData.g_prepareTeamDict:
|
PyGameData.g_prepareTeamDict.pop(teamID)
|
#Õâ¾ä»°ÖÐ, »áÇå³ýËùÓжÓÎé³ÉÔ±, ɾ³ýË÷Òý
|
#ËùÒÔ±ØÐë·ÅÔÚ×îºóÒ»¾ä
|
#2009.10.10
|
#bug:
|
#Sync_DismissTeam »áÇå¿ÕTeamID, µ¼ÖÂɾ³ý²»Á˶ÓÎé
|
curTeam.Sync_DismissTeam() # //09 05 ½âÉ¢¶ÓÎé#tagTeamClear
|
GameWorld.GetTeamManager().DeleteTeam(teamID) # ×îºóÕæÊµÉ¾³ý¶ÓÎéID
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //09 08 ½âÉ¢¶ÓÎé#tagCDismissTeam
|
# static tagCDismissTeam g_tagCDismissTeam;
|
#
|
# tagCDismissTeam * GettagCDismissTeam()
|
# {
|
# return &g_tagCDismissTeam;
|
# }
|
#
|
# int IPY_CDismissTeam::GetType()
|
# {
|
# return GettagCDismissTeam()->Type;
|
# }
|
#===============================================================================
|
##½âÉ¢¶ÓÎé.
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //09 08 ½âÉ¢¶ÓÎé#tagCDismissTeam
|
def DismissTeam(index, tick):
|
GameWorld.GetPsycoFunc(__Func_DismissTeam)(index, tick)
|
return
|
|
def __Func_DismissTeam(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curPlayerID = curPlayer.GetID()
|
|
curTeam = curPlayer.GetTeam()
|
|
if curTeam == None:
|
GameWorld.DebugLog('½âÉ¢¶ÓÎéÒì³£, Íæ¼ÒÎÞ¶ÓÎé', curPlayerID)
|
return
|
|
#Ñé֤ȨÏÞ
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader :
|
GameWorld.DebugLog("½âÉ¢¶ÓÎéÒì³£, ²»ÊǶӳ¤£¬ÎÞ·¨½âÉ¢£¡curPlayerTeamLv=%s" % (curPlayerTeamLv), curPlayerID)
|
return
|
|
if not __CheckCanTeamComm(curPlayer):
|
return
|
|
#½âÉ¢¶ÓÎé
|
DoDismissTeam(curTeam)
|
return
|
#---------------------------------------------------------------------
|
|
def GetTeamLeader(destTeam):
|
##»ñµÃ¶Ó³¤ÊµÀý
|
|
for index in xrange(destTeam.GetMemberCount()):
|
curMember = destTeam.GetMemberPlayer(index)
|
if not curMember or not curMember.GetPlayerID():
|
continue
|
|
curMemberInfo = destTeam.GetMemberInfo(index)
|
if curMemberInfo.GetTeamLV() != IPY_GameServer.tmlLeader:
|
continue
|
|
return curMemberInfo.GetPlayer()
|
|
return None
|
|
def CheckTeamLV(curPlayer):
|
##¼ì²é¶ÓÎéÊÇ·ñÓÐÊÕÈËȨÏÞ
|
teamLV = __GetPlayerTeamLV(curPlayer)
|
return (teamLV == IPY_GameServer.tmlMemberCanCall or
|
teamLV == IPY_GameServer.tmlLeader)
|
|
def CheckTeamOnLineCount(curTeam, includeTJG=True):
|
##»ñµÃ¶ÓÎéÊ£ÓàÔÚÏßÈËÊý
|
if not curTeam:
|
return 0
|
count = 0
|
for i in xrange(curTeam.GetMemberCount()):
|
curPlayer = curTeam.GetMemberPlayer(i)
|
if curPlayer == None:
|
continue
|
if not includeTJG and PlayerControl.GetIsTJG(curPlayer):
|
continue
|
count += 1
|
return count
|
|
#===============================================================================
|
#// B9 05 ²éÑ¯ÍÆ¼ö×é¶ÓµÄ¸½½üÍæ¼Ò #tagCGQueryRecommendNearbyPlayer
|
#
|
#struct tagCGQueryRecommendNearbyPlayer
|
#{
|
# tagHead Head;
|
#};
|
def OnQueryRecommendNearbyPlayer(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_QueryRecommendNearbyKey, tick):
|
GameWorld.DebugLog("¸½½üÍæ¼Ò²éѯ¼ä¸ôδµ½...")
|
return
|
|
mapID = curPlayer.GetMapID()
|
curPlayerID = curPlayer.GetPlayerID()
|
|
Def_SyncPlayerCount = 20 # ͬ²½¸ø¿Í»§¶ËµÄ¶ÓÎéÊý, ÕâÀïÔÝÓɳÌÐò¿ØÖÆÐ´ËÀ
|
|
playerMgr = GameWorld.GetPlayerManager()
|
|
scenePlayerIDDict = GetScenePlayerIDDict()
|
scenePlayerIDList = copy.deepcopy(scenePlayerIDDict.get(mapID, []))
|
# ³¡¾°¶ÓÎéÊý³¬¹ýͬ²½µÄ¸öÊý²Å½øÐÐÅÅÐò£¬·ñÔòÖ±½Óͬ²½¸ø¿Í»§¶Ë£¬Óɿͻ§¶Ë×ÔÐÐÅÅÐò
|
if len(scenePlayerIDList) > Def_SyncPlayerCount:
|
playerIDSortList = []
|
curPlayerLV = curPlayer.GetLV()
|
for playerID in scenePlayerIDList:
|
if playerID == curPlayerID:
|
continue
|
player = playerMgr.FindPlayerByID(playerID)
|
if not player:
|
continue
|
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() # µÈ¼¶²î¾ø¶ÔÖµÉýÐòÅÅ£¬ ¾ø¶ÔÖµÏàͬµÄµÈ¼¶¸ßµÄÅÅÇ°Ãæ
|
scenePlayerIDList = [teamInfo[2] for teamInfo in playerIDSortList]
|
|
# ͬ²½¿Í»§¶Ë
|
nearbyPlayerInfo = ChPyNetSendPack.tagGCRecommendNearbyPlayerList()
|
nearbyPlayerInfo.PlayerList = []
|
count = 0
|
for playerID in scenePlayerIDList:
|
if count >= Def_SyncPlayerCount:
|
break
|
if playerID == curPlayerID:
|
continue
|
player = playerMgr.FindPlayerByID(playerID)
|
if not player:
|
continue
|
if PlayerControl.GetIsTJG(player):
|
continue
|
if not __CheckCanTeamComm(player):
|
continue
|
#if player.GetTeamID():
|
# # ÓжÓÎéµÄ²»ÍƼö
|
# continue
|
count += 1
|
nearbyPlayer = ChPyNetSendPack.tagGCRecommendNearbyPlayer()
|
nearbyPlayer.PlayerID = playerID
|
nearbyPlayer.Name = player.GetName()
|
nearbyPlayer.NameLen = len(nearbyPlayer.Name)
|
nearbyPlayer.LV = player.GetLV()
|
nearbyPlayer.Job = player.GetJob()
|
nearbyPlayer.RealmLV = player.GetOfficialRank()
|
nearbyPlayerInfo.PlayerList.append(nearbyPlayer)
|
|
playerCount = len(nearbyPlayerInfo.PlayerList)
|
nearbyPlayerInfo.PlayerCount = playerCount
|
NetPackCommon.SendFakePack(curPlayer, nearbyPlayerInfo)
|
GameWorld.DebugLog("ͬ²½¸ø¿Í»§¶Ë³¡¾°¸½½üÍæ¼ÒÊý: mapID=%s,playerCount=%s,scenePlayerIDList=%s"
|
% (mapID, playerCount, scenePlayerIDList), curPlayerID)
|
return
|
|
# //09 0Bˢг¡¾°¶ÓÎé#tagCRefreshSceneTeam
|
# //ÐèÒª·þÎñ¶Ë»ØÓ¦¶ÔÐÔÄÜÒª±È½Ï´óµÄÓ°Ïì
|
# structtagCRefreshSceneTeam
|
# {
|
# tagHead Head;
|
# };
|
#===============================================================================
|
##×é¶Ó²éѯ.
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦
|
def RefreshSceneTeam(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
|
if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_QueryTeamInfoKey, tick):
|
GameWorld.DebugLog("ˢг¡¾°¶ÓÎéʱ¼ä¼ä¸ôδµ½...")
|
return
|
|
#curTeamID = curPlayer.GetTeamID()
|
mapID = curPlayer.GetMapID()
|
playerID = curPlayer.GetPlayerID()
|
#ÔÝʱ²»×ö²éѯ°æ±¾ÏÞÖÆ
|
# lastQueryVersionDict = PyGameData.g_sceneTeamQueryVersion.get(playerID, {})
|
# lastQueryVersion = lastQueryVersionDict.get(mapID, -1)
|
# sceneTeamVersion = PyGameData.g_sceneTeamServerVersion.get(mapID, 0)
|
# if lastQueryVersion == sceneTeamVersion:
|
# GameWorld.DebugLog("Íæ¼ÒÒÑ»ñµÃ·þÎñÆ÷×îг¡¾°¶ÓÎé°æ±¾!sceneTeamVersion=%s" % sceneTeamVersion, curPlayer.GetPlayerID())
|
# return
|
# lastQueryVersionDict[mapID] = sceneTeamVersion
|
# PyGameData.g_sceneTeamQueryVersion[playerID] = lastQueryVersionDict
|
|
Def_SyncTeamCount = 20 # ͬ²½¸ø¿Í»§¶ËµÄ¶ÓÎéÊý, ÕâÀïÔÝÓɳÌÐò¿ØÖÆÐ´ËÀ
|
|
sceneTeamDict = GetSceneTeamIDDict()
|
sceneTeamIDList = sceneTeamDict.get(mapID, [])
|
teamMgr = GameWorld.GetTeamManager()
|
# ³¡¾°¶ÓÎéÊý³¬¹ýͬ²½µÄ¸öÊý²Å½øÐÐÅÅÐò£¬·ñÔòÖ±½Óͬ²½¸ø¿Í»§¶Ë£¬Óɿͻ§¶Ë×ÔÐÐÅÅÐò
|
if len(sceneTeamIDList) > Def_SyncTeamCount:
|
fullTeamIDList = []
|
otherTeamIDList = []
|
for teamID in sceneTeamIDList:
|
#if teamID == curTeamID: # ²»Í¬²½×Ô¼º¶ÓÎé
|
# continue
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
memberCount = team.GetMemberCount()
|
if memberCount >= ChConfig.Def_Team_MaxPlayerCount:
|
fullTeamIDList.append([memberCount, teamID])
|
else:
|
otherTeamIDList.append([memberCount, teamID])
|
otherTeamIDList.sort(reverse=True) # δÂúÔ±µÄ¶ÓÎéµ¹ÐòÅÅ
|
sceneTeamIDSortList = otherTeamIDList + fullTeamIDList # δÂúÔ±µ¹ÐòÅÅ£¬ÂúÔ±µÄ²åÔÚ¶ÓÁкóÃæ
|
sceneTeamIDList = [teamInfo[1] for teamInfo in sceneTeamIDSortList]
|
|
# ͬ²½¿Í»§¶Ë
|
sceneTeamInfo = ChPyNetSendPack.tagGCSceneTeamRefresh()
|
sceneTeamInfo.SceneTeamList = []
|
count = 0
|
for teamID in sceneTeamIDList:
|
if count >= Def_SyncTeamCount:
|
break
|
#if teamID == curTeamID: # ²»Í¬²½×Ô¼º¶ÓÎé
|
# continue
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
leader = GetTeamLeader(team)
|
if not leader:
|
continue
|
count += 1
|
sceneTeam = ChPyNetSendPack.tagGCSceneTeam()
|
sceneTeam.PlayerID = leader.GetPlayerID()
|
sceneTeam.PlayerName = leader.GetName()
|
sceneTeam.NameLen = len(sceneTeam.PlayerName)
|
sceneTeam.LV = leader.GetLV()
|
sceneTeam.Job = leader.GetJob()
|
sceneTeam.RealmLV = leader.GetOfficialRank()
|
sceneTeam.MemberCount = team.GetTeamPlayerCount()
|
sceneTeam.TagMapID = team.GetTagMapID()
|
sceneTeam.TagMapEx = team.GetTagMapEx()
|
sceneTeam.ReqMinLV = team.GetReqMinLV()
|
sceneTeam.ReqMaxLV = team.GetReqMaxLV()
|
sceneTeamInfo.SceneTeamList.append(sceneTeam)
|
teamCount = len(sceneTeamInfo.SceneTeamList)
|
sceneTeamInfo.TeamCount = teamCount
|
NetPackCommon.SendFakePack(curPlayer, sceneTeamInfo)
|
GameWorld.DebugLog("ͬ²½¸ø¿Í»§¶Ë³¡¾°¶ÓÎéÊý: mapID=%s,teamCount=%s,sceneTeamIDList=%s"
|
% (mapID, teamCount, sceneTeamIDList), playerID)
|
return
|
|
#---------------------------------------------------------------------
|
|
def OnServerClose(tick):
|
#GameWorld.DebugLog("¹Ø·þǰ¶ÓÎé´¦Àí£¡")
|
teamMgr = GameWorld.GetTeamManager()
|
for playerID, leaveTeamInfo in PyGameData.g_countdownLeaveTeamDict.items():
|
teamID, leaveServerTick = leaveTeamInfo
|
team = teamMgr.FindTeam(teamID)
|
if team:
|
#GameWorld.DebugLog(" ¹Ø·þÍæ¼ÒÇ¿ÖÆÀë¶Ó: playerID=%s,teamID=%s" % (playerID, teamID))
|
__DoLogic_PlayerLeaveTeam(None, playerID, team, ChConfig.Def_Team_Sync_LeaveMsg_Self, tick)
|
|
return
|
|
def DoCountdownLeaveTeamLogic(tick):
|
## ÏÂÏߺ󵹼ÆÊ±Àë¶Ó´¦Àí, ÿ·ÖÖÓ´¦ÀíÒ»´Î
|
#GameWorld.DebugLog("ÏÂÏߺ󵹼ÆÊ±Àë¶Ó´¦Àí: %s" % PyGameData.g_countdownLeaveTeamDict)
|
teamMgr = GameWorld.GetTeamManager()
|
for playerID, leaveTeamInfo in PyGameData.g_countdownLeaveTeamDict.items():
|
teamID, leaveServerTick = leaveTeamInfo
|
if tick - leaveServerTick < ChConfig.Def_CountdownLeaveTeamTime:
|
continue
|
PyGameData.g_countdownLeaveTeamDict.pop(playerID)
|
team = teamMgr.FindTeam(teamID)
|
if team:
|
#GameWorld.DebugLog(" Íæ¼ÒÏÂÏßʱ³¤³¬¹ýÀë¶Ó±£»¤Ê±¼ä£¬ÏµÍ³½«ÆäÀë¶Ó: playerID=%s,teamID=%s" % (playerID, teamID))
|
__DoLogic_PlayerLeaveTeam(None, playerID, team, ChConfig.Def_Team_Sync_LeaveMsg_Self, tick)
|
|
ResetTeamTagMapByTime()
|
return
|
|
|
def DoPlayerLogOffTeamLogic(curPlayer, tick):
|
##×é¶ÓÍæ¼ÒÏÂÏßÂß¼
|
|
playerID = curPlayer.GetPlayerID()
|
DelPlayerIDFromSceneList(playerID)
|
DelPlayerIDFromMatchingList(curPlayer)
|
|
# ÒÆ³ýÌßÍÑ»úÍæ¼Ò¶ÓÎéÁбí
|
if playerID in PyGameData.g_tjgKickPlayerTeamDict:
|
PyGameData.g_tjgKickPlayerTeamDict.pop(playerID)
|
|
curTeam = curPlayer.GetTeam()
|
#ÎÞ¶ÓÎé
|
if curTeam == None:
|
return
|
|
curTeamID = curPlayer.GetTeamID()
|
mapID = curPlayer.GetMapID()
|
isTJG = PlayerControl.GetIsTJG(curPlayer)
|
|
GameWorld.DebugLog("Ö´ÐÐÍæ¼ÒÏÂÏß¶ÓÎéÂß¼!curTeamID=%s,isTJG=%s,mapID=%s,tick=%s" % (curTeamID, isTJG, mapID, tick), playerID)
|
PyGameData.g_countdownLeaveTeamDict[playerID] = [curTeamID, tick]
|
#GameWorld.DebugLog(" PyGameData.g_countdownLeaveTeamDict=%s" % PyGameData.g_countdownLeaveTeamDict)
|
|
#===============================================================================================
|
# if curTeam.GetTeamPlayerCount() <= 1:
|
# GameWorld.Log("Íæ¼ÒÏÂÏߣ¬¶ÓÎéÖ»ÓÐ×Ô¼ºÒ»ÈË£¬½âÉ¢¶ÓÎ飡", playerID)
|
# DoDismissTeam(curTeam)
|
# return
|
#===============================================================================================
|
if not PlayerControl.GetIsTJG(curPlayer):
|
#¸æË߿ͻ§¶Ë¶ÓÎé³ÉÔ±ÏÂÏß
|
curPlayer.Sync_TeamMemberDisconnect() # 09 12 ¶ÓÎé³ÉÔ±ÉÏÏß/ÏÂÏß#tagTeamMemberLoginInfo
|
curTeamMember = curTeam.GetMemberByID(playerID)
|
curTeamMember.SetPlayer(None)
|
|
SetTeamMemberPrepareState(curPlayer, TeamMemPrepareState_Offline, tick)
|
|
#¶Ó³¤ÏÂÏß
|
if curTeamMember.GetTeamLV() == IPY_GameServer.tmlLeader:
|
__SetTeamLV(curTeamMember, IPY_GameServer.tmlMember)
|
|
newLeader = __DoSetNewLeader(curTeam, playerID)
|
if newLeader:
|
#newLeader.MapServer_Sync_Team(IPY_GameServer.tmlLeader)
|
#curTeam.Sync_TeamState()
|
DelTeamIDFromSceneList(curTeamID, tick)
|
AddTeamIDToSceneList(curTeamID, newLeader.GetMapID(), tick)
|
Sync_TeamMemberInfo(curTeam)
|
else:
|
DelTeamIDFromSceneList(curTeamID, GameWorld.GetGameWorld().GetTick())
|
DelTeamIDFromTagMapTeamDict(curTeamID)
|
DelTeamIDFromMatchingList(curTeam)
|
|
SyncMapServerTeamInfo(curTeam, "LogOff", {"playerID":playerID})
|
return
|
|
def OnPlayerLoginRefreshTeam(curPlayer, tick):
|
##Íæ¼ÒµÇ½ˢÐÂ×é¶Ó״̬
|
# @remarks Íæ¼ÒµÇ¼ˢжÓÎé Íæ¼Ò¸ÕµÇ¼, ¾Í±ØÐëÒªSetTeam, ÒòΪÅж¨Íæ¼ÒÓÐûÓжÓÎé, ÊÇÓÃGetTeamÅж¨µÄ
|
|
playerID = curPlayer.GetPlayerID()
|
curTeamID = curPlayer.GetTeamID()
|
GameWorld.DebugLog("Ö´ÐÐÍæ¼ÒÉÏÏß¶ÓÎéÂß¼!curTeamID=%s" % curTeamID, playerID)
|
AddPlayerIDToSceneList(playerID, curPlayer.GetMapID())
|
|
# ÒÆ³öÏÂÏßÑÓ³ÙÀë¶Ó
|
if playerID in PyGameData.g_countdownLeaveTeamDict:
|
PyGameData.g_countdownLeaveTeamDict.pop(playerID)
|
|
if curTeamID == 0:
|
#ÕâÀï²»ÄܺͼÒ×åÒ»Ñù²¹¾È
|
#ÒòΪ×é¶Ó×î´ó6ÈË, Èç¹û²¹¾ÈÁË, ¿ÉÄܳöÏÖ7È˵ÄÇé¿ö
|
#ÓÚ2009.8.28³¢ÊÔÔٴβ¹¾È
|
#ÀíÂÛÉϲ»»á³öÏÖ7È˶ÓÎé
|
curTeamMember = GameWorld.GetTeamManager().FindTeamMemberIndex(playerID)
|
if curTeamMember == None:
|
return
|
curTeamID = curTeamMember.GetTeamID()
|
|
curTeam = GameWorld.GetTeamManager().FindTeam(curTeamID)
|
if curTeam == None:
|
return
|
|
#ÔÊÐí´æÔÚµ¥È˶ÓÎ飬ÔÝÆÁ±Î¸ÃÂß¼
|
# if curTeam.GetTeamPlayerCount() <= 1:
|
# #²¹¾ÈÍê±Ï, ¶ÓÎéÖÐÖ»ÓÐÒ»¸öÈË, ɾ³ýÕâ¸ö¶ÓÎé
|
# GameWorld.Log('Íæ¼Ò(%s)ÈÔÈ»ÓжÓÎé(%s), ²¹¾ÈÍê±Ï, ¶ÓÎéÖÐÖ»ÓÐÒ»¸öÈË, ɾ³ýÕâ¸ö¶ÓÎé' % (playerID, curTeamID))
|
# DeleteTeam(curTeam, tick)
|
# return
|
|
GameWorld.Log('Íæ¼Ò(%s)ÈÔÈ»ÓжÓÎé(%s), ²¹¾È' % (playerID, curTeamID))
|
curPlayer.SetTeamID(curTeamID)
|
|
curTeam = GameWorld.GetTeamManager().FindTeam(curTeamID)
|
if curTeam == None or curTeam.GetMemberByID(playerID) == None:
|
#Íæ¼ÒÒѾÀ뿪¶ÓÎéÁË
|
curPlayer.SetTeam(None)
|
curPlayer.Sync_LeaveTeam(1)
|
#֪ͨMapServer, Íæ¼ÒÒѾ¶ÓÎéÁË, Ë¢ÐÂÍæ¼ÒµÄTeamID
|
#curPlayer.MapServer_Sync_Team(0)
|
SyncMapServerPlayerLeaveTeam(curPlayer, curTeamID)
|
gameMap = GameWorld.GetMap(curPlayer.GetMapID())
|
if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam:
|
curPlayer.MapServer_LeaveFB()
|
return
|
|
curTeamMember = curTeam.GetMemberByID(playerID)
|
#Íæ¼ÒµÇ¼, ´ÓTeamMemberÐÅÏ¢ÖжÁÈëÍæ¼ÒµÄ×é¶ÓÐÅÏ¢
|
curPlayer.SetTeam(curTeam)
|
curTeamMember.SetPlayer(curPlayer)
|
|
if curTeamMember.GetTeamLV() == IPY_GameServer.tmlLeader:
|
#Êý¾ÝÅж¨, Íæ¼ÒµÇÈëµÄʱºò, Èç¹ûÊǶӳ¤, ÄÇôȡÏûËûµÄ¶Ó³¤È¨ÏÞ
|
#<¶Ó³¤ÏÂÏß, ȨÏÞ»á×ªÒÆ>
|
#<ÉÏÏßµÄʱºò, ÔÚÏÂÃæ»á¸ø¶Ó³¤µÄ>
|
curTeamMember.SetTeamLV(IPY_GameServer.tmlMember)
|
|
#»ñµÃÊ£ÓàÈËÊý
|
onLineCount = CheckTeamOnLineCount(curTeam)
|
if onLineCount <= 1 or not GetTeamLeader(curTeam):
|
curTeamMember = curTeam.GetMemberByID(playerID)
|
curTeamMember.SetTeamLV(IPY_GameServer.tmlLeader)
|
AddTeamIDToSceneList(curTeamID, curPlayer.GetMapID(), tick)
|
AddTeamIDToTagMapTeamDict(curTeamID, curTeam.GetTagMapID())
|
|
#֪ͨMapServerd¶ÓÎé±ä¸ü
|
# curPlayer.MapServer_Sync_Team(curTeamMember.GetTeamLV())
|
#֪ͨ¶ÓÎé³ÉÔ±Íæ¼ÒÐÅÏ¢
|
#curTeam.Sync_TeamState()
|
Sync_TeamMemberInfo(curTeam)
|
SyncMapServerTeamInfo(curTeam, "Login", {"playerID":playerID})
|
|
if not PlayerControl.GetIsTJG(curPlayer):
|
#֪ͨ×Ô¼º¶ÓÎéÍæ¼ÒÉÏÏß
|
curPlayer.Sync_TeamMemberLogin() # 09 12 ¶ÓÎé³ÉÔ±ÉÏÏß/ÏÂÏß#tagTeamMemberLoginInfo
|
|
#°Ñ×Ô¼ºµÄ״̬ͬ²½¸ø¶ÓÎéËùÓÐÈË
|
#curPlayer.Sync_TeamMemberState() # 09 14 ¿çµØÍ¼³ÉÔ±ÐÅÏ¢#tagTeamMemberState
|
#°ÑÆäËûÍæ¼ÒµÄÐÅϢ֪ͨ¸øÕâ¸öÍæ¼Ò
|
#curTeam.Sync_OtherTeamMemberInfoToCurPlayer(curPlayer) # 09 14 ¿çµØÍ¼³ÉÔ±ÐÅÏ¢#tagTeamMemberState
|
|
#Èç¹û¶ÓÎéÕýÔÚÆ¥ÅäÖУ¬Ôò֪ͨ״̬
|
if IsTeamMatchingPlayer(curTeamID):
|
Sync_TeamMatchState(curPlayer, True)
|
OnTeamMemFamilyRefresh(curPlayer, curPlayer.GetFamilyID())
|
return True
|
|
#---------------------------------------------------------------------
|
|
def OnPlayerReadMapOK(curPlayer, tick):
|
##Íæ¼ÒµÇ½µØÍ¼³É¹¦, Ë¢ÐÂ×é¶Ó״̬
|
# @remarks Íæ¼ÒµÇ¼, ³õʼ»¯Íæ¼ÒµÄ¶ÓÎé, ÔÚµØÍ¼µØÍ¼³É¹¦µÄʱºò
|
|
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
|
|
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
|
#---------------------------------------------------------------------
|
##×é¶ÓÍæ¼ÒÇл»µØÍ¼
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ×é¶ÓÍæ¼ÒÇл»µØÍ¼
|
def OnPlayerChangeMap(curPlayer, tick):
|
#---ûÓжÓÎéҲҪ֪ͨ---
|
|
mapID = curPlayer.GetMapID()
|
GameWorld.DebugLog("Team.OnPlayerChangeMap,mapID=%s" % mapID, curPlayer.GetPlayerID())
|
|
playerID = curPlayer.GetPlayerID()
|
DelPlayerIDFromSceneList(playerID)
|
AddPlayerIDToSceneList(playerID, mapID)
|
|
#֪ͨµØÍ¼·þÎñÆ÷¸üÐÂ
|
#curPlayer.MapServer_Sync_Team(__GetPlayerTeamLV(curPlayer))
|
|
gameMap = GameWorld.GetMap(mapID)
|
|
#---ÓжÓÎé²Å֪ͨ---
|
curTeam = curPlayer.GetTeam()
|
|
if curTeam != None:
|
SyncMapServerTeamInfo(curTeam, "ChangeMap", {"playerID":playerID, "mapID":mapID})
|
#֪ͨ¿Í»§¶Ë¸üÐÂ
|
curPlayer.Sync_TeamMemberChangeMap() # 09 13 ¶ÓÎé³ÉÔ±Çл»µØÍ¼#tagTeamMemberChangeMap
|
|
#curTeam.Sync_TeamState()
|
#Sync_TeamMemberInfo(curTeam) ÔÝʱ¹Øµô, Ç°ÃæÒѾ֪ͨÇеØÍ¼ÁË£¬ÕâÀï¿É²»Í¨Öª
|
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
if curPlayerTeamLv == IPY_GameServer.tmlLeader:
|
#±ä¸ü³¡¾°¶ÓÎéÁбí
|
teamID = curTeam.GetTeamID()
|
DelTeamIDFromSceneList(teamID, tick)
|
AddTeamIDToSceneList(teamID, curPlayer.GetMapID(), tick)
|
|
# ¶Ó³¤½øÈë×é¶Ó¸±±¾£¬ÔòֹͣƥÅ䣬¶ÓÔ±¿ÉÄÜÖ÷¶¯½øÈë×é¶Ó¸±±¾
|
if gameMap.GetMapFBType() == ChConfig.fbtTeam:
|
DelTeamIDFromMatchingList(curTeam)
|
|
curMapData = GameWorld.GetMap(mapID)
|
if curMapData and curMapData.GetTeamLimit() == 2:
|
DoPlayerLeaveTeam(curPlayer, curTeam, tick)
|
else:
|
# Íæ¼Ò½øÈë×é¶Ó¸±±¾£¬ÔòֹͣƥÅä
|
if gameMap.GetMapFBType() == ChConfig.fbtTeam:
|
DelPlayerIDFromMatchingList(curPlayer)
|
SyncMapServerPlayerNoTeam(curPlayer) # ûÓжÓÎéµÄʱºòÇÐͼҲ֪ͨµØÍ¼
|
|
return
|
|
def PlayerTeamMemberRefresh(curPlayer, refreshType, value, tick):
|
playerID = curPlayer.GetPlayerID()
|
|
# Íæ¼ÒÆ¥Åä¶ÓÎéÖÐÉý¼¶
|
if refreshType == IPY_GameServer.CDBPlayerRefresh_LV:
|
playerMatchInfo = IsPlayerMatchingTeam(playerID)
|
if playerMatchInfo:
|
tagMapID, tagMapEx = playerMatchInfo
|
GameWorld.DebugLog("Íæ¼ÒÆ¥Åä¶ÓÎéÖÐÉý¼¶, refreshType=%s, value=%s, tagMapID=%s, tagMapEx=%s"
|
% (refreshType, value, tagMapID, tagMapEx), playerID)
|
DoTeamMatchingProcess(tagMapID, tagMapEx, tick)
|
|
curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
return
|
|
teamMember = curTeam.GetMemberByID(playerID)
|
if not teamMember:
|
return
|
GameWorld.DebugLog("¶ÓÎé³ÉÔ±ÊôÐÔË¢ÐÂ, refreshType=%s,value=%s" % (refreshType, value), playerID)
|
|
# Ö»¸üеȼ¶¡¢Ö°Òµ¡¢Ö°Òµ½×¡¢¾³½ç; µØÍ¼ÐÅÏ¢ÓɵØÍ¼±ä¸ü֪ͨ
|
if refreshType == IPY_GameServer.CDBPlayerRefresh_LV:
|
teamMember.SetPlayerLV(value)
|
elif refreshType == IPY_GameServer.CDBPlayerRefresh_Job:
|
teamMember.SetPlayerJob(value)
|
elif refreshType == IPY_GameServer.CDBPlayerRefresh_ExAttr1:
|
teamMember.SetPlayerJobLevel(value)
|
elif refreshType == IPY_GameServer.CDBPlayerRefresh_OfficialRank:
|
teamMember.SetPlayerRealmLV(value)
|
elif refreshType in [IPY_GameServer.CDBPlayerRefresh_VIPLv, IPY_GameServer.CDBPlayerRefresh_ExAttr9]:
|
SyncMapServerTeamInfo(curTeam, "Refresh", {"refreshType":refreshType, "value":value})
|
else:
|
return
|
|
#curPlayer.Sync_TeamMemberState() # //09 14 ¿çµØÍ¼³ÉÔ±ÐÅÏ¢#tagTeamMemberState
|
#ֻ֪ͨҪ֪ͨµÄ
|
#֪ͨ¿Í»§¶Ë
|
tmRefresh = ChPyNetSendPack.tagGCTeamMemberRefreshProperty()
|
tmRefresh.PlayerID = playerID
|
tmRefresh.RefreshType = refreshType
|
tmRefresh.Value = value
|
SendTeamFakePack(curTeam, tmRefresh)
|
return
|
|
|
#// B9 06 ²éѯ¶ÔÓ¦×é¶ÓÄ¿±êµÄ¶ÓÎé #tagCGQueryTagMapTeam
|
#
|
#struct tagCGQueryTagMapTeam
|
#{
|
# tagHead Head;
|
# DWORD TagMapID; // Ä¿±êµØÍ¼
|
# WORD TagMapEx; // Ä¿±êµØÍ¼À©Õ¹
|
# BYTE IsTagEx; // ÊÇ·ñ²éѯ¶ÔӦĿ±êÀ©Õ¹µÄ; 0·ñ1ÊÇ
|
# BYTE MatchState; // 0-È«²¿£»1-Æ¥ÅäÖеģ»
|
#};
|
def OnQueryTagMapTeam(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
tagMapID = clientData.TagMapID
|
tagMapEx = clientData.TagMapEx
|
isTagEx = clientData.IsTagEx
|
matchState = clientData.MatchState
|
|
teamPack = ChPyNetSendPack.tagGCTagMapTeamList()
|
teamPack.TagMapID = tagMapID
|
teamPack.TagMapEx = tagMapEx
|
teamPack.IsTagEx = isTagEx
|
teamPack.MatchState = matchState
|
teamPack.TeamList = []
|
|
teamMgr = GameWorld.GetTeamManager()
|
teamIDList = PyGameData.g_tagMapTeamDict.get(tagMapID, [])
|
for teamID in teamIDList:
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
|
# ÐèҪƥÅäµØÍ¼À©Õ¹µÄ
|
if isTagEx and team.GetTagMapEx() != tagMapEx:
|
continue
|
|
# ֻҪƥÅäÖеĶÓÎé
|
if matchState and not IsTeamMatchingPlayer(teamID):
|
continue
|
|
leader = GetTeamLeader(team)
|
if not leader:
|
continue
|
|
tagMapTeam = ChPyNetSendPack.tagGCTagMapTeam()
|
tagMapTeam.PlayerID = leader.GetPlayerID()
|
tagMapTeam.PlayerName = leader.GetName()
|
tagMapTeam.NameLen = len(tagMapTeam.PlayerName)
|
tagMapTeam.LV = leader.GetLV()
|
tagMapTeam.Job = leader.GetJob()
|
tagMapTeam.RealmLV = leader.GetOfficialRank()
|
tagMapTeam.MemberCount = team.GetTeamPlayerCount()
|
tagMapTeam.ReqMinLV = team.GetReqMinLV()
|
tagMapTeam.ReqMaxLV = team.GetReqMaxLV()
|
teamPack.TeamList.append(tagMapTeam)
|
|
teamPack.TeamCount = len(teamPack.TeamList)
|
NetPackCommon.SendFakePack(curPlayer, teamPack)
|
return
|
|
|
#// B9 07 ×Ô¶¯Æ¥Åä¶ÓÎé»òÍæ¼Ò #tagCGAutoMatchTeam
|
#
|
#struct tagCGAutoMatchTeam
|
#{
|
# tagHead Head;
|
# DWORD TagMapID; // Ä¿±êµØÍ¼; ·¢0´ú±íÆ¥Å䵱ǰ³¡¾°µÄ
|
# WORD TagMapEx; // Ä¿±êµØÍ¼À©Õ¹
|
#};
|
def OnAutoMatchTeam(index, clientData, tick):
|
'''
|
ÓжÓÎéµÄÇé¿ö£º Ö»Óжӳ¤ÔÚÎҵĶÓÎé½çÃæ²ÅÄÜÆô¶¯×Ô¶¯Æ¥Å䣬ÆäËû½çÃæ¼°¶ÓÔ±¶¼¿´²»µ½×Ô¶¯Æ¥Åä°´Å¥£¬ËùÒÔÒ»¶¨ÊÇ´´½¨µÄ¶ÓÎéÄ¿±ê
|
ÎÞ¶ÓÎéµÄÇé¿ö£º Íæ¼ÒÑ¡ÄÄÀï¾ÍÊÇҪƥÅäÄÄÀïµÄ£¬Ö»ÓÐÎÞ¶ÓÎéµÄ
|
'''
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
|
packTagMapID = clientData.TagMapID
|
# ·¢2ʱ´ú±íÖúսƥÅä
|
if packTagMapID == 2:
|
__DoMatchHelpFightTeam(curPlayer, tick)
|
return
|
|
tagMapEx = clientData.TagMapEx
|
tagMapID = packTagMapID
|
curMapID = curPlayer.GetMapID()
|
|
curTeam = curPlayer.GetTeam()
|
if curTeam:
|
# Ñé֤ȨÏÞ£¬Ö»Óжӳ¤²ÅÄÜ·¢ÆðÆ¥Åä
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader:
|
GameWorld.Log("Íæ¼Ò²»ÊǶӳ¤£¬ÎÞ·¨·¢ÆðÆ¥Åä! curPlayerTeamLv=%s" % (curPlayerTeamLv), curPlayer.GetPlayerID())
|
return
|
# ÓжÓÎéµÄĬÈÏÖ»ÄÜÆ¥Å䵱ǰ¶ÓÎéÄ¿±êµÄ
|
tagMapID = curTeam.GetTagMapID()
|
tagMapEx = curTeam.GetTagMapEx()
|
if not tagMapID:
|
GameWorld.Log("ÎÞÄ¿±ê¶ÓÎé²»ÔÊÐíÆ¥Å䣡", curPlayer.GetPlayerID())
|
return
|
|
if tagMapID in [0, 1] or PlayerControl.GetIsTJG(curPlayer):
|
tagMapID = curMapID
|
|
fbLineIpyData = PlayerFB.GetFBLineIpyData(tagMapID, tagMapEx)
|
sceneMapID = tagMapID if not fbLineIpyData else fbLineIpyData.GetMapID()
|
GameWorld.DebugLog("ÇëÇóÆ¥Åä¶ÓÎé: curMapID=%s,packTagMapID=%s,tagMapID=%s,tagMapEx=%s,sceneMapID=%s"
|
% (curMapID, packTagMapID, tagMapID, tagMapEx, sceneMapID), curPlayer.GetPlayerID())
|
gameMap = GameWorld.GetMap(sceneMapID)
|
if not gameMap:
|
GameWorld.ErrLog("Ä¿±êµØÍ¼²»´æÔÚ£¬ÎÞ·¨Æ¥Åä!tagMapID=%s,sceneMapID=%s" % (tagMapID, sceneMapID), curPlayer.GetPlayerID())
|
return
|
|
# ·Ç×é¶Ó¸±±¾µÄÖ´ÐÐÒ»´ÎÐÔÆ¥ÅäÂß¼, ĬÈÏÆ¥Å䵱ǰ³¡¾°
|
if gameMap.GetMapFBType() != ChConfig.fbtTeam:
|
if curTeam:
|
__DoMatchScenePlayer(curPlayer, curTeam, curMapID, tick)
|
else:
|
__DoMatchSceneTeam(curPlayer, curMapID, tick)
|
return
|
|
OnEnterFBTeamAsk(curPlayer, TeamFBAskType_Match, tagMapID, tagMapEx, tick)
|
return
|
|
def __DoAddToMatchingList(curPlayer, tagMapID, tagMapEx, tick):
|
curTeam = curPlayer.GetTeam()
|
#¸±±¾Ôò¼ÓÈë×Ô¶¯Æ¥Åä¶ÓÁÐ
|
if curTeam:
|
DelTeamIDFromMatchingList(curTeam)
|
AddTeamIDToMatchingList(curTeam, tagMapID, tagMapEx)
|
else:
|
DelPlayerIDFromMatchingList(curPlayer)
|
AddPlayerIDToMatchingList(curPlayer, tagMapID, tagMapEx)
|
|
#ÓÐжÓÎé/Íæ¼Ò¼ÓÈëÆ¥Åäʱ´¦ÀíÒ»´Î
|
DoTeamMatchingProcess(tagMapID, tagMapEx, tick)
|
return
|
|
def __DoMatchSceneTeam(curPlayer, mapID, tick):
|
'''Ò»´ÎÐÔÆ¥Åä¶ÓÎé, ͬһµØÍ¼³¡¾°ÖÐ, ¶ÓÎéÄ¿±ê²»ÐèÒªÒ»Ñù
|
Ìõ¼þ£º ÏÞÖÆµÈ¼¶·ûºÏ£¬¶ÓÎéδÂú£¬×Ô¶¯½ÓÊÜÈë¶ÓÉêÇëµÄ¶ÓÎé »ò ÍÑ»ú¹Ò»ú¶ÓÎé
|
ÍÑ»úÍæ¼ÒÓÅÏÈ×éÍÑ»ú¶ÓÎé, ÔÚÏßÍæ¼ÒÓÅÏÈ×éÔÚÏß¶ÓÎé
|
'''
|
|
playerID = curPlayer.GetPlayerID()
|
curLV = curPlayer.GetLV()
|
matchTeamOLList = [] # ÔÚÏß¶ÓÎ飬¶Ó³¤ÎªÔÚÏß״̬
|
matchTeamTJList = [] # ÍÑ»ú¶ÓÎ飬¶Ó³¤ÎªÍÑ»ú״̬
|
sceneTeamDict = GetSceneTeamIDDict()
|
sceneTeamIDList = sceneTeamDict.get(mapID, [])
|
teamMgr = GameWorld.GetTeamManager()
|
isTJG = PlayerControl.GetIsTJG(curPlayer)
|
GameWorld.DebugLog("Íæ¼ÒÆ¥ÅäÄ¿±êµØÍ¼·Ç¸±±¾, Ò»´ÎÐÔÆ¥Å䳡¾°¶ÓÎé: isTJG=%s,curLV=%s,mapID=%s,sceneTeamIDList=%s"
|
% (isTJG, curLV, mapID, sceneTeamIDList), playerID)
|
tjgKickTeamIDList = [] if not isTJG else PyGameData.g_tjgKickPlayerTeamDict.get(playerID, [])
|
|
for teamID in sceneTeamIDList:
|
|
# Ìß¹ýÍÑ»úÍæ¼ÒµÄ¶ÓÎé²»ÔÙ×é¸ÃÍÑ»úÍæ¼Ò
|
if teamID in tjgKickTeamIDList:
|
continue
|
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
|
if team.IsTeamFull():
|
continue
|
|
if not (team.GetReqMinLV() <= curLV <= team.GetReqMaxLV()):
|
continue
|
|
#Æ¥ÅäÖеĶÓÎé²»Äܱ»Ò»´ÎÐÔÆ¥Åä½øÀ´
|
if IsTeamMatchingPlayer(teamID):
|
continue
|
|
leader = GetTeamLeader(team)
|
if not leader:
|
continue
|
|
# ÍÑ»ú¶ÓÎé »ò Èë¶Ó²»ÐèÒªÉóºËµÄ
|
isLeaderTJG = PlayerControl.GetIsTJG(leader)
|
if isLeaderTJG or not IsTeamJoinReqNeedCheck(leader):
|
leaderLV = leader.GetLV()
|
teamInfo = [abs(curLV - leaderLV), -leaderLV, leader.GetPlayerID(), team, leader]
|
if isLeaderTJG:
|
matchTeamTJList.append(teamInfo)
|
else:
|
matchTeamOLList.append(teamInfo)
|
|
if matchTeamOLList:
|
matchTeamOLList.sort() # µÈ¼¶²î¾ø¶ÔÖµÉýÐòÅÅ£¬ ¾ø¶ÔÖµÏàͬµÄµÈ¼¶¸ßµÄÅÅÇ°Ãæ
|
if matchTeamTJList:
|
matchTeamTJList.sort() # µÈ¼¶²î¾ø¶ÔÖµÉýÐòÅÅ£¬ ¾ø¶ÔÖµÏàͬµÄµÈ¼¶¸ßµÄÅÅÇ°Ãæ
|
|
if isTJG:
|
matchTeamList = matchTeamTJList + matchTeamOLList
|
else:
|
matchTeamList = matchTeamOLList + matchTeamTJList
|
|
for teamInfo in matchTeamList:
|
tagTeam = teamInfo[3]
|
leader = teamInfo[4]
|
if not tagTeam or not leader:
|
continue
|
|
# ³É¹¦¼ÓÈë¼´½áÊø
|
if DoPlayerJoinTeam(curPlayer, leader, tagTeam, tick):
|
PlayerControl.NotifyCode(curPlayer, "TeamMatchingSucceed")
|
return
|
|
PlayerControl.NotifyCode(curPlayer, "NoMatchingTeam")
|
return
|
|
def __DoMatchScenePlayer(curPlayer, curTeam, mapID, tick):
|
'''Ò»´ÎÐÔÆ¥ÅäÍæ¼Ò, ͬһµØÍ¼³¡¾°ÖÐ
|
Ìõ¼þ£º µÈ¼¶·ûºÏ¶ÓÎéÐèÇó£¬ÎÞ¶ÓÎ飬×Ô¶¯½ÓÊÜÑûÇëÈë¶Ó »ò ÍÑ»ú¹Ò»úÍæ¼Ò
|
ÍÑ»ú¶ÓÎéÓÅÏÈ×éÍÑ»úÍæ¼Ò, ÔÚÏß¶ÓÎéÓÅÏÈ×éÔÚÏßÍæ¼Ò
|
'''
|
|
curPlayerID = curPlayer.GetPlayerID()
|
curPlayerLV = curPlayer.GetLV()
|
teamID = curTeam.GetTeamID()
|
reqMinLV = curTeam.GetReqMinLV()
|
reqMaxLV = curTeam.GetReqMaxLV()
|
isLeaderTJG = PlayerControl.GetIsTJG(curPlayer)
|
GameWorld.DebugLog("¶ÓÎéÄ¿±êµØÍ¼·Ç¸±±¾, Ò»´ÎÐÔÆ¥Å䳡¾°Íæ¼Ò: teamID=%s,isLeaderTJG=%s,mapID=%s,reqMinLV=%s,reqMaxLV=%s"
|
% (teamID, isLeaderTJG, mapID, reqMinLV, reqMaxLV), curPlayerID)
|
|
matchPlayerOLList = [] # ÔÚÏßÍæ¼Ò
|
matchPlayerTJList = [] # ÍÑ»úÍæ¼Ò
|
scenePlayerIDDict = GetScenePlayerIDDict()
|
scenePlayerIDList = scenePlayerIDDict.get(mapID, [])
|
|
playerMgr = GameWorld.GetPlayerManager()
|
for playerID in scenePlayerIDList:
|
player = playerMgr.FindPlayerByID(playerID)
|
if not player:
|
continue
|
|
if player.GetTeamID():
|
continue
|
|
# Æ¥ÅäÖеÄÍæ¼Ò²»Äܱ»Ò»´ÎÐÔÆ¥Åä½øÀ´
|
if IsPlayerMatchingTeam(playerID):
|
continue
|
|
playerLV = player.GetLV()
|
if not (reqMinLV <= playerLV <= reqMaxLV):
|
continue
|
|
# ÍÑ»ú¶ÓÎé »ò Èë¶Ó²»ÐèÒªÉóºËµÄ
|
isTJG = PlayerControl.GetIsTJG(player)
|
if isTJG:
|
tjgKickTeamIDList = PyGameData.g_tjgKickPlayerTeamDict.get(playerID, [])
|
if teamID in tjgKickTeamIDList:
|
continue
|
|
if isTJG or not IsTeamInvateNeedCheck(player):
|
playerInfo = [abs(curPlayerLV - playerLV), -playerLV, player.GetPlayerID(), player]
|
if isTJG:
|
matchPlayerTJList.append(playerInfo)
|
else:
|
matchPlayerOLList.append(playerInfo)
|
|
if matchPlayerOLList:
|
matchPlayerOLList.sort() # µÈ¼¶²î¾ø¶ÔÖµÉýÐòÅÅ£¬ ¾ø¶ÔÖµÏàͬµÄµÈ¼¶¸ßµÄÅÅÇ°Ãæ
|
if matchPlayerTJList:
|
matchPlayerTJList.sort() # µÈ¼¶²î¾ø¶ÔÖµÉýÐòÅÅ£¬ ¾ø¶ÔÖµÏàͬµÄµÈ¼¶¸ßµÄÅÅÇ°Ãæ
|
|
if isLeaderTJG:
|
matchPlayerList = matchPlayerTJList + matchPlayerOLList
|
else:
|
matchPlayerList = matchPlayerOLList + matchPlayerTJList
|
|
joinPlayerCnt = 0
|
for playerInfo in matchPlayerList:
|
joinPlayer = playerInfo[3]
|
if not joinPlayer:
|
continue
|
|
if DoPlayerJoinTeam(joinPlayer, curPlayer, curTeam, tick):
|
joinPlayerCnt += 1
|
# ¼Óµ½¶ÓÎéÂúΪֹ
|
if curTeam.IsTeamFull():
|
GameWorld.DebugLog(" ¶ÓÎéÒÑÂú£¡Í˳öÆ¥Å䣡", curPlayerID)
|
break
|
|
GameWorld.DebugLog(" ³É¹¦Ôö¼Ó¶ÓÔ±Êý: joinPlayerCnt=%s" % (joinPlayerCnt), curPlayerID)
|
if not joinPlayerCnt:
|
PlayerControl.NotifyCode(curPlayer, "NoMatchingPlayer")
|
else:
|
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,
|
ChConfig.Def_FBMapID_KillDevil]
|
|
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
|
#
|
#struct tagCGCancelMatchTeam
|
#{
|
# tagHead Head;
|
#};
|
def OnCancelMatchTeam(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curTeam = curPlayer.GetTeam()
|
if curTeam:
|
# Ñé֤ȨÏÞ£¬Ö»Óжӳ¤²ÅÄÜ·¢ÆðÆ¥Åä
|
curPlayerTeamLv = __GetPlayerTeamLV(curPlayer)
|
if curPlayerTeamLv != IPY_GameServer.tmlLeader:
|
GameWorld.Log("Íæ¼Ò²»ÊǶӳ¤£¬ÎÞ·¨È¡ÏûÆ¥Åä! curPlayerTeamLv=%s" % (curPlayerTeamLv), curPlayer.GetPlayerID())
|
return
|
DelTeamIDFromMatchingList(curTeam)
|
else:
|
DelPlayerIDFromMatchingList(curPlayer)
|
return
|
|
|
def DoTeamMatchingProcess(tagMapID, tagMapEx, tick):
|
'''×é¶Ó×Ô¶¯Æ¥Åä´¦Àí, Ö»Ðè´¦ÀíÒÔÏÂʱ»ú¼´¿É
|
1. ¶ÓÎé »ò Íæ¼Ò ¼ÓÈëÆ¥Åä
|
2. Æ¥ÅäÍæ¼Ò¶ÓÁÐÖеÄÍæ¼ÒµÈ¼¶±ä¸üʱ
|
'''
|
|
key = (tagMapID, tagMapEx)
|
matchingTeamDict = PyGameData.g_matchingTeamDict
|
matchingPlayerDict = PyGameData.g_matchingPlayerDict
|
GameWorld.DebugLog("DoTeamMatchingProcess tagMapID=%s, tagMapEx=%s" % (tagMapID, tagMapEx))
|
GameWorld.DebugLog(" matchingTeamDict=%s" % (matchingTeamDict))
|
GameWorld.DebugLog(" matchingPlayerDict=%s" % (matchingPlayerDict))
|
|
# ûÓÐÆ¥Åä¶ÓÎé »ò Æ¥ÅäÍæ¼Ò Ôò²»´¦Àí
|
if key not in matchingTeamDict or key not in matchingPlayerDict:
|
GameWorld.DebugLog(" ´¦ÀíÄ¿±êµØÍ¼ÆäÖÐÒ»¸öÆ¥Åä¶ÓÁÐûÓÐÊý¾Ý£¬²»´¦Àí£¡")
|
return
|
|
teamIDList = matchingTeamDict[key]
|
playerIDList = matchingPlayerDict[key]
|
if not teamIDList or not playerIDList:
|
GameWorld.DebugLog(" ´¦ÀíÄ¿±êµØÍ¼ÆäÖÐÒ»¸öÆ¥Åä¶ÓÁÐûÓÐÊý¾Ý£¬²»´¦Àí£¡")
|
return
|
|
teamIDList = copy.deepcopy(teamIDList)
|
playerIDList = copy.deepcopy(playerIDList)
|
delPlayerList = []
|
|
teamMgr = GameWorld.GetTeamManager()
|
playerMgr = GameWorld.GetPlayerManager()
|
|
# ÓÅÏȼÓÈëÈËÊý¶àµÄ¶ÓÎ飬ÈôÈËÊýÏàͬ£¬ÓÅÏȼÓÈëÆ¥Åäʱ¼äÔçµÄ¶ÓÎé
|
matchTeamCount = len(teamIDList)
|
matchTeamInfoList = []
|
for i, teamID in enumerate(teamIDList):
|
team = teamMgr.FindTeam(teamID)
|
if not team:
|
continue
|
onLineCount = CheckTeamOnLineCount(team)
|
matchTeamInfoList.append([onLineCount, matchTeamCount - i, team.GetTeamPlayerCount(), teamID, team])
|
matchTeamInfoList.sort(reverse=True) # µ¹ÐòÅÅ
|
GameWorld.DebugLog(" Æ¥Åä¶ÓÎé˳Ðò: %s" % matchTeamInfoList)
|
|
for teamInfo in matchTeamInfoList:
|
team = teamInfo[-1]
|
if not team:
|
continue
|
|
leader = GetTeamLeader(team)
|
if not leader:
|
continue
|
|
reqMinLV = team.GetReqMinLV()
|
reqMaxLV = team.GetReqMaxLV()
|
|
for playerID in playerIDList:
|
if playerID in delPlayerList:
|
continue
|
player = playerMgr.FindPlayerByID(playerID)
|
if not player:
|
continue
|
|
if not (reqMinLV <= player.GetLV() <= reqMaxLV):
|
continue
|
|
if not DoPlayerJoinTeam(player, leader, team, tick, isAutoMatchJoin=True):
|
continue
|
|
delPlayerList.append(playerID)
|
|
return
|
|
## ===============================================================================================
|
# ÒÔÏÂΪ½øÈ븱±¾Á÷³Ì´¦Àí
|
|
#// B9 09 ¶ÓÔ±½øÈ븱±¾×¼±¸Ñ¡Ôñ #tagCGTeamMemberPrepare
|
#
|
#struct tagCGTeamMemberPrepare
|
#{
|
# tagHead Head;
|
# BYTE PrepareState; // 1-×¼±¸£»2-¾Ü¾ø
|
#};
|
def OnTeamMemberPrepare(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
prepareState = clientData.PrepareState
|
SetTeamMemberPrepareState(curPlayer, prepareState, tick)
|
return
|
|
def SetTeamMemberPrepareState(curPlayer, state, tick):
|
''' ÉèÖöÓÔ±½øÈ븱±¾×¼±¸×´Ì¬±ä¸ü
|
@param state: 1-×¼±¸£»2-¾Ü¾ø£»3-µôÏß; 4-Í˳ö
|
@note: µôÏßÔݲ»×öÉÏÏÂÏßÖ§³Ö£¬Ä¿Ç°Ïȼòµ¥´¦Àí£¬Ö±½Ó°Ñ¸Ã³ÉÔ±ÒÆ³ö×¼±¸¶ÓÁÐ
|
'''
|
curTeam = curPlayer.GetTeam()
|
if not curTeam:
|
return
|
|
teamID = curTeam.GetTeamID()
|
playerID = curPlayer.GetPlayerID()
|
if state not in TeamMemPrepareStateList:
|
#GameWorld.DebugLog("¶ÓÔ±½øÈ븱±¾×¼±¸×´Ì¬±ä¸ü״̬´íÎ󣬲Ù×÷ʧ°Ü£¡state=%s" % (state), playerID)
|
return
|
if not IsInEnterFBTeamPrepare(teamID):
|
#GameWorld.DebugLog(" ¶ÓÎéûÓÐÔÚ½øÈ븱±¾×¼±¸¶ÓÁÐÀÎÞÐè²Ù×÷£¡", playerID)
|
return
|
askMapID, askMapEx, memStateDict = PyGameData.g_prepareTeamDict[teamID][:3]
|
GameWorld.DebugLog("¶ÓÔ±½øÈ븱±¾×¼±¸×´Ì¬±ä¸ü: teamID=%s,state=%s,memStateDict=%s" % (teamID, state, memStateDict), playerID)
|
if playerID not in memStateDict:
|
#GameWorld.DebugLog(" ³ÉԱûÓÐÔÚ¶ÓÎé×¼±¸ÁбíÀÎÞÐè²Ù×÷£¡memStateDict=%s" % memStateDict, playerID)
|
return
|
|
# Íæ¼ÒµôÏߣ¬Ö±½ÓÒÆ³ö×¼±¸¶ÓÁÐ
|
if state in [TeamMemPrepareState_Offline, TeamMemPrepareState_LeaveTeam]:
|
memStateDict.pop(playerID)
|
else:
|
memStateDict[playerID] = state
|
|
teamLeader = GetTeamLeader(curTeam)
|
|
isErr = (not memStateDict or not teamLeader)
|
# ͬ²½¿Í»§¶Ë
|
SyncTeamEnterFBPrepareInfo(curTeam, askMapID, askMapEx, memStateDict, isErr)
|
|
# Ö»ÒªÓÐÈ˾ܾø, ±¾´Î½øÈ븱±¾ÇëÇó×÷·Ï
|
if state == TeamMemPrepareState_Refuse or isErr:
|
PyGameData.g_prepareTeamDict.pop(teamID)
|
|
if state == TeamMemPrepareState_Refuse:
|
PlayerControl.TeamNotify(teamID, "TeamEnterFailed", [curPlayer.GetName()])
|
return
|
|
# ʣϵÄÇé¿ö¼ì²éʣϵĶÓÔ±ÊÇ·ñ¶¼ÒѾ׼±¸
|
for state in memStateDict.values():
|
if state != TeamMemPrepareState_OK:
|
return
|
|
GameWorld.DebugLog("ËùÓжÓÔ±¶¼×¼±¸ºÃÁË£¬×ö½øÈ븱±¾Ç°×îÖÕ¸´²é£¡", playerID)
|
# ¶¼×¼±¸ºÃÁË£¬ÔòÐè×ö×îÖÕ½øÈ븱±¾µ±Ç°×´Ì¬ÔÙ´ÎÈ·ÈÏÊÇ·ñ¶¼Âú×ãÌõ¼þ£¬·¢ÆðÇëÇóµÄ±ØÐëÊǶӳ¤
|
OnEnterFBTeamAsk(teamLeader, TeamFBAskType_PrepareOK, askMapID, askMapEx, tick)
|
return
|
|
def SyncTeamEnterFBPrepareInfo(curTeam, askMapID, askMapEx, memStateDict, isErr=False):
|
## ͬ²½¶ÓÎé½øÈë×é¶Ó¸±±¾¶ÓÔ±×¼±¸×´Ì¬
|
teamMemPreparePack = ChPyNetSendPack.tagGCTeamEnterFBPrepare()
|
teamMemPreparePack.TagMapID = askMapID
|
teamMemPreparePack.TagMapEx = askMapEx
|
teamMemPreparePack.IsPrepareErr = isErr
|
teamMemPreparePack.MemStateList = []
|
for memPlayerID, state in memStateDict.items():
|
memState = ChPyNetSendPack.tagGCTeamMemPrepareState()
|
memState.PlayerID = memPlayerID
|
memState.PrepareState = state
|
teamMemPreparePack.MemStateList.append(memState)
|
teamMemPreparePack.MemCount = len(teamMemPreparePack.MemStateList)
|
SendTeamFakePack(curTeam, teamMemPreparePack)
|
return
|
|
## ÊÇ·ñÕýÔÚѯÎʿɷñ½øÈë×é¶Ó¸±±¾ÖÐ
|
def IsInEnterFBTeamPrepare(teamID): return teamID in PyGameData.g_prepareTeamDict
|
## ÊÇ·ñÕýÔÚ½øÈë×é¶Ó¸±±¾¶ÓÔ±×¼±¸ÖÐ
|
def IsInEnterFBTeamAsk(teamID): return teamID in PyGameData.g_teamFBEnterAskDict
|
|
def OnEnterFBTeamAsk(curPlayer, askType, askMapID, askMapEx, tick):
|
'''ѯÎʿɷñ½øÈë×é¶Ó¸±±¾£¬ÓÐÈý¸öʱ¼äµãÐèҪѯÎÊ£¨Æ¥Åäǰ¡¢¶Ó³¤µã»÷½øÈë¡¢¶ÓÔ±¶¼×¼±¸³É¹¦ºó½øÈëǰ×îÖÕÈ·ÈÏ£©
|
@param askType: ѯÎÊÀàÐÍ£»0-·¢ÆðÆ¥Åä(¸öÈË¡¢¶Ó³¤)£»1-¶Ó³¤µã»÷½øÈ룻2-×¼±¸Íêºó½øÈëѯÎÊ
|
@param tick: ¿É×÷ΪѯÎÊÇëÇóµÄ°æ±¾ºÅ, ×÷ΪÊÇ·ñͬһÇëÇóµÄ»Ø¸´Ó㬷ÀÖ¹¸²¸ÇÇëÇ󻨏´´¦Àí»ìÂÒ
|
'''
|
playerID = curPlayer.GetPlayerID()
|
curTeam = curPlayer.GetTeam()
|
askVer = tick
|
if curTeam == None:
|
teamID = 0
|
# ¸öÈË·¢Æð¸±±¾Æ¥ÅäµÄÐèҪѯÎÊÍæ¼ÒËùÔÚµØÍ¼£¬¼ì²éÍæ¼ÒÊÇ·ñ¿É½øÈë
|
if askType == TeamFBAskType_Match:
|
if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_EnterFBTeamAskTick, tick):
|
GameWorld.Log("¸öÈËÇëÇó½øÈ븱±¾Æ¥Å䣬ÎÞ·¨Öظ´ÇëÇó! askMapID=%s,askMapEx=%s" % (askMapID, askMapEx), playerID)
|
return
|
playerMapID = GameWorld.GetQueryPlayerMapID(curPlayer)
|
if not playerMapID:
|
return
|
# ¸öÈ˵ÄÖ»×öѯÎÊCD£¬²»¼Ç¼
|
sendCMD = str([teamID, askVer, askType, askMapID, askMapEx])
|
GameWorld.GetPlayerManager().MapServer_QueryPlayer(playerID, 0, playerID, playerMapID, "EnterFBTeamAsk",
|
sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
|
GameWorld.DebugLog("EnterFBTeamAsk ¸öÈË·¢Æð¸±±¾Æ¥ÅäµÄÐèҪѯÎÊÍæ¼ÒËùÔÚµØÍ¼£¬¼ì²éÍæ¼ÒÊÇ·ñ¿É½øÈë", playerID)
|
|
#===========================================================================================
|
# # ·ÇÆ¥ÅäµÄ¸öÈËÇé¿ö£¬Ò»°ãΪµ¥È˽øÈë×é¶Ó¸±±¾£¬´ËÇé¿öÔÚMapServerÖ±½Ó´¦Àí£¬²»»á×ßµ½ÕâÀï
|
# elif askType == TeamFBAskType_Enter:
|
# resultName = str([askMapID, askMapEx])
|
# curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamAsk", resultName, len(resultName))
|
#===========================================================================================
|
return
|
|
teamID = curTeam.GetTeamID()
|
if IsInEnterFBTeamAsk(teamID):
|
# Èç¹ûÒѾÔÚ¶ÓÁÐÀïµÄ£¬ÔòÑéÖ¤ÇëÇóCD£¬µ±¹ýÁ˸ÃCD¿ÉÇ¿ÖÆ¸²¸Ç¸üвéѯ£¬·ÀÖ¹Òì³£Çé¿öijЩ¶ÓԱûÓлØÓ¦µ¼ÖÂÎÞ·¨½øÐÐÏÂÒ»´ÎÇëÇó
|
if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_EnterFBTeamAskTick, tick):
|
GameWorld.Log("¶ÓÎéÇëÇó½øÈ븱±¾ÖУ¬ÎÞ·¨Öظ´ÇëÇó! teamID=%s,askMapID=%s,askMapEx=%s" % (teamID, askMapID, askMapEx), playerID)
|
return
|
|
askPlayerRetDict = {} # ѯÎʵĶÓÔ±½á¹ûÐÅÏ¢×Öµä³õʼ»¯
|
askPlayerMapDict = {} # ѯÎʵĶÓÔ±µØÍ¼ÐÅÏ¢×Öµä
|
# µ½¶ÓÔ±ËùÊôµØÍ¼Ñ¯ÎÊÑéÖ¤¶ÓÔ±ÊÇ·ñÂú×ã½øÈ븱±¾Ìõ¼þ
|
for i in xrange(curTeam.GetMemberCount()):
|
memPlayer = curTeam.GetMemberPlayer(i)
|
#curMemberInfo = curTeam.GetMemberInfo(i)
|
#¹ýÂ˲»ÔÚÏߵijÉÔ±
|
if memPlayer == None or memPlayer.GetPlayerID() == 0:
|
continue
|
memPlayerID = memPlayer.GetPlayerID()
|
memMapID = GameWorld.GetQueryPlayerMapID(memPlayer)
|
if not memMapID:
|
GameWorld.ErrLog("ÕÒ²»µ½ÔÚÏß¶ÓÔ±ËùÊôµØÍ¼£¬·ÅÆú±¾´Î½øÈë×é¶Ó¸±±¾ÇëÇó£¡memPlayerID=%s" % memPlayerID, playerID)
|
return
|
|
askPlayerRetDict[memPlayerID] = []
|
askPlayerMapDict[memPlayerID] = [memMapID, memPlayer.GetRouteServerIndex()]
|
|
UpdateTeamTagMapTime(teamID, askMapID)
|
# ûÓÐÐèҪѯÎʵĶÓÔ±£¬Ôò±¾´ÎѯÎÊʧЧ
|
if not askPlayerMapDict:
|
return
|
|
# ¸²¸ÇÌí¼Ó
|
PyGameData.g_teamFBEnterAskDict[teamID] = [askVer, askType, askMapID, askMapEx, askPlayerRetDict, tick]
|
|
sendCMD = str([teamID, askVer, askType, askMapID, askMapEx])
|
for memPlayerID, mapInfo in askPlayerMapDict.items():
|
memMapID, routeServerIndex = mapInfo
|
GameWorld.GetPlayerManager().MapServer_QueryPlayer(playerID, 0, memPlayerID, memMapID, "EnterFBTeamAsk",
|
sendCMD, len(sendCMD), routeServerIndex)
|
GameWorld.DebugLog("Add EnterFBTeamAsk teamID=%s,askVer=%s,askType=%s,askMapID=%s,askMapEx=%s,askPlayerMapDict=%s,askPlayerRetDict=%s"
|
% (teamID, askVer, askType, askMapID, askMapEx, askPlayerMapDict, askPlayerRetDict), playerID)
|
return
|
|
def OnEnterFBTeamAskResult(curPlayer, resultList, tick):
|
retTeamID, retAskVer, retAskType, retAskMapID, retAskMapEx, retPlayerID, ret, retPlayerName = resultList
|
curTeam = curPlayer.GetTeam()
|
teamID = curPlayer.GetTeamID()
|
playerID = curPlayer.GetPlayerID()
|
|
GameWorld.DebugLog("OnEnterFBTeamAskResult retTeamID=%s,retAskVer=%s,retAskType=%s,retAskMapID=%s,retAskMapEx=%s,retPlayerID=%s,ret=%s"
|
% (retTeamID, retAskVer, retAskType, retAskMapID, retAskMapEx, retPlayerID, ret), playerID)
|
# ÕâÀïµÄÅжϰüº¬¶ÓÎéIDΪ0µÄÇé¿ö
|
if teamID != retTeamID:
|
GameWorld.DebugLog(" ·Çͬ¸ö¶ÓÎéÇëÇ󣬲»´¦Àí£¡teamID=%s,retTeamID=%s" % (teamID, retTeamID), playerID)
|
return
|
|
notifyRet = ShareDefine.EntFBAskRet_Max
|
causePlayerDict = {} # Òý·¢ÎÞ·¨½øÈëµÄ³ÉÔ±ÐÅÏ¢ {playerID:playerName, ...}
|
memStateDict = {} # ³ÉÔ±×¼±¸×´Ì¬×Öµä³õʼ»¯ {playerID:ÊÇ·ñÒÑ×¼±¸, ...}
|
|
# ¶ÓÎéÇëÇóµÄ
|
if retTeamID:
|
if retTeamID not in PyGameData.g_teamFBEnterAskDict:
|
GameWorld.DebugLog(" ¸Ã¶ÓÎéµÄÇëÇóÐÅÏ¢¼Ç¼ÒѲ»´æÔÚ£¬²»´¦Àí!retTeamID=%s" % retTeamID, playerID)
|
return
|
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)
|
return
|
if retPlayerID not in askPlayerRetDict:
|
GameWorld.DebugLog(" ûÓÐÇëÇó¸Ã¶ÓÔ±ID£¬²»´¦Àí!retPlayerID=%s" % retPlayerID, playerID)
|
return
|
|
# ¸üÐÂÇëÇó¶ÓÔ±½á¹û
|
askPlayerRetDict[retPlayerID] = [ret, retPlayerName]
|
|
# ¼ì²éѯÎʵĶÓÔ±ÊÇ·ñ¶¼ÒѾ»Ø¸´½á¹û
|
for memPlayerID, retInfo in askPlayerRetDict.items():
|
if not retInfo:
|
# »¹ÓÐδ»Ø¸´µÄ£¬Ôݲ»´¦Àí
|
return
|
memStateDict[memPlayerID] = int(memPlayerID == playerID) # ¶Ó³¤×Ô¼ºµ±×ö×¼±¸ºÃµÄ
|
ret, retPlayerName = retInfo
|
if ret == ShareDefine.EntFBAskRet_OK:
|
continue
|
|
if ret < notifyRet:
|
notifyRet = ret
|
causePlayerDict = {}
|
causePlayerDict[memPlayerID] = retPlayerName
|
elif ret == notifyRet:
|
causePlayerDict[memPlayerID] = retPlayerName
|
|
PyGameData.g_teamFBEnterAskDict.pop(retTeamID) # ÒÆ³ý¸ÃÇëÇó¼Ç¼
|
|
# ¸öÈËÇëÇóµÄ
|
else:
|
if ret != ShareDefine.EntFBAskRet_OK:
|
notifyRet = ret
|
causePlayerDict[retPlayerID] = retPlayerName
|
|
## ÒÔÏÂÂ߼ΪѯÎʵÄÄ¿±ê¾ù»Ø¸´ºóµÄ´¦Àí£¬´ó²¿·ÖÇé¿öÏÂÄÜѯÎʵÄÍæ¼Ò¶¼»á»Ø¸´£¬Ð¡¸ÅÂÊûÓлظ´µÄÇé¿öµ±×ö´Ë´ÎÂß¼×÷·ÏÎÞÏìÓ¦£¬¶Ó³¤ÖØÐÂÇëÇó¼´¿É
|
|
# Óв»ÄܽøÈ븱±¾µÄÔÒò£¬ÐèÒª×öÌáʾ
|
if notifyRet != ShareDefine.EntFBAskRet_Max:
|
__DoEnterFBTeamAskResultNotify(curPlayer, retAskType, retAskMapID, notifyRet, causePlayerDict, memStateDict.keys())
|
|
#¶¼×¼±¸ºÃºó²»ÄܽøÈëÒì³£ÐèÒªÌáʾ¿Í»§¶Ë
|
if retAskType == TeamFBAskType_PrepareOK:
|
SyncTeamEnterFBPrepareInfo(curTeam, retAskMapID, retAskMapEx, memStateDict, isErr=True)
|
return
|
|
# ×¢: ¸öÈ˵ÄÖ»ÓÐÆ¥Åä»áѯÎÊ£¬·ÇÆ¥ÅäµÄ¸öÈËÔÚMapServerÒѾÑéÖ¤¹ýÊÇ·ñ¿É½øÈ룬²»»áÔÙ´ÎѯÎÊ£¬¹Ê¸öÈ˵ÄÖ»ÓÐÆ¥ÅäÂß¼²Å»á×ßµ½ÕâÀï
|
|
# ȫԱ¼ì²éͨ¹ý£¬¿É½øÈëÏÂÒ»²½Âß¼
|
|
# Æ¥ÅäѯÎÊͨ¹ýºóÂß¼
|
if retAskType == TeamFBAskType_Match:
|
# ¼ÓÈëÆ¥Åä
|
__DoAddToMatchingList(curPlayer, retAskMapID, retAskMapEx, tick)
|
|
# ÇëÇó½øÈ븱±¾Ñ¯ÎÊͨ¹ýºóÂß¼
|
elif retAskType == TeamFBAskType_Enter:
|
if curTeam:
|
# µ¥È˶ÓÎéÖ±½Ó½øÈ룬²»ÐèҪ׼±¸
|
if len(memStateDict) == 1:
|
GameWorld.DebugLog("¶ÓÎéÖ»ÓÐÒ»¸öÈË£¬Ö±½Ó½øÈ븱±¾: memStateDict=%s" % memStateDict, playerID)
|
resultName = str([retAskMapID, retAskMapEx])
|
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)
|
else:
|
# ²»»áÓÐÎÞ¶ÓÎéµÄÇé¿ö×ßµ½ÕâÀï
|
pass
|
|
# ȫԱ׼±¸Íê±ÏѯÎÊͨ¹ýºóÂß¼
|
elif retAskType == TeamFBAskType_PrepareOK:
|
# ¶Ó³¤½øÈë
|
resultName = str([retAskMapID, retAskMapEx] + GetTeamFBEnterInfo(curPlayer, curTeam, retAskMapID, retAskMapEx))
|
curPlayer.MapServer_QueryPlayerResult(0, 0, "EnterFBTeamAsk", resultName, len(resultName))
|
GameWorld.Log("¶ÓÔ±×¼±¸Íê±Ï£¬¶Ó³¤½øÈë×é¶Ó¸±±¾: resultName=%s" % resultName, curPlayer.GetPlayerID())
|
|
return
|
|
def GetTeamFBEnterInfo(leader, curTeam, retAskMapID, retAskMapEx):
|
# »ñÈ¡×é¶Ó¸±±¾³É³¤µÈ¼¶, ĬÈÏÆ½¾ùµÈ¼¶, ½ö¼ÆËã±¾´Î×¼±¸½øÈ븱±¾µÄ¶ÓÔ±£¬×¢Òâ²»ÊÇËùÓжÓÔ±
|
teamID = curTeam.GetTeamID()
|
isInPrepareTeam = IsInEnterFBTeamPrepare(teamID)
|
if not isInPrepareTeam:
|
return []
|
askMapID, askMapEx, memStateDict = PyGameData.g_prepareTeamDict[teamID][:3]
|
if retAskMapID != askMapID or retAskMapEx != askMapEx:
|
return []
|
totalLV = 0
|
maxLV = 0
|
|
# Ææ¹Ö£¬ÕâÀï±éÀú¶ÓÎéÈ¡²»µ½Íæ¼ÒʾÀý£¬ÏÈÓòéÕÒÍæ¼ÒµÄ
|
|
playerMgr = GameWorld.GetPlayerManager()
|
for playerID in memStateDict.keys():
|
memPlayer = playerMgr.FindPlayerByID(playerID)
|
#Ä¿±êÍæ¼ÒÊÇ·ñ´æÔÚ
|
if memPlayer == None:
|
continue
|
|
memLV = memPlayer.GetLV()
|
if maxLV < memLV:
|
maxLV = memLV
|
totalLV += memLV
|
|
if not maxLV:
|
return []
|
playerCnt = len(memStateDict)
|
averageLV = int(totalLV / playerCnt)
|
return [averageLV, maxLV, playerCnt]
|
|
def __DoEnterFBTeamAskResultNotify(curPlayer, retAskType, askMapID, notifyRet, causePlayerDict, askPlayerIDList):
|
# ²»¿É½øÈëÔÒò¶ÔÓ¦ÌáʾÐÅÏ¢×Öµä {ÔÒò:[[×Ô¶¯Æ¥ÅäÒý·¢Íæ¼ÒÌáʾ, ÆäËû¶ÓÔ±Ìáʾ], [ÊÖ¶¯½øÈëÒý·¢Íæ¼ÒÌáʾ, ÆäËû¶ÓÔ±Ìáʾ], µ¥ÈËÌáʾ], ...}
|
notifyKeyDict = {
|
ShareDefine.EntFBAskRet_FBClose:[["FBIsNotOpen", "FBIsNotOpen"],
|
["FBIsNotOpen", "FBIsNotOpen"], "FBIsNotOpen"],
|
ShareDefine.EntFBAskRet_NoEnterCnt:[["TeamMatchingTimeMe", "TeamMatchingTimeAll"],
|
["TeamEnterTimeMe", "TeamEnterTimeAll"], "GeRen_chenxin_268121"],
|
ShareDefine.EntFBAskRet_EnterCD:[["TeamMatchingCDMe", "TeamMatchingCDAll"],
|
["TeamEnterCDMe", "TeamEnterCDAll"], "SingleEnterCD"],
|
ShareDefine.EntFBAskRet_LVLimit:[["TeamMatchingLVMe", "TeamMatchingLVAll"],
|
["TeamEnterLVMe", "TeamEnterLVAll"], "FbLV"],
|
ShareDefine.EntFBAskRet_NoTicket:[["TeamMatchingTicketMe", "TeamMatchingTicketAll"],
|
["TeamEnterTicketMe", "TeamEnterTicketAll"], "GeRen_chenxin_157069"],
|
ShareDefine.EntFBAskRet_Dead:[["TeamMatchingDeadMe", "TeamMatchingDeadAll"],
|
["TeamEnterDeadMe", "TeamEnterDeadAll"], "SingleEnterDead"],
|
ShareDefine.EntFBAskRet_BossState:[["TeamMatchingBossMe", "TeamMatchingBossAll"],
|
["TeamEnterBossMe", "TeamEnterBossAll"], "SingleEnterBoss"],
|
ShareDefine.EntFBAskRet_PKState:[["TeamMatchingPKMe", "TeamMatchingPKAll"],
|
["TeamEnterPKMe", "TeamEnterPKAll"], "SingleEnterPK"],
|
ShareDefine.EntFBAskRet_Preparing:[["TeamMatchingGatherMe", "TeamMatchingGatherAll"],
|
["TeamEnterGatherMe", "TeamEnterGatherAll"], "SingleEnterGather"],
|
ShareDefine.EntFBAskRet_InFB:[["TeamMatchingDungeonMe", "TeamMatchingDungeonAll"],
|
["TeamEnterDungeonMe", "TeamEnterDungeonAll"], "SingleEnterDungeon"],
|
ShareDefine.EntFBAskRet_TJG:[["TeamMatchingDefaultMe", "TeamMatchingDefaultAll"],
|
["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"],
|
}
|
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("²»¿É½øÈë×é¶Ó¸±±¾ÔÒòÌáÐÑ£ºretAskType=%s,askMapID=%s,notifyRet=%s,causePlayerDict=%s,askPlayerIDList=%s"
|
% (retAskType, askMapID, notifyRet, causePlayerDict, askPlayerIDList), playerID)
|
if notifyRet not in notifyKeyDict:
|
GameWorld.DebugLog("×é¶Ó¸±±¾²»¿É½øÈëÔÒòÎÞÌáʾ: retAskType=%s,notifyRet=%s" % (retAskType, notifyRet), playerID)
|
return
|
matchNotifyList, enterNotifyList, singleNotify = notifyKeyDict[notifyRet]
|
|
curTeam = curPlayer.GetTeam()
|
if not curTeam:
|
notifyMark = matchNotifyList[0] if retAskType == TeamFBAskType_Match else singleNotify
|
PlayerControl.NotifyCode(curPlayer, notifyMark, [askMapID]) # ûÓжÓÎéµÄÖ»Ìáʾ×Ô¼º
|
else:
|
causePlayerName = ShareDefine.Def_Space.join(causePlayerDict.values())
|
notifyList = matchNotifyList if retAskType == TeamFBAskType_Match else enterNotifyList
|
for index in xrange(curTeam.GetMemberCount()):
|
memPlayer = curTeam.GetMemberPlayer(index)
|
if not memPlayer:
|
continue
|
memPlayerID = memPlayer.GetPlayerID()
|
if not memPlayerID or memPlayerID not in askPlayerIDList:
|
continue
|
|
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
|
|
#===============================================================================
|
# #class IPY_GTeamEnterFB
|
# #{
|
# #public:
|
# # //ÊÇ·ñ½øÈë
|
# # int GetIsEnter();
|
# #};
|
#===============================================================================
|
##×é¶Ó³ÉÔ±½øÈë¶ÓÎ鸱±¾.
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks MapServer·â°ü´¥·¢, ×é¶Ó³ÉÔ±½øÈë¶ÓÎ鸱±¾
|
def MapServer_PlayerEnterFB(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
return
|
|
pack = IPY_GameServer.IPY_GTeamEnterFB()
|
|
teamMapID = curTeam.GetTeamFBMapID()
|
teamMapFBID = curTeam.GetTeamFBMapFBID()
|
|
playerID = curPlayer.GetPlayerID()
|
playerMapID = curPlayer.GetMapID()
|
playerFBID = curPlayer.GetFBID()
|
playerDataMapID = PlayerFB.GetRecordMapID(playerMapID)
|
|
if pack.GetIsEnter():
|
#Èç¹û¶Ó³¤½øÈ븱±¾£¬Ç¿ÖÆÌæ»»×é¶ÓID
|
if __GetPlayerTeamLV(curPlayer) == IPY_GameServer.tmlLeader:
|
GameWorld.DebugLog("¶Ó³¤½øÈ븱±¾, ¸üÐÂTeamFB! playerMapID=%s,playerFBID=%s,playerDataMapID=%s"
|
% (playerMapID, playerFBID, playerDataMapID), playerID)
|
curTeam.SetTeamFBMapID(playerMapID)
|
curTeam.SetTeamFBMapFBID(playerFBID)
|
__OnPrepareTeamLeaderEnterFB(curTeam, curPlayer, playerDataMapID, playerMapID, playerFBID)
|
|
#Íæ¼Ò½øÈ븱±¾, Èç¹ûµ±Ç°¶ÓÎ鸱±¾IDΪ0 , ÔòÉèÖÃ
|
elif teamMapID == 0:
|
GameWorld.Log("¶ÓÔ±½øÈ븱±¾, teamMapID²»´æÔÚ£¬Ôò¸üÐÂTeamFB! playerMapID=%s,playerFBID=%s"
|
% (playerMapID, playerFBID), playerID)
|
curTeam.SetTeamFBMapID(playerMapID)
|
curTeam.SetTeamFBMapFBID(playerFBID)
|
|
#·ñÔò, ºÍ´ËÍæ¼ÒÈç¹û¸±±¾ID²»Í¬, Ìß³ö¸±±¾
|
elif teamMapID and teamMapID == playerMapID and teamMapFBID != playerFBID:
|
GameWorld.Log('¶ÓÔ±½øÈ븱±¾£¬µ«ÊǽøÈëµÄfbIDÓë¶ÓÎ鲻ͬ£¬Ìß³ö¸ÃÍæ¼Ò£¡teamMapID=%s,teamMapFBID=%s,playerMapID=%s,playerFBID=%s'
|
% (teamMapID, teamMapFBID, playerMapID, playerFBID), playerID)
|
curPlayer.MapServer_LeaveFB()
|
else:
|
GameWorld.DebugLog("¶ÓÔ±³É¹¦½øÈë¶ÓÎéËùÔÚ¸±±¾£¡teamMapID=%s,teamMapFBID=%s" % (teamMapID, teamMapFBID), playerID)
|
else:
|
#Íæ¼ÒÀ뿪¸±±¾, Åж¨ÊÇ·ñ»¹ÓÐÍæ¼ÒÔڴ˸±±¾ÖÐ, Èç¹ûÓÐ, ·µ»Ø, ûÓÐ, ¸Ä¸±±¾IDΪ0
|
if __CheckTeamFBPlayerExist(curTeam):
|
return
|
|
curTeam.SetTeamFBMapID(0)
|
curTeam.SetTeamFBMapFBID(0)
|
#GameWorld.DebugLog("ûÓÐÈËÔÚ¸±±¾ÖÐÁË£¬ÖØÖã¡TeamFBMapID")
|
|
return
|
|
def __OnPrepareTeamLeaderEnterFB(curTeam, leader, leaderDataMapID, leaderMapID, leaderFBID):
|
## Ö´ÐÐ×¼±¸ÖеĶÓÎé¶Ó³¤³É¹¦½øÈ븱±¾ºóÂß¼
|
|
teamID = curTeam.GetTeamID()
|
if not IsInEnterFBTeamPrepare(teamID):
|
GameWorld.DebugLog("·Ç×¼±¸ÖеĶÓÎé²»´¦Àí£¡")
|
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)
|
if not memPlayer or not memPlayer.GetPlayerID():
|
continue
|
|
memPlayerID = memPlayer.GetPlayerID()
|
memMapID = memPlayer.GetMapID()
|
memFBID = memPlayer.GetFBID()
|
memDataMapID = PlayerFB.GetRecordMapID(memMapID)
|
|
# ·Ç×¼±¸¶ÓÁнøÈëµÄ²»Ìß
|
if memDataMapID == leaderDataMapID and (memMapID != leaderMapID or memFBID != leaderFBID):
|
GameWorld.Log('Íæ¼ÒÒò×é¶Ó, ÔÚͬ¸±±¾Öв»Í¬Ïß·£¬Ìß³öÍæ¼Ò! memID=%s,memMapID=%s,memFBID=%s' % (memPlayerID, memMapID, memFBID))
|
memPlayer.MapServer_LeaveFB()
|
|
# ²»ÊÇÔڸø±±¾µÄ ÇÒ ÊÇÒÑ×¼±¸µÄ¶ÓÔ±£¬Ôò¿ÉÒÔ½øÈëÁË
|
if askMapID == leaderDataMapID and memPlayerID in memStateDict and memDataMapID != leaderDataMapID:
|
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):
|
##Íæ¼ÒÀ뿪¸±±¾
|
# @param curTeam ¶ÓÎéʵÀý
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks Íæ¼ÒÀ뿪¸±±¾, Åж¨ÊÇ·ñ»¹ÓÐÍæ¼ÒÔڴ˸±±¾ÖÐ, Èç¹ûÓÐ, ·µ»Ø, ûÓÐ, ¸Ä¸±±¾IDΪ0
|
#Íæ¼ÒÀ뿪¸±±¾, Åж¨ÊÇ·ñ»¹ÓÐÍæ¼ÒÔڴ˸±±¾ÖÐ, Èç¹ûÓÐ, ·µ»Ø, ûÓÐ, ¸Ä¸±±¾IDΪ0
|
|
for i in xrange(curTeam.GetMemberCount()):
|
curMember = curTeam.GetMemberInfo(i)
|
memberPlayer = curMember.GetPlayer()
|
if memberPlayer == None:
|
continue
|
if memberPlayer.GetMapID() == curTeam.GetTeamFBMapID() and memberPlayer.GetFBID() == curTeam.GetTeamFBMapFBID():
|
#GameWorld.DebugLog("³ÉÔ±»¹ÔÚÀïÃæ,memID=%s" % memberPlayer.GetPlayerID())
|
return True
|
return False
|
|
##--------------------------------------------
|
#// B9 10 ²éѯÔÚÏß¶ÓÔ±¶ÔÓ¦¹¦ÄÜÊý¾Ý #tagCGQueryTeamMemFuncData
|
#
|
#struct tagCGQueryTeamMemFuncData
|
#{
|
# tagHead Head;
|
# BYTE TeamMemFuncType; // ²éѯ¶ÓÔ±µÄ¹¦ÄÜÊý¾ÝÀàÐÍ
|
#};
|
def OnQueryTeamMemFuncData(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
return
|
|
teamID = curTeam.GetTeamID()
|
queryMemDict = {}
|
playerID = curPlayer.GetPlayerID()
|
queryFuncType = clientData.TeamMemFuncType
|
key = (queryFuncType, teamID, playerID)
|
|
for i in xrange(curTeam.GetMemberCount()):
|
memPlayer = curTeam.GetMemberPlayer(i)
|
#¹ýÂ˲»ÔÚÏߵijÉÔ±
|
if memPlayer == None or memPlayer.GetPlayerID() == 0:
|
continue
|
memMapID = GameWorld.GetQueryPlayerMapID(memPlayer)
|
if not memMapID:
|
continue
|
memPlayerID = memPlayer.GetPlayerID()
|
queryMemDict[memPlayerID] = [memMapID, memPlayer.GetRouteServerIndex()]
|
|
queryMemIDList = queryMemDict.keys()
|
PyGameData.g_queryTeamMemFuncDataDict[key] = [queryMemIDList, {}]
|
|
for memPlayerID in queryMemIDList:
|
memMapID, routeServerIndex = queryMemDict[memPlayerID]
|
sendCMD = str([queryFuncType, teamID, memPlayerID])
|
GameWorld.GetPlayerManager().MapServer_QueryPlayer(playerID, 0, memPlayerID, memMapID, "TeamMemFuncData",
|
sendCMD, len(sendCMD), routeServerIndex)
|
return
|
|
def MapServer_TeamMemFuncData(srcPlayerID, msgList):
|
queryFuncType, teamID, memPlayerID = msgList[:3]
|
queryFuncRet = str(msgList[3]) if len(msgList) > 3 else ""
|
GameWorld.DebugLog("MapServer_TeamMemFuncData srcPlayerID=%s,queryFuncType=%s,teamID=%s,memPlayerID=%s,queryFuncRet=%s"
|
% (srcPlayerID, queryFuncType, teamID, memPlayerID, queryFuncRet))
|
key = (queryFuncType, teamID, srcPlayerID)
|
if key not in PyGameData.g_queryTeamMemFuncDataDict:
|
return
|
queryMemIDList, queryRetDict = PyGameData.g_queryTeamMemFuncDataDict[key]
|
queryRetDict[memPlayerID] = queryFuncRet
|
|
for memID in queryMemIDList:
|
if memID not in queryRetDict:
|
#GameWorld.DebugLog(" »¹ÓгÉԱδ»Ø¸´²éѯ½á¹û£¡queryMemIDList=%s" % queryMemIDList)
|
return
|
|
# ¶¼»Ø¸´ÁË£¬Í¨Öª²éѯµÄÍæ¼Ò
|
queryMemIDList, queryRetDict = PyGameData.g_queryTeamMemFuncDataDict.pop(key)
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
|
if not curPlayer:
|
return
|
GameWorld.DebugLog("Í¨ÖªÍæ¼Ò²éѯ¶ÓÔ±¹¦ÄÜÊý¾Ý½á¹û: queryRetDict=%s" % queryRetDict, srcPlayerID)
|
|
memFuncDataPack = ChPyNetSendPack.tagGCTeamMemFuncDataList()
|
memFuncDataPack.TeamMemFuncType = queryFuncType
|
memFuncDataPack.MemFuncDataList = []
|
for memPlayerID, queryFuncRet in queryRetDict.items():
|
memFuncData = ChPyNetSendPack.tagGCTeamMemFuncData()
|
memFuncData.PlayerID = memPlayerID
|
memFuncData.MemFuncData = queryFuncRet
|
memFuncData.DataLen = len(memFuncData.MemFuncData)
|
memFuncDataPack.MemFuncDataList.append(memFuncData)
|
memFuncDataPack.MemCount = len(memFuncDataPack.MemFuncDataList)
|
NetPackCommon.SendFakePack(curPlayer, memFuncDataPack)
|
return
|
|
def DoTeamProcess(tick):
|
__PrepareTeamTimeoutLogic(tick)
|
return
|
|
def __PrepareTeamTimeoutLogic(tick):
|
'''×¼±¸¶ÓÎéÒì³£´¦Àí
|
ºó¶ËÑÓ³¤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
|
|
teamMgr = GameWorld.GetTeamManager()
|
TeamReadyTime = IpyGameDataPY.GetFuncCfg("TeamReadyTime", 1)
|
TeamReadyTime = (TeamReadyTime + 15) * 1000
|
for teamID, prepareInfo in PyGameData.g_prepareTeamDict.items():
|
askMapID, askMapEx, memStateDict, startTick = prepareInfo
|
if tick - startTick <= TeamReadyTime:
|
continue
|
|
PyGameData.g_prepareTeamDict.pop(teamID)
|
GameWorld.ErrLog("¶ÓÎé×¼±¸³¬Ê±£¬Ç¿Öƽâ³ý¶ÓÎé×¼±¸×´Ì¬! teamID=%s,askMapID=%s,askMapEx=%s,memStateDict=%s,startTick=%s,tick=%s"
|
% (teamID, askMapID, askMapEx, memStateDict, startTick, tick))
|
curTeam = teamMgr.FindTeam(teamID)
|
if curTeam:
|
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
|
|