#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GM.Commands.CrossFB
|
#
|
# @todo:¿ç·þ¸±±¾
|
# @author hxp
|
# @date 2022-01-06
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ç·þ¸±±¾
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2022-01-06 20:30"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import PyGameData
|
import IpyGameDataPY
|
import PlayerFB
|
|
#---------------------------------------------------------------------
|
#Â߼ʵÏÖ
|
## Ö´ÐÐÂß¼
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param gmList [cmdIndex gmAccID msg]
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def OnExec(curPlayer, gmList):
|
## ±¾·þ´¦Àí
|
GameWorld.DebugAnswer(curPlayer, "----------------------------")
|
if not gmList:
|
GameWorld.DebugAnswer(curPlayer, "Êä³öÈËÊý: CrossFB mapID")
|
GameWorld.DebugAnswer(curPlayer, "ÐéÄâ½øÈë: CrossFB mapID ¹¦ÄÜÏß· ÈËÊý µÈ¼¶")
|
GameWorld.DebugAnswer(curPlayer, "Ìí¼ÓÈËÊý: CrossFB 1 ³¡¾°ID ÐéÄâÏß· ÔÚÏß ÀëÏß")
|
GameWorld.DebugAnswer(curPlayer, "¿Û³ýÈËÊý: CrossFB 2 ³¡¾°ID ÐéÄâÏß· ÔÚÏß ÀëÏß")
|
return
|
|
def OnMergeServerExec(gmList, tick):
|
## ¿ç·þ´¦Àí
|
|
serverGroupID = gmList[-2]
|
playerID = gmList[-1]
|
|
dynamicLineMapDict = IpyGameDataPY.GetFuncEvalCfg("CrossDynamicLineMap", 1, {})
|
gmList = gmList[:-2]
|
if not gmList:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "---ÒÔÏÂΪ¿É·ÖÁ÷³¡¾°ÐéÄâÏß·ÌõÊý")
|
for mapID, mapIDList in dynamicLineMapDict.items():
|
gameMap = GameWorld.GetMap(mapID)
|
if not gameMap:
|
continue
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "¶¯Ì¬·ÖÁ÷: %s¡¾mapID:%s¡¿" % (gameMap.GetMapName(), mapID))
|
for realMapID in mapIDList:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, " ·ÖÁ÷³¡¾°ÐéÄâÏß·Êý:%s\t%s"
|
% (realMapID, PyGameData.g_crossMapCopyMapCountDict.get(realMapID, 0)))
|
return
|
|
value0 = gmList[0]
|
mapID = value0
|
if value0 in [1, 2]:
|
if len(gmList) != 5:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "²ÎÊý²»×㣬ÇëÖØÐÂÊäÈë")
|
return
|
realMapID, copyMapID, fbPlayerCount, offlineCount = gmList[1:]
|
|
key = (realMapID, copyMapID)
|
if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "²»´æÔڸó¡¾°Ïß·»ò먦Æô!realMapID=%s,copyMapID=%s" % (realMapID, copyMapID))
|
return
|
copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key] # CrossCopyMapInfo
|
|
mapID = __GetMapIDByRealMapID(dynamicLineMapDict, realMapID)
|
if mapID not in dynamicLineMapDict:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "·ÖÁ÷³¡¾°µØÍ¼´íÎó")
|
return
|
|
# Ìí¼Ó
|
if value0 == 1:
|
robotID = __GetMapRobotID(dynamicLineMapDict[mapID])
|
for _ in xrange(fbPlayerCount):
|
robotID += 1
|
copyMapObj.fbPlayerDict[robotID] = serverGroupID
|
|
for _ in xrange(offlineCount):
|
robotID += 1
|
copyMapObj.offlinePlayerDict[robotID] = serverGroupID
|
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "³¡¾°%sÏß%s:Ìí¼ÓÔÚÏß(%s),ÀëÏß(%s)" % (realMapID, copyMapID, fbPlayerCount, offlineCount))
|
|
# ¿Û³ý
|
else:
|
delFBPlayerCount, delOfflinePlayerCount = 0, 0
|
fbPlayerIDList = copyMapObj.fbPlayerDict.keys()
|
for pID in fbPlayerIDList:
|
if pID < 10000:
|
copyMapObj.fbPlayerDict.pop(pID, 0)
|
delFBPlayerCount += 1
|
if delFBPlayerCount >= fbPlayerCount:
|
break
|
|
offlinePlayerIDList = copyMapObj.offlinePlayerDict.keys()
|
for pID in offlinePlayerIDList:
|
if pID < 10000:
|
copyMapObj.offlinePlayerDict.pop(pID, 0)
|
delOfflinePlayerCount += 1
|
if delOfflinePlayerCount >= offlineCount:
|
break
|
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "³¡¾°%sÏß%s:ɾ³ýÔÚÏß(%s),ÀëÏß(%s)" % (realMapID, copyMapID, delFBPlayerCount, delOfflinePlayerCount))
|
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount = len(copyMapObj.waitPlayerDict), len(copyMapObj.fbPlayerDict), len(copyMapObj.offlinePlayerDict)
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, " %s,¹¦ÄÜÇø-Ïß-³¡:%s-%s-%s,µÈ´ý%s,¸±±¾%s,ÀëÏß%s"
|
% (copyMapID, copyMapObj.zoneID, copyMapObj.funcLineID, copyMapObj.newFuncLineNum,
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount))
|
|
# ÐéÄâÍæ¼Ò½øÈë: CrossFB mapID funcLineID µÈ¼¶ ÈËÊý
|
elif len(gmList) >= 4:
|
mapID, funcLineID, enterCount, lv = gmList
|
if mapID not in dynamicLineMapDict:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "mapID´íÎó")
|
return
|
|
robotID = __GetMapRobotID(dynamicLineMapDict[mapID])
|
|
GameWorld.DebugLog("mapID=%s,robotID=%s" % (mapID, robotID))
|
okCount = 0
|
copyMapObj = None
|
for _ in xrange(enterCount):
|
robotID += 1
|
msgData = {"PlayerID":robotID, "MapID":mapID, "FuncLineID":funcLineID, "LV":lv}
|
copyMapObj = PlayerFB.ClientServerMsg_EnterFB(serverGroupID, msgData, tick)
|
if not copyMapObj:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "½øÈëʧ°Ü£¬²é¿´¿ç·þGameServerÈÕÖ¾")
|
break
|
okCount += 1
|
copyMapObj.waitPlayerDict.pop(robotID, None)
|
copyMapObj.offlinePlayerDict.pop(robotID, None)
|
copyMapObj.fbPlayerDict[robotID] = serverGroupID
|
|
if copyMapObj:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "ÐéÄâ½øÈë:%s - %s, LV:(%s), ¸öÊý(%s), ³É¹¦(%s)" % (mapID, funcLineID, lv, enterCount, okCount))
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount = len(copyMapObj.waitPlayerDict), len(copyMapObj.fbPlayerDict), len(copyMapObj.offlinePlayerDict)
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, " %s,¹¦ÄÜÇø-Ïß-³¡:%s-%s-%s,µÈ´ý%s,¸±±¾%s,ÀëÏß%s"
|
% (copyMapObj.copyMapID, copyMapObj.zoneID, copyMapObj.funcLineID, copyMapObj.newFuncLineNum,
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount))
|
|
elif len(gmList) == 1:
|
pass
|
else:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "²ÎÊý¸öÊý´íÎó!")
|
return
|
|
gameMap = GameWorld.GetMap(mapID)
|
if mapID not in dynamicLineMapDict or not gameMap:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "²»´æÔڸ÷ÖÁ÷¸±±¾µØÍ¼! %s" % mapID)
|
return
|
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "---·ÖÁ÷³¡¾°Ã÷ϸ: %s¡¾mapID:%s¡¿" % (gameMap.GetMapName(), mapID))
|
dynamicMapIDList = dynamicLineMapDict[mapID]
|
for realMapID in dynamicMapIDList:
|
copyMapCount = PyGameData.g_crossMapCopyMapCountDict.get(realMapID, 0)
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, "·ÖÁ÷³¡¾°¡¾%s¡¿ÐéÄâÏß·Êý%sÌõ" % (realMapID, copyMapCount))
|
|
playerCountTotal = 0
|
for copyMapID in xrange(copyMapCount):
|
key = (realMapID, copyMapID)
|
if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
|
continue
|
copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key] # CrossCopyMapInfo
|
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount = len(copyMapObj.waitPlayerDict), len(copyMapObj.fbPlayerDict), len(copyMapObj.offlinePlayerDict)
|
playerCount = waitPlayerCount + fbPlayerCount + offlinePlayerCount
|
#if not playerCount:
|
# continue
|
|
playerCountTotal += playerCount
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, " %s,¹¦ÄÜÇø-Ïß-³¡:%s-%s-%s,µÈ´ý%s,¸±±¾%s,ÀëÏß%s"
|
% (copyMapID, copyMapObj.zoneID, copyMapObj.funcLineID, copyMapObj.newFuncLineNum,
|
waitPlayerCount, fbPlayerCount, offlinePlayerCount))
|
|
if not playerCountTotal:
|
GameWorld.DebugAnswerCross(playerID, serverGroupID, " ¸Ã·ÖÁ÷³¡¾°µØÍ¼Ã»ÈË!")
|
|
return
|
|
def OnGetMergeParam(curPlayer):
|
playerID = curPlayer.GetPlayerID()
|
serverGroupID = GameWorld.GetServerGroupID()
|
return [serverGroupID, playerID]
|
|
def __GetMapIDByRealMapID(dynamicLineMapDict, realMapID):
|
for mapID, mapIDList in dynamicLineMapDict.items():
|
if realMapID in mapIDList:
|
return mapID
|
return 0
|
|
def __GetMapRobotID(dynamicMapIDList):
|
robotID = 0
|
for realMapID in dynamicMapIDList:
|
copyMapCount = PyGameData.g_crossMapCopyMapCountDict.get(realMapID, 0)
|
for copyMapID in xrange(copyMapCount):
|
key = (realMapID, copyMapID)
|
if key not in PyGameData.g_crossDynamicLineCopyMapInfo:
|
continue
|
copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key] # CrossCopyMapInfo
|
playerIDList = list(set(copyMapObj.waitPlayerDict.keys() + copyMapObj.fbPlayerDict.keys() + copyMapObj.offlinePlayerDict.keys()))
|
for playerID in playerIDList:
|
if playerID < 10000 and playerID > robotID:
|
robotID = playerID
|
return robotID
|