#!/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 ¶Ô²»Æð,ÄúûÓÐÊÕÈËȨÏÞ,ÕÐÊÕ¶ÓԱʧ°Ü! 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: #{%S1%}³ÉΪÁËеĶӳ¤! PlayerControl.NotifyCode(tagPlayer.GetTeam(), "InsteadHeader", [tagPlayer.GetName()]) elif teamLV == IPY_GameServer.tmlMemberCanCall: #{%S1%}±»¶Ó³¤¸³ÓèÁËÕÐÈËȨÏÞ! # EndowPopedom ¸ÄΪ GeRen_chenxin_76326 PlayerControl.NotifyCode(tagPlayer.GetTeam(), "GeRen_chenxin_76326", [tagPlayer.GetName()]) elif teamLV == IPY_GameServer.tmlMember: #֪ͨ:{%S1%}±»¶Ó³¤ÊÕ»ØÁËÕÐÈËȨÏÞ 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): ##»ñµÃ¶ÓÎéÊ£ÓàÔÚÏßÈËÊý count = 0 for i in xrange(curTeam.GetMemberCount()): curPlayer = curTeam.GetMemberPlayer(i) if curPlayer == None: 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