| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldSkyTower  | 
| #  | 
| # @todo:ÌìÐÇËþ  | 
| # @author hxp  | 
| # @date 2020Äê03ÔÂ02ÈÕ  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÌìÐÇËþ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2020Äê03ÔÂ02ÈÕ 20:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import ShareDefine  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import PlayerViewCache  | 
| import IpyGameDataPY  | 
|   | 
| ConfigExKey_SkyTowerPassPlayerIDList = "SkyTowerPassPlayerIDList"  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|     Sync_SkyTowerPassPlayer(curPlayer)  | 
|     return  | 
|   | 
| def __GetPassPlayerRecDataByFloorID(floorID):  | 
|     ## »ñÈ¡¹ý¹Ø²ã¼Ç¼Êý¾Ý  | 
|     recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|       | 
|     recData = None  | 
|     for index in xrange(recTypeListData.Count()):  | 
|         universalRecData = recTypeListData.At(index)  | 
|         if universalRecData.GetValue1() == floorID:  | 
|             recData = universalRecData  | 
|             break  | 
|           | 
|     return recData  | 
|   | 
| def MapServer_SkyTowerInfo(curPlayer, msgList):  | 
|     ## ÌìÐÇËþ¹ý¹Ø  | 
|     msgType, msgData = msgList  | 
|       | 
|     # ¹ý¹Ø  | 
|     if msgType == "ServerChallengePass":  | 
|         rankIndex = __OnServerChallengePass(curPlayer, msgData)  | 
|         return msgList + [rankIndex]  | 
|       | 
|     # Áì½±  | 
|     if msgType == "ServerChallengeReward":  | 
|         floorID, needPlayerCount, _ = msgData  | 
|         recData = __GetPassPlayerRecDataByFloorID(floorID)  | 
|         passPlayerIDList = __GetPassPlayerIDList(recData)  | 
|         canGet = 1 if len(passPlayerIDList) >= needPlayerCount else 0  | 
|         return msgList + [canGet]  | 
|       | 
|     # ºÏ·þÊ×µÇ  | 
|     if msgType == "MixFirstLogin":  | 
|         __OnMixFirstLogin(curPlayer, msgData)  | 
|         return  | 
|       | 
|     return  | 
|   | 
| def __OnMixFirstLogin(curPlayer, msgData):  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     passFloorInfo = msgData[0]  | 
|       | 
|     GameWorld.Log("ºÏ·þÊ×µÇÌî³äÌìÐÇËþÈ«·þ¹ý¹ØÐÅÏ¢: %s" % passFloorInfo, playerID)  | 
|     syncRecDataList = []  | 
|     recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|     for index in xrange(recTypeListData.Count()):  | 
|         recData = recTypeListData.At(index)  | 
|         floorID = recData.GetValue1()  | 
|         if floorID not in passFloorInfo:  | 
|             continue  | 
|         maxNeedPassCount = passFloorInfo.pop(floorID)  | 
|         passPlayerIDList = __GetPassPlayerIDList(recData)  | 
|         if playerID in passPlayerIDList:  | 
|             continue  | 
|         if len(passPlayerIDList) >= maxNeedPassCount:  | 
|             continue  | 
|         __AddPassPlayerIDList(recData, passPlayerIDList, playerID)  | 
|         syncRecDataList.append(recData)  | 
|         GameWorld.Log("    Ìí¼ÓÌìÐÇËþ¹ý¹Ø¼Ç¼: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)  | 
|           | 
|     for floorID, maxNeedPassCount in passFloorInfo.items():  | 
|         recData = recTypeListData.AddRec()  | 
|         recData.SetValue1(floorID)  | 
|         passPlayerIDList = []  | 
|         __AddPassPlayerIDList(recData, passPlayerIDList, playerID)  | 
|         syncRecDataList.append(recData)  | 
|         GameWorld.Log("    ÐÂÔöÌìÐÇËþ¹ý¹Ø¼Ç¼: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)  | 
|           | 
|     if syncRecDataList:  | 
|         Sync_SkyTowerPassPlayer(None, syncRecDataList)  | 
|           | 
|     return  | 
|   | 
| def __GetPassPlayerIDList(recData):  | 
|     strValue3 = recData.GetStrValue3()  | 
|     try:  | 
|         passPlayerIDList = eval(strValue3) if strValue3 else []  | 
|     except:  | 
|         passPlayerIDList = []  | 
|     return passPlayerIDList  | 
|   | 
| def __AddPassPlayerIDList(recData, passPlayerIDList, playerID):  | 
|     isAdd = False  | 
|     if playerID not in passPlayerIDList:  | 
|         passPlayerIDList.append(playerID)  | 
|         isAdd = True  | 
|     updStr = str(passPlayerIDList).replace(" ", "")  | 
|     if len(updStr) > 255:  | 
|         passPlayerIDList.remove(playerID)  | 
|         updStr = str(passPlayerIDList).replace(" ", "")  | 
|         isAdd = False  | 
|     recData.SetStrValue3(updStr)  | 
|     if isAdd:  | 
|         SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)  | 
|         if SkyTowerPassPlayerIDList and playerID not in SkyTowerPassPlayerIDList:  | 
|             SkyTowerPassPlayerIDList.append(playerID)  | 
|             IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)  | 
|             GameWorld.DebugLog("__AddPassPlayerIDList SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)  | 
|     return passPlayerIDList  | 
|   | 
| def IsSkyTowerPassPlayer(playerID):  | 
|     SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)  | 
|     if not SkyTowerPassPlayerIDList:  | 
|         SkyTowerPassPlayerIDList = []  | 
|         recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|         for index in xrange(recTypeListData.Count()):  | 
|             recData = recTypeListData.At(index)  | 
|             passPlayerIDList = __GetPassPlayerIDList(recData)  | 
|             for pID in passPlayerIDList:  | 
|                 if pID not in SkyTowerPassPlayerIDList:  | 
|                     SkyTowerPassPlayerIDList.append(pID)  | 
|         IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)  | 
|     GameWorld.DebugLog("IsSkyTowerPassPlayer SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)  | 
|     return playerID in SkyTowerPassPlayerIDList  | 
|   | 
| def __OnServerChallengePass(curPlayer, msgData):  | 
|     ## È«·þÌôÕ½²ã¹ý¹Ø  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     floorID, maxNeedPassCount, _ = msgData  | 
|     GameWorld.DebugLog("ÐÂÔöÌìÐÇËþÈ«·þÌôÕ½²ã¹ý¹Ø¼Ç¼! floorID=%s,maxNeedPassCount=%s" % (floorID, maxNeedPassCount), playerID)  | 
|       | 
|     recData = __GetPassPlayerRecDataByFloorID(floorID)  | 
|     if not recData:  | 
|         recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|         recData = recTypeListData.AddRec()  | 
|         recData.SetValue1(floorID)  | 
|           | 
|     passPlayerIDList = __GetPassPlayerIDList(recData)  | 
|     if len(passPlayerIDList) >= maxNeedPassCount:  | 
|         return -1  | 
|       | 
|     passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, playerID)      | 
|     # ¹ã²¥µ¥ÌõÊý¾Ý  | 
|     Sync_SkyTowerPassPlayer(None, [recData])  | 
|     return passPlayerIDList.index(playerID)  | 
|   | 
| def GMAddRobotPassFloor(floorID, robotCount):  | 
|     recData = __GetPassPlayerRecDataByFloorID(floorID)  | 
|     if not recData:  | 
|         recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|         recData = recTypeListData.AddRec()  | 
|         recData.SetValue1(floorID)  | 
|           | 
|     robotID = 0  | 
|     passPlayerIDList = __GetPassPlayerIDList(recData)  | 
|     for _ in range(robotCount):  | 
|         robotID += 1  | 
|         passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, robotID)  | 
|           | 
|     GameWorld.DebugLog("GMÌí¼ÓÌìÐÇËþ»úÆ÷È˹ý¹ØÈ«·þ²ã: floorID=%s,robotCount=%s,passPlayerIDList=%s"   | 
|                        % (floorID, robotCount, passPlayerIDList))  | 
|     # ¹ã²¥µ¥ÌõÊý¾Ý  | 
|     Sync_SkyTowerPassPlayer(None, [recData])  | 
|     return  | 
|   | 
| def GMClearPassFloor():  | 
|     recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|     recTypeListData.Clear()  | 
|     IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, [])  | 
|     GameWorld.DebugLog("GMÇå¿ÕÌìÐÇËþÈ«·þ¹ý¹ØÐÅÏ¢")  | 
|     return  | 
|   | 
| def Sync_SkyTowerPassPlayer(curPlayer=None, recDataList=None):  | 
|     if recDataList == None:  | 
|         recDataList = []  | 
|         recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)  | 
|         for index in xrange(recTypeListData.Count()):  | 
|             recDataList.append(recTypeListData.At(index))  | 
|               | 
|     passFloorList = []  | 
|     passPlayerIDList = []  | 
|     for recData in recDataList:  | 
|         floorID = recData.GetValue1()  | 
|         playerIDList = __GetPassPlayerIDList(recData)  | 
|         for playerID in playerIDList:  | 
|             if playerID not in passPlayerIDList:  | 
|                 passPlayerIDList.append(playerID)  | 
|                   | 
|         passFloorInfo = ChPyNetSendPack.tagGCSkyTowerPassFloor()  | 
|         passFloorInfo.FloorID= floorID  | 
|         passFloorInfo.PassPlayerIDList = playerIDList  | 
|         passFloorInfo.PassPlayerCount = len(passFloorInfo.PassPlayerIDList)  | 
|         passFloorList.append(passFloorInfo)  | 
|           | 
|     if not passFloorList and not passPlayerIDList:  | 
|         return  | 
|       | 
|     passPlayerList = []  | 
|     for playerID in passPlayerIDList:  | 
|         curCache = PlayerViewCache.FindViewCache(playerID)  | 
|         cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) if curCache else {}  | 
|           | 
|         playerInfo = ChPyNetSendPack.tagGCSkyTowerPassPlayer()  | 
|         playerInfo.PlayerID = playerID  | 
|         playerInfo.PlayerName = ("robot%s" % playerID) if playerID < 1000 else cacheDict.get("Name", str(playerID))  | 
|         playerInfo.Job = cacheDict.get("Job", 1)  | 
|         playerInfo.LV = cacheDict.get("LV", 1)  | 
|         playerInfo.RealmLV = cacheDict.get("RealmLV", 0)  | 
|         playerInfo.Face = cacheDict.get("Face", 0)  | 
|           | 
|         passPlayerList.append(playerInfo)  | 
|           | 
|     clientPack = ChPyNetSendPack.tagGCSkyTowerPassPlayerInfo()  | 
|     clientPack.Clear()  | 
|     clientPack.PassFloorList = passFloorList  | 
|     clientPack.FloorCount = len(clientPack.PassFloorList)  | 
|     clientPack.PassPlayerList = passPlayerList  | 
|     clientPack.PlayerCount = len(clientPack.PassPlayerList)  | 
|       | 
|     if curPlayer:  | 
|         NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     else:          | 
|         playerManager = GameWorld.GetPlayerManager()  | 
|         for i in range(0, playerManager.GetPlayerCount()):  | 
|             curPlayer = playerManager.GetPlayerByIndex(i)  | 
|             if curPlayer == None or not curPlayer.GetInitOK():  | 
|                 continue  | 
|             NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  |