| #!/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 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)  | 
|     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!" % (foodCost))  | 
|     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  | 
|   | 
|   | 
|   | 
|   |