#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
#  
 | 
##@package PlayerFB.py  
 | 
#  
 | 
# @todo:Íæ¼Ò¸±±¾  
 | 
#  
 | 
# @author hxp  
 | 
# @date 2013-08-20  
 | 
# @version 2.0  
 | 
# @note:  
 | 
# @change: "2014-08-01 00:30" hxp Ôö¼ÓÇå³ý¸±±¾Àäȴʱ¼äÂß¼  
 | 
# @change: "2014-12-08 17:00" hxp Ôö¼ÓÇ帱±¾CD×êʯÏû·ÑÁ÷Ïò  
 | 
# @change: "2015-02-10 22:30" hxp Ôö¼Ó×êʯÏûºÄÀàÐÍʼþ»ã±¨  
 | 
# @change: "2015-06-29 18:00" xdh Ôö¼ÓÍæ¼Ò¸±±¾·ÅÆÈë¿Ú  
 | 
# @change: "2016-02-30 17:00" hxp ÁìÖ÷°ÔÒµ¡¢¶ñħÊÔÁ¶  
 | 
# @change: "2016-03-20 15:30" hxp ¸±±¾¶à±¶½±Àø£»¹«¹²CD¸±±¾É¨µ´  
 | 
# @change: "2016-04-19 17:30" xdh ¸±±¾É¨µ´Ëã»îÔ¾¶È  
 | 
# @change: "2016-04-26 15:30" hxp ¶à±¶½±Àø°Ù·Ö±È¸ÄΪ½±ÀøµÈ¼¶£» É¨µ´Ôö¼ÓÇëÇóCD  
 | 
# @change: "2016-08-15 11:20" xdh ¸±±¾É¨µ´ÏûºÄµÀ¾ß  
 | 
# @change: "2016-12-02 11:00" xdh ¸±±¾É¨µ´Ôö¼ÓÈËÎïµÈ¼¶ÅÐ¶Ï  
 | 
#------------------------------------------------------------------------------   
 | 
#"""Version = 2016-12-02 11:00"""  
 | 
#------------------------------------------------------------------------------   
 | 
import ReadChConfig  
 | 
import IPY_GameWorld  
 | 
import PlayerControl  
 | 
import GameWorld  
 | 
import FBCommon  
 | 
import ChConfig  
 | 
import FBLogic  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ItemCommon  
 | 
import IpyGameDataPY  
 | 
import ShareDefine  
 | 
  
 | 
import time  
 | 
import math  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
## Íæ¼Ò¸±±¾ÐÐΪ·â°ü A5 08  
 | 
#  @param playerIndex Íæ¼ÒË÷Òý    
 | 
#  @param clientData ¿Í»§¶Ë·â°ü    
 | 
#  @param tick Ê±¼ä  
 | 
#  @return None  
 | 
def OnDoFBAction(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    actionType = clientData.ActionType # ÐÐΪÀàÐÍ  
 | 
    actionInfo = clientData.ActionInfo # ÐÐΪÐÅÏ¢  
 | 
    FBLogic.DoFBAction(curPlayer, actionType, actionInfo, tick)  
 | 
    return  
 | 
  
 | 
## A2 10 Çå³ý¸±±¾CD#tagCMClearFBCD  
 | 
#  @param playerIndex Íæ¼ÒË÷Òý    
 | 
#  @param clientData ¿Í»§¶Ë·â°ü    
 | 
#  @param tick Ê±¼ä  
 | 
#  @return None  
 | 
def OnClearFBCD(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    mapID = clientData.MapID # mapID  
 | 
    GameWorld.DebugLog("OnClearFBCD mapID=%s" % mapID)  
 | 
    if not mapID:  
 | 
        return  
 | 
      
 | 
    enterCDTick = FBCommon.GetFBEnterCD(curPlayer, mapID)  
 | 
    if enterCDTick <= 0:  
 | 
        GameWorld.DebugLog("    CDʱ¼äÒѹý£¬²»ÐèÒªÇå³ý£¬ cdTick=%s" % enterCDTick)  
 | 
        return  
 | 
    clearEnterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 2)  
 | 
    if mapID not in clearEnterCDDict:  
 | 
        return  
 | 
    costMoney = clearEnterCDDict[mapID]  
 | 
    costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney)  
 | 
    if not costMoneyList:  
 | 
        return  
 | 
    second = enterCDTick # ²ÎÊýÃë  
 | 
    # ¿Û³ýÏûºÄ  
 | 
    infoDict = {"MapID":mapID, "CDSecond":second}  
 | 
    for moneyType, moneyCnt in costMoneyList:  
 | 
        if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_ClearFBCD, infoDict):  
 | 
            return  
 | 
     
 | 
  
 | 
    GameWorld.DebugLog("   mapID=%s Çå³ý¸±±¾CD second=%s,costMoneyList=%s"   
 | 
                         % (mapID, second, costMoneyList), curPlayer.GetPlayerID())  
 | 
      
 | 
    FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, 0)  
 | 
    FBCommon.SyncFBEnterTick(curPlayer)  
 | 
    return  
 | 
  
 | 
#---·â°ü¿ªÊ¼É¨µ´-------------------------------------  
 | 
  
 | 
(  
 | 
PCDFB_MapIDList, # ¸±±¾µØÍ¼IDÁÐ±í  
 | 
PCDFB_NeedTime, # É¨µ´Ê±¼ä, Ãë  
 | 
PCDFB_FinishTimeGold, # Á¢¼´Íê³ÉÏûºÄ×êʯ¹«Ê½  
 | 
) = range(3)  
 | 
  
 | 
  
 | 
## ÅжÏÊÇ·ñµ±Ç°¹«¹²CD¸±±¾É¨µ´ÖÐ  
 | 
def IsCurPubCDFBSweeping(curPlayer, mapID):  
 | 
    sweepCfg = GetPubCDFBSweepCfg(curPlayer, mapID)  
 | 
    if not sweepCfg:  
 | 
        return False  
 | 
    groupNum = sweepCfg[0]  
 | 
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum) == mapID  
 | 
  
 | 
## »ñÈ¡¹«¹²CD¸±±¾É¨µ´ÅäÖÃÐÅÏ¢  
 | 
def GetPubCDFBSweepCfg(curPlayer, mapID):  
 | 
    PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")  
 | 
    for groupNum, sweepInfo in PubCDFBSweepDict.items():  
 | 
        mapIDGroup = sweepInfo[0]  
 | 
        if mapID not in mapIDGroup:  
 | 
            continue  
 | 
          
 | 
        return groupNum, sweepInfo  
 | 
      
 | 
    return  
 | 
  
 | 
## ¿ªÊ¼¹«¹²CD¸±±¾É¨µ´  
 | 
def __DoStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, isFinish, dataEx, groupNum, sweepInfo):  
 | 
    curSweepMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum)  
 | 
    if curSweepMapID > 0:  
 | 
        GameWorld.DebugLog("¹«¹²CD¸±±¾É¨µ´ÖÐ, ÎÞ·¨É¨µ´!groupNum=%s,curSweepMapID=%s"   
 | 
                           % (groupNum, curSweepMapID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if not FBLogic.OnStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, dataEx):  
 | 
        return  
 | 
      
 | 
    curTime = int(time.time())  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_MapID % groupNum, mapID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_LineID % groupNum, lineID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum, cnt)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum, dataEx)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Time % groupNum, curTime)  
 | 
    GameWorld.DebugLog("¹«¹²CD¸±±¾¿ªÊ¼É¨µ´ mapID=%s,lineID=%s,cnt=%s,dataEx=%s,groupNum=%s,curTime=%s"   
 | 
                       % (mapID, lineID, cnt, dataEx, groupNum, curTime), curPlayer.GetPlayerID())  
 | 
      
 | 
      
 | 
    Sync_PubFBSweepData(curPlayer, groupNum)  
 | 
    return  
 | 
  
 | 
## Íê³É¹«¹²CD¸±±¾É¨µ´  
 | 
def __DoFinishPubCDFB(curPlayer, mapID, isFinish, groupNum, sweepInfo):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    curSweepMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum)  
 | 
    if curSweepMapID <= 0 or curSweepMapID != mapID:  
 | 
        GameWorld.DebugLog("δɨµ´ »ò ²»Êǵ±Ç°ÕýÔÚɨµ´µÄ¹«¹²CD¸±±¾, ÎÞ·¨Íê³É!curSweepMapID=%s,mapID=%s"   
 | 
                           % (curSweepMapID, mapID), playerID)  
 | 
        return  
 | 
      
 | 
    sweepTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Time % groupNum)  
 | 
    lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_LineID % groupNum)  
 | 
    sweepCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum)  
 | 
    dataEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum)  
 | 
      
 | 
    sweepNeedTime = sweepInfo[PCDFB_NeedTime] # µ¥´ÎºÄʱ  
 | 
    finishCostGoldFormat = sweepInfo[PCDFB_FinishTimeGold]  
 | 
    needTotalTime = sweepNeedTime * sweepCnt  
 | 
      
 | 
    curTime = int(time.time())  
 | 
    passTime = max(0, curTime - sweepTime)  
 | 
    second = max(0, needTotalTime - passTime)  
 | 
      
 | 
    # Õý³£Íê³É  
 | 
    if isFinish == 2 and second > 0:  
 | 
        GameWorld.DebugLog("ɨµ´Ê±¼äδµ½£¬ÎÞ·¨Íê³É£¬Ê£Óà%sÃë, mapID=%s" % (second, mapID), playerID)  
 | 
        return  
 | 
      
 | 
    addDataDict = {"curTime":curTime, "startSweepTime":sweepTime, "sweepCnt":sweepCnt,   
 | 
                   "needTotalTime":needTotalTime, "passTime":passTime, "remainSecond":second,   
 | 
                   "costGold":0, "mapID":mapID, "lineID":lineID, "dataEx":dataEx, ChConfig.Def_Cost_Reason_SonKey:mapID}  
 | 
      
 | 
    # ×êʯÁ¢¼´Íê³É  
 | 
    if isFinish == 1:  
 | 
        costGold = eval(finishCostGoldFormat)  
 | 
        if costGold > 0:  
 | 
            addDataDict["costGold"] = costGold  
 | 
            if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold,   
 | 
                                          ChConfig.Def_Cost_FinishFBSweep, addDataDict):  
 | 
                return  
 | 
      
 | 
    GameWorld.DebugLog("¹«¹²CD¸±±¾É¨µ´Íê³É: %s" % str(addDataDict), playerID)  
 | 
    # ¸ø½±Àø  
 | 
    FBLogic.OnGivePubCDFBSweepPrize(curPlayer, mapID, lineID, sweepCnt, dataEx)  
 | 
      
 | 
    # ÖØÖÃɨµ´Êý¾Ý  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_MapID % groupNum, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_LineID % groupNum, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Time % groupNum, 0)  
 | 
    Sync_PubFBSweepData(curPlayer, groupNum)  
 | 
    return  
 | 
  
 | 
## Í¬²½¹«¹²CD¸±±¾É¨µ´ÐÅÏ¢  
 | 
def Sync_PubFBSweepData(curPlayer, groupNum=-1):  
 | 
      
 | 
    PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")  
 | 
    allGroupNumList = PubCDFBSweepDict.keys()  
 | 
    if groupNum == -1:  
 | 
        groupNumList = allGroupNumList  
 | 
    else:  
 | 
        if groupNum not in allGroupNumList:  
 | 
            return  
 | 
        groupNumList = [groupNum]  
 | 
          
 | 
    pubSweepData = ChPyNetSendPack.tagMCPubFBSweepData()  
 | 
    pubSweepData.Clear()  
 | 
    pubSweepData.SweepDatList = []  
 | 
      
 | 
    for gNum in groupNumList:  
 | 
        sweepInfo = ChPyNetSendPack.tagMCPubFBSweep()  
 | 
        sweepInfo.Clear()  
 | 
        sweepInfo.PubNum = gNum  
 | 
        sweepInfo.FBMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % gNum)  
 | 
        sweepInfo.LineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_LineID % gNum)  
 | 
        sweepInfo.SweepTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Time % gNum)  
 | 
        sweepInfo.SweepCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Cnt % gNum)  
 | 
        pubSweepData.SweepDatList.append(sweepInfo)  
 | 
          
 | 
    pubSweepData.Cnt = len(pubSweepData.SweepDatList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, pubSweepData)  
 | 
    return  
 | 
  
 | 
#//A5 05 Íæ¼Ò¿ªÊ¼¸±±¾É¨µ´ #tagCMBeginFBWipeOut  
 | 
#  
 | 
#struct    tagCMBeginFBWipeOut  
 | 
#{  
 | 
#    tagHead         Head;  
 | 
#    DWORD        MapID;  
 | 
#    WORD        LineID;  
 | 
#    BYTE        Cnt;    // É¨µ´´ÎÊý  
 | 
#    BYTE        IsFinish;    // ÊÇ·ñÁ¢¼´Íê³É; 0-·ñ£»1-»¨Ç®Á¢¼´Íê³É£»2-¿Í»§¶Ë×ÔÐе¹¼ÆÊ±¼äµ½ºó·¢ËÍ2´ú±íÁìȡɨµ´Íê³É½±Àø  
 | 
#    DWORD        DataEx;    //¸½´øÐÅÏ¢  
 | 
#};  
 | 
## Íæ¼Ò¸±±¾É¨µ´  
 | 
#  @param playerIndex Íæ¼ÒË÷Òý    
 | 
#  @param clientData ¿Í»§¶Ë·â°ü    
 | 
#  @param tick Ê±¼ä  
 | 
#  @return None  
 | 
def OnPlayerFBWipeOut(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
      
 | 
    if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_BeginFBWipeOut, tick):  
 | 
        GameWorld.DebugLog("Íæ¼Ò¸±±¾É¨µ´ÇëÇóCDÖÐ...", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    mapID = clientData.MapID  
 | 
    lineID = clientData.LineID  
 | 
    cnt = clientData.Cnt  
 | 
    #isFinish = clientData.IsFinish  
 | 
    isFinish = 1 # ÔÝʱĬÈÏ1£¬Ö®ºóÓÐÐèҪɨµ´µÈ´ýµÄÔÙ˵  
 | 
    dataEx = clientData.DataEx  
 | 
      
 | 
    if FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) == FBCommon.GetRecordMapID(mapID):  
 | 
        GameWorld.DebugLog("Íæ¼ÒÔÚɨµ´Ä¿±êµØÍ¼ÖУ¬ÎÞ·¨É¨µ´£¡mapID=%s" % mapID)  
 | 
        return  
 | 
      
 | 
    fbIpyData = FBCommon.GetFBIpyData(mapID)  
 | 
    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)  
 | 
    if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, cnt) != ShareDefine.EntFBAskRet_OK:  
 | 
        return  
 | 
    costMoneyList = []  
 | 
    sweepCostindexList = []  
 | 
    sweepCostCnt = 0  
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
      
 | 
    if fbLineIpyData:  
 | 
        #ɨµ´µÈ¼¶ÅÐ¶Ï  
 | 
        sweepLVLimit = fbLineIpyData.GetSweepLVLimit()  
 | 
        if sweepLVLimit and curPlayer.GetLV() < sweepLVLimit:  
 | 
            GameWorld.DebugLog('Íæ¼Ò¸±±¾É¨µ´,µÈ¼¶²»×㣡mapID=%s, lineID=%s, playerLV=%s, sweepLVLimit=%s'   
 | 
                               % (mapID, lineID, curPlayer.GetLV(), sweepLVLimit), curPlayer.GetPlayerID())  
 | 
            return  
 | 
          
 | 
        #ɨµ´µÀ¾ßÅÐ¶Ï  
 | 
        sweepItemID = fbLineIpyData.GetSweepItemID()  
 | 
        if sweepItemID:  
 | 
            sweepItemCnt = fbLineIpyData.GetSweepCostCnt()  
 | 
            sweepCostCnt = sweepItemCnt * cnt  
 | 
            #isEnough, sweepCostindexList = ItemCommon.GetItem_FromPack_ByID(sweepItemID, itemPack, sweepCostCnt)  
 | 
            isEnough, sweepCostindexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(sweepItemID, itemPack, sweepCostCnt)  
 | 
            if not isEnough:  
 | 
                itemPrice = ItemCommon.GetShopItemPrice(sweepItemID, IPY_GameWorld.TYPE_Price_Gold_Money)  
 | 
                if itemPrice:  
 | 
                    costMoney = itemPrice * lackCnt  
 | 
                    costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney)  
 | 
                if not costMoneyList:  
 | 
                    GameWorld.DebugLog("ɨµ´ÏûºÄµÀ¾ß²»×ã, mapID=%s,lineID=%s,sweepItemID=%s,sweepCostCnt=%s"   
 | 
                                   % (mapID, lineID, sweepItemID, sweepCostCnt), curPlayer.GetPlayerID())  
 | 
                    return  
 | 
  
 | 
              
 | 
          
 | 
    #¹«¹²CDɨµ´Ä£Ê½ÔÝÆÁ±Î£¬ÓÐÐèÒªÔÙÐÞ¸Ä  
 | 
    #===============================================================================================  
 | 
    # groupNum = -1  
 | 
    # sweepInfo = None  
 | 
    # PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")  
 | 
    # for gNum, sInfo in PubCDFBSweepDict.items():  
 | 
    #    if mapID in sInfo[PCDFB_MapIDList]:  
 | 
    #        groupNum = gNum  
 | 
    #        sweepInfo = sInfo  
 | 
    #        break  
 | 
    #          
 | 
    # # ¹«¹²CD¸±±¾É¨µ´  
 | 
    # if groupNum >= 0:  
 | 
    #    if not isFinish:  
 | 
    #        __DoStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, isFinish, dataEx, groupNum, sweepInfo)  
 | 
    #    else:  
 | 
    #        __DoFinishPubCDFB(curPlayer, mapID, isFinish, groupNum, sweepInfo)  
 | 
    #    return  
 | 
    #===============================================================================================  
 | 
      
 | 
    # ¸±±¾ÊÇ·ñ¿Éɨµ´, ÕâÀïÖ»Åжϸ±±¾×ÔÉíµÄÌØÊâÌõ¼þ, ¹«¹²Ìõ¼þÉÏÃæÒѾÅÐ¶Ï  
 | 
    if not FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, isFinish, dataEx):  
 | 
        return  
 | 
      
 | 
    #¿Û³ýɨµ´µÀ¾ß  
 | 
    if sweepCostindexList and sweepCostCnt:  
 | 
        ItemCommon.ReduceItem(curPlayer, itemPack, sweepCostindexList, sweepCostCnt, False, 'FBSweepCostItem')  
 | 
    if costMoneyList:  
 | 
        infoDict = {"MapID":mapID, "LineID":lineID, 'SweepCount':cnt}  
 | 
        for moneyType, moneyNum in costMoneyList:  
 | 
            if not PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBSweep, infoDict):  
 | 
                return False, hasBind  
 | 
      
 | 
    #ÐèÏȿ۳ýÃÅÆ±, ÔÙÔö¼Ó´ÎÊý, ·ñÔò¿ÉÄܵ¼Ö¿۳ýµÄÊýÁ¿´íÎó  
 | 
    FBCommon.DelFBEnterTicket(curPlayer, mapID, lineID, cnt)  
 | 
          
 | 
    #Ôö¼Ó¸±±¾½øÈë´ÎÊý  
 | 
    if fbIpyData and fbIpyData.GetDayTimes():  
 | 
        FBCommon.AddEnterFBCount(curPlayer, mapID, cnt)  
 | 
          
 | 
    #ɨµ´½á¹û¸ø½±ÀøµÈ  
 | 
    FBLogic.OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, isFinish, dataEx)  
 | 
    return  
 | 
  
 | 
  
 | 
#// A5 1B ¹ºÂòÌôÕ½¸±±¾¾«Á¦ #tagCMBuyFBEnergy  
 | 
#  
 | 
#struct    tagCMBuyFBEnergy  
 | 
#{  
 | 
#    tagHead         Head;  
 | 
#};  
 | 
def OnPlayerBuyFBEnergy(playerIndex, clientData, tick):  
 | 
    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    return  
 | 
  
 | 
  
 | 
## Íæ¼Ò¸±±¾¹¦ÄÜʱ¼ä´¦Àí  
 | 
def DoPlayerFBTimeProcess(curPlayer, tick):  
 | 
      
 | 
    checkInterval = ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_FBTimeProcess]  
 | 
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_FBTimeProcess) < checkInterval:  
 | 
        return   
 | 
      
 | 
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FBTimeProcess, tick)  
 | 
      
 | 
    # ÁìÖ÷°ÔÒµÍæ¼Ò¹¦ÄÜʱ¼ä´¦Àí  
 | 
    FBCommon.RegainFBCntProcess(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
#// B1 02 ÁìÈ¡¶à±¶¸±±¾½±Àø #tagCMGetMultiFBPrize  
 | 
#  
 | 
#struct    tagCMGetMultiFBPrize  
 | 
#{  
 | 
#    tagHead         Head;  
 | 
#    DWORD        MapID;  
 | 
#    WORD        LineID;  
 | 
#    WORD        Percent;    // ¶îÍâ½±Àø°Ù·Ö±È½±ÀøµÈ¼¶  
 | 
#};  
 | 
def OnPlayerGetMultiFBPrize(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    mapID = clientData.MapID  
 | 
    lineID = clientData.LineID  
 | 
    prizeExLV = clientData.Percent  
 | 
    FBLogic.OnGetMultiFBPrize(curPlayer, mapID, lineID, prizeExLV)  
 | 
    return  
 | 
  
 | 
  
 | 
#//A5 60 ÖØÖø±±¾ÌôÕ½´ÎÊý #tagCMResetFBJoinCnt  
 | 
#  
 | 
#struct tagCMResetFBJoinCnt  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def OnPlayerResetFBJoinCnt(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    return  
 | 
  
 | 
  
 | 
#// B1 01 ¿Í»§¶Ë¸±±¾·¢ËͽáÊø #tagCMClientEndFB  
 | 
#  
 | 
#struct    tagCMClientEndFB  
 | 
#{  
 | 
#    tagHead         Head;  
 | 
#    DWORD        MapID;  
 | 
#    WORD        LineID;  
 | 
#    DWORD        Data;    //¸±±¾Êý¾Ý  
 | 
#};  
 | 
def OnClientEndFB(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    mapID = clientData.MapID  
 | 
    lineID = clientData.LineID  
 | 
    data1 = clientData.Data1  
 | 
    data2 = clientData.Data2  
 | 
    dataList = [data1, data2]  
 | 
    FBLogic.OnClientEndFB(curPlayer, mapID, lineID, dataList)  
 | 
    GameWorld.DebugLog('    ¿Í»§¶Ë¸±±¾·¢ËͽáÊømapID=%s,lineID=%s,dataList=%s'%(mapID,lineID,dataList))  
 | 
    return  
 | 
  
 | 
  
 | 
#// B1 04 ¿Í»§¶Ë·¢ËÍ¿ªÊ¼¸±±¾ #tagCMClientStartFB  
 | 
#  
 | 
#struct    tagCMClientStartFB  
 | 
#{  
 | 
#    tagHead         Head;  
 | 
#};  
 | 
def OnClientStartFB(playerIndex, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  
 | 
    FBLogic.OnClientStartFB(curPlayer, tick)  
 | 
    return  
 | 
  
 | 
  
 | 
  
 |