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