#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package PlayerFamilyBoss  
 | 
#  
 | 
# @todo:¼Ò×åboss¸±±¾  
 | 
# @author hxp  
 | 
# @date 2014-04-16  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ¼Ò×åboss¸±±¾  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2014-04-16 18:00"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import PlayerFamilyAction  
 | 
import GameWorld  
 | 
import PlayerFamily  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
import IpyGameDataPY  
 | 
import PlayerDBGSEvent  
 | 
import PlayerControl  
 | 
import ChConfig  
 | 
import time  
 | 
  
 | 
  
 | 
  
 | 
#value1:ÒÑ¿ªÆô´ÎÊý value2:ÊÇ·ñ¿ªÆôÖÐ(0먦Æô£¬timeÖµ-¿ªÆôÖУ¬2-Í˳ö¼ÆÊ±ÖÐ)  
 | 
def GetFamilyBossOpenCnt(fActionData): return fActionData.GetValue1()  
 | 
def SetFamilyBossOpenCnt(fActionData, cnt): return fActionData.SetValue1(cnt)  
 | 
def GetFamilyBossIsOpen(fActionData): return fActionData.GetValue2()  
 | 
def SetFamilyBossIsOpen(fActionData, isOpen): return fActionData.SetValue2(isOpen)  
 | 
  
 | 
def GetFamilyBossLimitCnt(family):  
 | 
    '''ÏÉÃËBOSSÿÖÜ´ÎÊýÏÞÖÆ'''  
 | 
    return PlayerFamily.GetFamilySetting(family, ChConfig.Def_FamilySetting_BossFBCnt)#IpyGameDataPY.GetFuncCfg('FamilyBossOpen', 4)  
 | 
  
 | 
def GetFamilyBossCostFood():  
 | 
    '''ÏÉÃËBOSS¿ªÆôÏûºÄÊÞÁ¸'''  
 | 
    return IpyGameDataPY.GetFuncCfg('FamilyBossOpen', 2)  
 | 
  
 | 
      
 | 
def ChekcFamilyBossOpenTime():  
 | 
    '''ÊÇ·ñÔÚ¿É¿ªÆô»î¶¯µÄʱ¼äÄÚ'''  
 | 
    beginTime, endTime = IpyGameDataPY.GetFuncEvalCfg('FamilyBossOpen', 3)  
 | 
    curTime = GameWorld.GetServerTime()  
 | 
    isAtCPing = '%02d:00:00' % endTime > str(curTime)[11:19] > '%02d:00:00' % beginTime  
 | 
    return isAtCPing  
 | 
  
 | 
## ¼ì²é¼Ò×åboss¸±±¾ÊÇ·ñ¿ªÆô  
 | 
#  @param familyID ¼Ò×åid  
 | 
#  @param mapID µØÍ¼id  
 | 
#  @return True-ÊÇ  
 | 
def CheckIsFamilyBossFBOpen(familyID, mapID):  
 | 
    if familyID <= 0:  
 | 
        return False  
 | 
  
 | 
    familyBossFBOpenData = __GetFamilyBossFBActionData(familyID)  
 | 
    if not familyBossFBOpenData:  
 | 
        return False  
 | 
      
 | 
    return GetFamilyBossIsOpen(familyBossFBOpenData)  
 | 
      
 | 
  
 | 
  
 | 
## ¼Ò×åboss¸±±¾OnWeek  
 | 
#  @param familyID ¼Ò×åid  
 | 
#  @return None  
 | 
def FamilyBossFBOnWeek(familyID):  
 | 
    PlayerFamilyAction.ClearFamilyAction(familyID, ShareDefine.Def_ActionType_FamilyBossFB)  
 | 
      
 | 
    curFamily = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
      
 | 
    if not curFamily:  
 | 
        GameWorld.ErrLog("FamilyBossFBOnWeek can not find family! familyID=%s" % (familyID))  
 | 
        return  
 | 
      
 | 
    __Notify_FamilyAllMemberBossFBInfo(curFamily)  
 | 
    return  
 | 
  
 | 
  
 | 
## Íæ¼ÒµÇ¼£¬Í¨Öª¼Ò×帱±¾ÐÅÏ¢  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @return None  
 | 
def OnLogin(curPlayer):  
 | 
    NotifyFamilyBossFBInfo(curPlayer)  
 | 
    NotifyAllFamilyBossState(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## ¿ªÆô¼Ò×åboss¸±±¾  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @param mapID ¸±±¾µØÍ¼id  
 | 
#  @param tick Ê±¼ä  
 | 
#  @return None  
 | 
def OpenFamilyBossFB(curPlayer, tick):  
 | 
      
 | 
    GameWorld.DebugLog("OpenFamilyBossFB", curPlayer.GetPlayerID())  
 | 
      
 | 
    curFamily = curPlayer.GetFamily()  
 | 
    if curFamily == None:  
 | 
        GameWorld.ErrLog("    player not family!", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if not ChekcFamilyBossOpenTime():  
 | 
        GameWorld.DebugLog("    ²»Ôڻʱ¼äÄÚ")  
 | 
        return  
 | 
      
 | 
    familyId = curFamily.GetID()  
 | 
  
 | 
    familyBossFBData = __GetFamilyBossFBActionData(familyId)  
 | 
          
 | 
    if not familyBossFBData:  
 | 
        GameWorld.ErrLog("    can find Def_ActionType_FamilyBossFB familyId=%s"   
 | 
                                                                % (familyId))  
 | 
        return  
 | 
      
 | 
    if GetFamilyBossIsOpen(familyBossFBData):  
 | 
        GameWorld.DebugLog('    ÏÉÃËBOSSÒÑ¿ªÆô£¬²»ÄÜÔٴοªÆô')  
 | 
        return  
 | 
      
 | 
    curWeekOpenCnt = GetFamilyBossOpenCnt(familyBossFBData)  
 | 
      
 | 
    # ´ÎÊýÅÐ¶Ï  
 | 
    maxOpenCnt = GetFamilyBossLimitCnt(curFamily)  
 | 
    if curWeekOpenCnt >= maxOpenCnt:  
 | 
        GameWorld.Log("    ±¾ÖÜ¿ªÆô´ÎÊý=%s >= ×î´ó¿ªÆô´ÎÊý=%s" % (curWeekOpenCnt, maxOpenCnt))  
 | 
        return  
 | 
      
 | 
    foodCost = GetFamilyBossCostFood()  
 | 
    if not foodCost:  
 | 
        GameWorld.ErrLog("    ÎÞ·¨ÕÒµ½¿ªÆô¼Ò×åboss¸±±¾ÏûºÄÐÅÏ¢ familyId=%s, foodCost=%s" % (familyId, foodCost))  
 | 
        return  
 | 
      
 | 
    # ´¦ÀíÏûºÄÂß¼µÈ  
 | 
    if not __DoOpenCostLogic(curFamily, curPlayer, foodCost):  
 | 
        return  
 | 
    SetFamilyBossOpenCnt(familyBossFBData, curWeekOpenCnt + 1) # Ôö¼Ó¿ªÆô´ÎÊý  
 | 
    SetFamilyBossIsOpen(familyBossFBData, 1)  
 | 
      
 | 
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyBossOpenCount, [familyId, curWeekOpenCnt + 1])  
 | 
      
 | 
    # ¹ã²¥¸øÔÚÏß¼Ò×å³ÉÔ±¼Ò×åboss¸±±¾ÐÅÏ¢  
 | 
    __Notify_FamilyAllMemberBossFBInfo(curFamily)  
 | 
    GameWorld.Log("OpenFamilyBossFB ok familyId=%s,curWeekOpenCnt=%s!" % (familyId, curWeekOpenCnt + 1))  
 | 
    return  
 | 
  
 | 
  
 | 
## ¿ªÆô¼Ò×åboss¸±±¾ÏûºÄÂß¼  
 | 
#  @param curFamily ¼Ò×åʵÀý  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @param costInfoList ÏûºÄÐÅÏ¢ÁÐ±í  
 | 
#  @param openIndex ¿ªÆô´ÎÊýË÷Òý  
 | 
#  @return True-¿Û³ýÏûºÄ³É¹¦  
 | 
def __DoOpenCostLogic(curFamily, curPlayer, foodCost):  
 | 
    # ³ÉÔ±¼Ò×åµÈ¼¶ÐèÇóÅÐ¶Ï  
 | 
    curMember = curFamily.FindMember(curPlayer.GetPlayerID())  
 | 
      
 | 
    if not curMember:  
 | 
        GameWorld.ErrLog("¼Ò×å³ÉÔ±²éÕÒÒì³£ = %s" % (curPlayer.GetPlayerID()))  
 | 
        return False  
 | 
      
 | 
    if not PlayerFamily.GetFamilyMemberHasPow(curMember, ChConfig.Def_PurviewDictKey_CanOpenBoss):  
 | 
        GameWorld.DebugLog("¿ªÆôÏÉÃËBOSS->ÄãûÓÐȨÏÞ" )  
 | 
        return False  
 | 
      
 | 
    # ¼Ò×åÊÞÁ¸ÏûºÄ  
 | 
    familyBossFood = PlayerFamily.GetFamilyBossFood(curFamily)  
 | 
    if familyBossFood < foodCost:  
 | 
        GameWorld.Log("    __DoOpenCostLogic ÐèÇó¼Ò×åÊÞÁ¸=%s,µ±Ç°¼Ò×åÊÞÁ¸=%s"   
 | 
                      % (foodCost, familyBossFood))  
 | 
        return False  
 | 
      
 | 
    # ¿Û³ýÊÞÁ¸  
 | 
    PlayerFamily.SetFamilyBossFood(curFamily, max(0, familyBossFood - foodCost))  
 | 
      
 | 
    #֪ͨ¿Í»§¶ËˢР 
 | 
    curFamily.Broadcast_FamilyChange()  
 | 
    #֪ͨµØÍ¼·þÎñÆ÷ˢР 
 | 
    PlayerFamily.SendPack_MapServer_PlayerFamilyRefresh(curFamily)  
 | 
    GameWorld.Log("    __DoOpenCostLogic ¿Û³ý¼Ò×åÊÞÁ¸=%s OK!, familyID=%s,playerFamilyLV=%s"   
 | 
                  % (foodCost, curPlayer.GetFamilyID(), curMember.GetFamilyLV()), curPlayer.GetPlayerID())  
 | 
    return True  
 | 
  
 | 
  
 | 
## »ñÈ¡¼Ò×åboss¸±±¾¿ªÆôÐÅÏ¢  
 | 
#  @param familyID ¼Ò×åid  
 | 
#  @param mapID µØÍ¼id  
 | 
#  @return ActionData  
 | 
def __GetFamilyBossFBActionData(familyID):  
 | 
    fActionType = ShareDefine.Def_ActionType_FamilyBossFB  
 | 
    familyBossFBAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, fActionType)  
 | 
    if familyBossFBAction.Count() <= 0:  
 | 
        # Ã»ÓеϰÌí¼ÓÊý¾Ý  
 | 
        tick = GameWorld.GetGameWorld().GetTick()  
 | 
        if not PlayerFamilyAction.AddFamilyActionNote("", familyID, fActionType, [], tick):  
 | 
            return  
 | 
    return familyBossFBAction.At(0)  
 | 
  
 | 
  
 | 
def NotifyFamilyBossFBInfo(curPlayer):  
 | 
    '''Í¨ÖªÍæ¼ÒÏÉÃËBOSS¸±±¾ÐÅÏ¢'''  
 | 
    familyID = curPlayer.GetFamilyID()  
 | 
    if familyID:  
 | 
        familyBossFBInfoPack = __GetFamilyBossFBInfoPack(familyID)  
 | 
        NetPackCommon.SendFakePack(curPlayer, familyBossFBInfoPack)  
 | 
    return  
 | 
  
 | 
## Í¨Öª¼Ò×åËùÓгÉÔ±bossÏà¹ØÐÅÏ¢  
 | 
#  @param curFamily ¼Ò×å¶ÔÏó  
 | 
#  @return None  
 | 
def __Notify_FamilyAllMemberBossFBInfo(curFamily):  
 | 
    familyID = curFamily.GetID()  
 | 
    familyBossFBInfoPack = __GetFamilyBossFBInfoPack(familyID)  
 | 
  
 | 
    for i in range(0, curFamily.GetCount()):  
 | 
        notifyMember = curFamily.GetAt(i)  
 | 
              
 | 
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(notifyMember.GetPlayerID())          
 | 
        if curPlayer == None:  
 | 
            continue  
 | 
          
 | 
        # ·¢Ë͸±±¾¿ªÆôÐÅÏ¢  
 | 
        NetPackCommon.SendFakePack(curPlayer, familyBossFBInfoPack)  
 | 
              
 | 
    return  
 | 
  
 | 
  
 | 
## »ñÈ¡¼Ò×帱±¾bossÏà¹ØÐÅÏ¢°ü  
 | 
#  @param familyID ¼Ò×åid  
 | 
#  @return tagGCFamilyBossFBInfoʵÀý  
 | 
def __GetFamilyBossFBInfoPack(familyID):  
 | 
    familyBossFBInfo = ChPyNetSendPack.tagGCFamilyBossFBInfo()  
 | 
    familyBossFBInfo.Clear()  
 | 
    familyBossFBOpenData = __GetFamilyBossFBActionData(familyID)  
 | 
    familyBossFBInfo.IsOpen = GetFamilyBossIsOpen(familyBossFBOpenData) if familyBossFBOpenData else 0  
 | 
    familyBossFBInfo.OpenCnt = GetFamilyBossOpenCnt(familyBossFBOpenData) if familyBossFBOpenData else 0  
 | 
    return familyBossFBInfo  
 | 
  
 | 
  
 | 
## ¼Ò×åboss¿ªÊ¼¡¢±»»÷ɱ  
 | 
#  @param msgList ÐÅÏ¢ÁÐ±í  
 | 
#  @param tick Ê±¼ä  
 | 
#  @return None  
 | 
def FamilyBossOnKilled(msgList, tick):  
 | 
    familyID, isOpen = msgList  
 | 
    curFamily = GameWorld.GetFamilyManager().FindFamily(familyID)  
 | 
    GameWorld.Log("FamilyBossOnKilled familyID=%s" % (familyID))  
 | 
      
 | 
    if not curFamily:  
 | 
        GameWorld.ErrLog("OnFamilyBossKilled can not find family! familyID=%s" % (familyID))  
 | 
        return  
 | 
    familyBossFBData = __GetFamilyBossFBActionData(familyID)  
 | 
    if not familyBossFBData:  
 | 
        return  
 | 
    if not GetFamilyBossIsOpen(familyBossFBData):  
 | 
        GameWorld.ErrLog("    bossÒѾ±»»÷ɱ£¬Öظ´»÷ɱ£¡²»´¦Àí£¡ familyId=%s"  % (familyID))         
 | 
        return  
 | 
    if isOpen == 1:  
 | 
        SetFamilyBossIsOpen(familyBossFBData, int(time.time()))  
 | 
    else:  
 | 
        #ÉèÖÃFB½áÊø  
 | 
        SetFamilyBossIsOpen(familyBossFBData, isOpen)  
 | 
      
 | 
          
 | 
    # ¹ã²¥¸øÔÚÏß¼Ò×å³ÉÔ±¼Ò×åboss¸±±¾ÐÅÏ¢  
 | 
    __Notify_FamilyAllMemberBossFBInfo(curFamily)      
 | 
    return  
 | 
  
 | 
  
 | 
  
 | 
#############################¶àÏÉÃËBOSS#############################  
 | 
  
 | 
def OnAllFamilyBossStateChange(isOpen):  
 | 
    if isOpen:  
 | 
        #±¾´Î¿ªÆôʱ¼ä¾àÀëÉϴλ÷ɱʱ¼ä³¬¹ý1СʱÔòÖØÖà  
 | 
        lastKillTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime)  
 | 
        curTime = int(time.time())  
 | 
        if abs(curTime-lastKillTime)> 3600:  
 | 
            PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime, 0)  
 | 
            #֪ͨ  
 | 
            NotifyAllFamilyBossState()  
 | 
    return  
 | 
  
 | 
def AllFamilyBossKilled():  
 | 
    if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime):  
 | 
        GameWorld.Log('¶àÏÉÃËBossÒѱ»»÷ɱ£¬²»¿ÉÖØ¸´£¡£¡')  
 | 
        return  
 | 
    curTime = int(time.time())  
 | 
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime, curTime)  
 | 
    GameWorld.Log('¶àÏÉÃËBoss±»»÷ɱ!!')  
 | 
    NotifyAllFamilyBossState()  
 | 
    return  
 | 
  
 | 
def NotifyAllFamilyBossState(curPlayer=None):  
 | 
    lastKillTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime)  
 | 
    bossInfo = ChPyNetSendPack.tagGCAllFamilyBossInfo()  
 | 
    bossInfo.IsEnd = 1 if lastKillTime else 0  
 | 
      
 | 
    if curPlayer == None:  
 | 
        playerManager = GameWorld.GetPlayerManager()  
 | 
        for i in xrange(playerManager.GetActivePlayerCount()):  
 | 
            curPlayer = playerManager.GetActivePlayerAt(i)  
 | 
            if curPlayer == None or not curPlayer.GetInitOK():  
 | 
                continue  
 | 
            if PlayerControl.GetIsTJG(curPlayer):  
 | 
                continue  
 | 
            NetPackCommon.SendFakePack(curPlayer, bossInfo)  
 | 
    else:  
 | 
        if PlayerControl.GetIsTJG(curPlayer):  
 | 
            return  
 | 
        NetPackCommon.SendFakePack(curPlayer, bossInfo)  
 | 
    return  
 | 
  
 | 
#ÊÇ·ñÔÚÏÉÃËBOSS»î¶¯ÖÐ  
 | 
def IsInAllFamilyBoss(lineID=-1):  
 | 
    state1 = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss1)  
 | 
    return state1 
 |