#!/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  
 | 
  
 | 
  
 |