| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_SkyTower  | 
| #  | 
| # @todo:ÌìÐÇËþ  | 
| # @author xdh  | 
| # @date 2019-05-09  | 
| # @version 1.0  | 
| # ÏêϸÃèÊö: ÌìÐÇËþ  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2019-05-09 11:00"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import PlayerControl  | 
| import NPCCustomRefresh  | 
| import ChPyNetSendPack  | 
| import ItemControler  | 
| import EventShell  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import IpyGameDataPY  | 
| import ChConfig  | 
| import ChPlayer  | 
| import PlayerActivity  | 
| import PlayerBillboard  | 
| import PlayerSuccess  | 
|   | 
|   | 
| g_runeTypeDict = {}  | 
| FBDict_Level = 'FBDict_Level'   # ¸±±¾¹Ø¿¨  | 
|   | 
|   | 
| # ¸±±¾Í¨ÓÃÅäÖà  | 
| (  | 
| Def_PrepareTime, # Ã¿¹Ø×¼±¸Ê±¼ä£¬Ãë  | 
| Def_FightTime, # Ã¿¹ØÕ½¶·Ê±¼ä£¬Ãë  | 
| Def_ExitTime, # Í˳öʱ¼ä, Ãë  | 
| Def_DayPrizeMaxCnt, #ÿÈÕ½±Àø×î¶àÀÛ»ý¼¸Ì죨Åä0ÔòÎÞÏÞ£©  | 
| ) = range(4)  | 
|   | 
|   | 
|   | 
|   | 
| # ¸±±¾×´Ì¬  | 
| (  | 
| FB_State_Open, # ¸±±¾¿ªÆô  | 
| FB_State_FightPrepare, # Õ½¶·×¼±¸Ê±¼ä  | 
| FB_State_Fighting, # Õ½¶·  | 
| FB_State_FreeTime, # »î¶¯½áÊø×¼±¸£¨Ê¤Àû/ʧ°Ü£©  | 
| FB_State_Close, # ¹Ø±Õ¸±±¾  | 
| ) = range(5)  | 
|   | 
|   | 
| ## ÌìÐÇËþÅäÖà  | 
| def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SkyTower)  | 
|   | 
| def GetTowerIpyData(floor):  | 
|     return IpyGameDataPY.GetIpyGameData('SkyTower', floor)  | 
|   | 
| def OnFBPlayerOnLogin(curPlayer):  | 
|     SyncSkyTowerInfo(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## Í¬²½ÌìÐÇËþ¹Ø¿¨ÐÅÏ¢  | 
| #  @floorID Îª0ʱĬÈÏÈ«²¿Í¬²½£¬> 0ʱ½öͬ²½¸Ã¹Ø¿¨  | 
| def SyncSkyTowerInfo(curPlayer):  | 
|     ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo()  | 
|     ttInfo.Clear()  | 
|     ttInfo.Floor = __GetSkyTowerCurFloor(curPlayer)  | 
|     ttInfo.ServerRewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)  | 
|     NetPackCommon.SendFakePack(curPlayer, ttInfo)  | 
|     return  | 
|   | 
| ## »ñÈ¡µ±Ç°ÒÑͨ¹Ø¹Ø¿¨  | 
| def __GetSkyTowerCurFloor(curPlayer):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)  | 
|   | 
| ## ¸üе±Ç°ÒÑͨ¹Ø¹Ø¿¨  | 
| def SetSkyTowerCurfloorID(curPlayer, floorID):  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, floorID)  | 
|   | 
|     #ÈÎÎñ  | 
|     EventShell.EventRespons_SkyTowerCnt(curPlayer, floorID)  | 
|     #ͨ¹Ø·ûÓ¡Ëþ³É¾Í  | 
|     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_PassSkyTower, floorID)  | 
|     GameWorld.DebugLog(' ¸üÐÂÌìÐÇËþÒÑͨ¹ØÊý %s' % floorID)  | 
|     return  | 
|   | 
| ## ÊÇ·ñ¿É½øÈë  | 
| #  @param curPlayer  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineId ·ÖÏßID  | 
| #  @param tick  | 
| #  @return ÊÇ·ñ¿É½øÈë  | 
| def OnEnterFBEvent(curPlayer, mapID, lineId, tick):  | 
|     return True  | 
|   | 
|   | 
| ## ¼ì²é¿É·ñ½øÐÐÌôÕ½  | 
| def __CheckCanChallenge(curPlayer, floorID):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     ipyData = GetTowerIpyData(floorID)  | 
|       | 
|     if not ipyData:  | 
|         GameWorld.ErrLog("ÌìÐÇËþ¹Ø¿¨(%s)²»´æÔÚ" % (floorID), playerID)  | 
|         return False  | 
|       | 
|     # ÊÇ·ñÒѹý¹Ø  | 
|     if floorID <= __GetSkyTowerCurFloor(curPlayer):  | 
|         GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø(%s)Òѹý¹Ø, ÎÞ·¨ÌôÕ½!" % floorID, playerID)  | 
|         return False  | 
|       | 
|     if curPlayer.GetLV() < ipyData.GetNeedLV():  | 
|         GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø  µÈ¼¶²»×ã%s, ÎÞ·¨ÌôÕ½!" % ipyData.GetNeedLV(), playerID)  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢  | 
| # @param tick Ê±¼ä´Á  | 
| # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡)  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
|   | 
| ## ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| #  @param ask ÇëÇóÐÅÏ¢  | 
| #  @param tick  | 
| #  @return »Ø¸´ÊÇ·ñͨ¹ýÇëÇó  | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
| ## ½ø¸±±¾  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return None  | 
| def DoEnterFB(curPlayer, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if fbStep == FB_State_FightPrepare:  | 
|         notify_tick = __GetTrialCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)  | 
|           | 
|     elif fbStep == FB_State_Fighting:  | 
|         notify_tick = __GetTrialCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)  | 
|     elif fbStep > FB_State_Fighting:  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         return  | 
|   | 
|   | 
|     # ²»×ö´¦Àí£¬Óи±±¾ÐÐΪ¿Í»§¶Ë·¢°üÑ¡ÔñÌôÕ½¹Ø¿¨  | 
|     #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SkyTower, 0, ChConfig.CME_Log_Start)  | 
|     return  | 
|   | 
|   | 
| ## ¸±±¾Ê±¼äµ½¹Ø±Õ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnCloseFB(tick):  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoExitFB(curPlayer, tick):  | 
|     # Íæ¼ÒÍ˳öĬÈϹرո±±¾  | 
|     #GameWorldProcess.CloseFB(tick)  | 
|     return  | 
|   | 
|   | 
| ##¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| def OnProcess(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if fbStep == FB_State_FightPrepare:  | 
|         __DoLogic_FightPrepare(tick)  | 
|     elif fbStep == FB_State_Fighting:  | 
|         __DoLogic_Fighting(tick)  | 
|     elif fbStep == FB_State_FreeTime:  | 
|         __DoLogic_FreeTime(tick)  | 
|     elif fbStep == FB_State_Close:  | 
|         pass  | 
|       | 
|     return  | 
|   | 
| ## »ñÈ¡BossID  | 
| def __GetSkyTowerBossID(floorID= -1):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if floorID == -1:  | 
|         floorID = gameFB.GetGameFBDictByKey(FBDict_Level)  | 
|     ipyData = GetTowerIpyData(floorID)  | 
|       | 
|     if not ipyData:  | 
|         GameWorld.ErrLog("__GetSkyTowerBossID() can not find %s in SkyTowerNPC.txt" % floorID)  | 
|         return 0  | 
|     return ipyData.GetBossID()  | 
|   | 
| ##Õ½¶·×¼±¸Ê±¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __DoLogic_FightPrepare(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     trialCfg = __GetTrialCfg()  | 
|     if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:  | 
|         return  | 
|       | 
|     bossID = __GetSkyTowerBossID()  | 
|     if not bossID:  | 
|         FBCommon.DoLogic_FBKickAllPlayer()  | 
|         return  | 
|       | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000)  | 
|       | 
|     NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_SkyTower, 0), [bossID])  | 
|       | 
|     #תÈëÕ½¶·  | 
|     FBCommon.SetFBStep(FB_State_Fighting, tick)  | 
|     return  | 
|   | 
| ## ¿ªÊ¼¸±±¾¹Ø¿¨  | 
| def StartfloorID(curPlayer, floorID, tick):  | 
|     if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:  | 
|         GameWorld.DebugLog("¸´»îÍæ¼Ò...", curPlayer.GetPlayerID())  | 
|         ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)  | 
|     curPlayer.SetHP(curPlayer.GetMaxHP())  | 
|     FBCommon.ClearFBNPC()  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetGameFBDict(FBDict_Level, floorID)  | 
|       | 
|     prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000  | 
|       | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)  | 
|     FBCommon.SetFBStep(FB_State_FightPrepare, tick)  | 
|     helpDict = {FBCommon.Help_wheel:floorID}  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s"   | 
|                        % (floorID, str(helpDict)), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
|   | 
| ##Õ½¶·Ê±¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __DoLogic_Fighting(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     #ÅжÏʱ¼ä½áÊø  | 
|     if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:  | 
|         return  | 
|       | 
|     floorID = gameFB.GetGameFBDictByKey(FBDict_Level)  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|         __SendSkyTowerOverInfo(curPlayer, floorID, False)  | 
|       | 
|     #ÓÎÏ·½áÊø  | 
|     __SetFBToFreeTime(tick)  | 
|     return  | 
|   | 
| ##ÉèÖø±±¾½øÈëÀ뿪״̬  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __SetFBToFreeTime(tick):  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetTrialCfg()[Def_ExitTime] * 1000)  | 
|     FBCommon.SetFBStep(FB_State_FreeTime, tick)  | 
|     return  | 
|   | 
| ##±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä  | 
| def __DoLogic_FreeTime(tick):  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetTrialCfg()[Def_ExitTime] * 1000:  | 
|         return  | 
|       | 
|     #FBCommon.DoLogic_FBKickAllPlayer()  | 
|     return  | 
|   | 
| ## É±¹Ö  | 
| #  @param curPlayer  | 
| #  @param curNPC ±»É±µÄ¹Ö  | 
| #  @param tick  | 
| #  @return None  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_State_Fighting:  | 
|         return  | 
|     bossID = __GetSkyTowerBossID()  | 
|     if bossID != curNPC.GetNPCID():  | 
|         return  | 
|       | 
|       | 
|     floorID = gameFB.GetGameFBDictByKey(FBDict_Level)  | 
|               | 
|     # ¹ý¹ØÈ«·þ¹ã²¥  | 
|     ipyData = GetTowerIpyData(floorID)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     if ipyData.GetIsNotify():  | 
|         #IPY_Data = IpyGameDataPY.IPY_Data()  | 
|         #maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()  | 
|         sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'  | 
|         PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])  | 
|     #¸üйؿ¨  | 
|     SetSkyTowerCurfloorID(curPlayer, floorID)  | 
|     # ¸ø¹ý¹Ø½±Àø  | 
|     prizeDict = __GiveFBPassPrize(curPlayer, ipyData)  | 
|     # ¹ý¹ØÊ±¼ä  | 
|     costTime = tick - GameWorld.GetGameFB().GetFBStepTick()  | 
|     prizeDict[FBCommon.Over_costTime] = costTime  | 
|     __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)  | 
|     PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)  | 
|       | 
|     SyncSkyTowerInfo(curPlayer) # Í¬²½×îйؿ¨ÐÅÏ¢  | 
|     __SetFBToFreeTime(tick)  | 
|       | 
|     if floorID >= 10:  | 
|         PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)  | 
|           | 
|     # È«·þÄ¿±ê  | 
|     ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)  | 
|     if ipyDataServer:  | 
|         playerID = curPlayer.GetPlayerID()  | 
|         playerName = curPlayer.GetPlayerName()  | 
|         job = curPlayer.GetJob()  | 
|         playerLV = curPlayer.GetLV()  | 
|         realmLV = curPlayer.GetOfficialRank()  | 
|         msgInfo = str(["ServerChallengePass", [floorID, playerID, playerName, job, playerLV, realmLV]])  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))  | 
|           | 
|     return  | 
|   | 
|   | 
|   | 
| ## ¸ø¹ý¹Ø½±Àø  | 
| def __GiveFBPassPrize(curPlayer, ipyData):  | 
|     giveItemDict = ipyData.GetReward()  | 
|     giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]  | 
|     event = ["SKYTower", False, {}]  | 
|     ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)  | 
|   | 
|     prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}  | 
|     return prizeDict  | 
|   | 
|   | 
|   | 
| ## ·¢ËÍÌôÕ½½á¹ûÐÅÏ¢  | 
| def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):  | 
|       | 
|     overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_SkyTower  | 
|     overDict[FBCommon.Over_wheel] = floorID  | 
|     overDict[FBCommon.Over_isPass] = int(isPass)  | 
|     GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())  | 
|     FBCommon.Notify_FB_Over(curPlayer, overDict)  | 
|     return  | 
|   | 
|   | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| #  @param attacker ¹¥»÷·½  | 
| #  @param defender ·ÀÊØ·½  | 
| #  @return bool  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_State_Fighting:  | 
|         return False  | 
|     return True  | 
|   | 
| ##Íæ¼ÒËÀÍö.  | 
| # @param curPlayer:ËÀÍöµÄÍæ¼Ò   | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerDead(curPlayer):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     floorID = gameFB.GetGameFBDictByKey(FBDict_Level)  | 
|     __SendSkyTowerOverInfo(curPlayer, floorID, False)  | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     #ÓÎÏ·½áÊø  | 
|     __SetFBToFreeTime(tick)  | 
|     return  | 
|   | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| #  @param None  | 
| #  @return ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True  | 
|   | 
| ## ¸±±¾ÐÐΪ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionInfo ÐÐΪÐÅÏ¢  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBAction(curPlayer, actionType, actionInfo, tick):  | 
|     # Ä¬ÈÏΪѡÔñ¹Ø¿¨£¬Óɿͻ§¶Ë¾ö¶¨£¬½ø³¡¼°¸±±¾Ñ¡¹ØÍ¨ÓôËÐÐΪ  | 
|     if actionInfo <= 0:  | 
|         return  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:  | 
|         GameWorld.DebugLog("×¼±¸»òÕ½¶·ÖÐ, ÎÞ·¨±ä¸ü¹Ø¿¨!")  | 
|         return  | 
|       | 
|     floorID = actionInfo  | 
|     if not __CheckCanChallenge(curPlayer, floorID):  | 
|         FBCommon.DoLogic_FBKickAllPlayer()  | 
|         return  | 
|       | 
|     StartfloorID(curPlayer, floorID, tick)  | 
|     return  | 
|   | 
| def OnGetSkyTowerServerChallengeReward(curPlayer, floorID):  | 
|     ## Áìȡȫ·þÌôÕ½²ã½±Àø  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("SkyTowerServerChallenge", floorID)  | 
|     if not ipyData:  | 
|         return  | 
|     recordIndex = ipyData.GetRewardRecordIndex()  | 
|     rewardInfo = ipyData.GetReward()  | 
|       | 
|     rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)  | 
|     if rewardRecord & pow(2, recordIndex):  | 
|         GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord))  | 
|         return  | 
|       | 
|     ipyData.GetRewardRecordIndex()  | 
|     msgInfo = str(["ServerChallengeReward", [floorID, recordIndex, rewardInfo]])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
| def GameServer_SkyTowerInfo(curPlayer, resultList):  | 
|     ## GameServer ·µ»ØÐÅÏ¢  | 
|     msgType, msgData = resultList[:2]  | 
|       | 
|     if msgType == "ServerChallengeReward":  | 
|         isPass = resultList[2]  | 
|         floorID, recordIndex, rewardInfo = msgData  | 
|         if not isPass:  | 
|             return  | 
|           | 
|         rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)  | 
|         if rewardRecord & pow(2, recordIndex):  | 
|             GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord))  | 
|             return  | 
|         updRewardRecord = rewardRecord | pow(2, recordIndex)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord, updRewardRecord)  | 
|         SyncSkyTowerInfo(curPlayer)  | 
|           | 
|         giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in rewardInfo.items()]  | 
|         event = ["SKYTowerServerChallengeReward", False, {"floorID":floorID}]  | 
|         ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)  | 
|           | 
|     return  | 
|   | 
|   |