#!/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 PlayerCompensation import ChPyNetSendPack import NetPackCommon import ShareDefine import IpyGameDataPY import PlayerDBGSEvent import PlayerControl import ChConfig import time def FamilyBossFBOnWeek(curFamily): return def FamilyBossFBOnDay(curFamily): __FamilyBossFBHurtOnDay(curFamily) return def OnLogin(curPlayer): SyncFamilyBosFBInfo(curPlayer.GetFamilyID(), None, curPlayer) NotifyAllFamilyBossState(curPlayer) return def OnPlayerJionFamily(curFamily, curPlayer): SyncFamilyBosFBInfo(curPlayer.GetFamilyID(), None, curPlayer) return def __FamilyBossFBHurtOnDay(curFamily): familyID = curFamily.GetID() #²¹·¢ÏÉÃËÉËѪ½±Àø hurtValueTotal = 0 memberHurtAwardStateDict = {} fActionType = ShareDefine.Def_ActionType_FamilyBossFB familyBossFBAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, fActionType) for index in range(familyBossFBAction.Count()): actionData = familyBossFBAction.At(index) playerID = actionData.GetValue1() if playerID == 1: hurtValueTotal = GetFamilyBossPlayerHurtValue(actionData) else: hurtAwardStateFamily = actionData.GetValue2() memberHurtAwardStateDict[playerID] = hurtAwardStateFamily #GameWorld.DebugLog("__FamilyBossFBHurtOnDay hurtValueTotal=%s,memberHurtAwardStateDict=%s" % (hurtValueTotal, memberHurtAwardStateDict), familyID) awardIpyDataList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for ipyIndex in range(ipyDataMgr.GetFamilyBossHurtAwardCount()): ipyData = ipyDataMgr.GetFamilyBossHurtAwardByIndex(ipyIndex) if ipyData.GetAwardType() != 2: continue needHurtTotal = ipyData.GetNeedHurtTotal() if hurtValueTotal < needHurtTotal: #GameWorld.DebugLog(" ÏÉÃËÉËѪ²»×㣬²»²¹·¢¸Ã½±Àø! needHurtTotal=%s" % needHurtTotal, familyID) continue awardIpyDataList.append(ipyData) offLineHourMax = 48 for index in xrange(curFamily.GetCount()): member = curFamily.GetAt(index) playerID = member.GetPlayerID() offLineHour = GameWorld.GetPastHour(GameWorld.ChangeTimeNumToStr(member.GetExattr2())) if member.GetExattr2() > 1 else 0 if offLineHour >= offLineHourMax: #GameWorld.DebugLog(" ÀëÏß¹ý¾Ã£¬²»²¹·¢. playerID=%s,offLineHour=%s" % (playerID, offLineHour), familyID) continue hurtAwardStateFamily = memberHurtAwardStateDict.get(playerID, 0) for ipyData in awardIpyDataList: recordIndex = ipyData.GetRecordIndex() if hurtAwardStateFamily & pow(2, recordIndex): #GameWorld.DebugLog(" ÒѾ­ÁìÈ¡¹ý£¬²»²¹·¢. playerID=%s,recordIndex=%s,%s" % (playerID, recordIndex, hurtAwardStateFamily), familyID) continue needHurtTotal = ipyData.GetNeedHurtTotal() paramList = [needHurtTotal] awardItemList = ipyData.GetAwardItemList() PlayerCompensation.SendMailByKey("FamilyBossHurtAwardFamily", [playerID], awardItemList, paramList) #GameWorld.DebugLog(" Óʼþ²¹·¢ÉËѪ½±Àø. playerID=%s,recordIndex=%s" % (playerID, recordIndex), familyID) # ×îºóÇå³ýaction PlayerFamilyAction.ClearFamilyAction(familyID, fActionType) SyncFamilyBosFBInfo(familyID, curFamily) return def GetFamilyBossFBActionData(familyID, playerID=1): ## »ñÈ¡ÏÉÃËbossÉËѪaction # playerID 1-ÌØÊâÀàÐÍ£¬¼Ç¼ÏÉÃË×ÜÉ˺¦ÐÅÏ¢£»>1-Íæ¼ÒÏÉÃËÉËѪ½±ÀøÁì½±¼Ç¼ findActionData = None fActionType = ShareDefine.Def_ActionType_FamilyBossFB familyBossFBAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, fActionType) for index in range(familyBossFBAction.Count()): actionData = familyBossFBAction.At(index) if playerID == actionData.GetValue1(): findActionData = actionData break if not findActionData: findActionData = familyBossFBAction.AddAction() findActionData.SetFamilyId(familyID) findActionData.SetActionType(fActionType) findActionData.SetValue1(playerID) return findActionData def GetFamilyBossPlayerHurtValue(actionData): return actionData.GetValue3() * ChConfig.Def_PerPointValue + actionData.GetValue2() def SetFamilyBossPlayerHurtValue(actionData, hurtValue): actionData.SetValue2(hurtValue % ChConfig.Def_PerPointValue) actionData.SetValue3(hurtValue / ChConfig.Def_PerPointValue) return def MapServer_FamilyBoss(msgList, tick): msgType, msgData = msgList # ͬ²½ÉËѪ if msgType == "FBMemberHurt": __addFBMemberHurtInfo(msgData) return # ÏÉÃËÉËѪÁì½± - ÇëÇó if msgType == "FamilyHurtAwardReq": familyID = msgData[0] actionData = GetFamilyBossFBActionData(familyID) hurtValueTotal = GetFamilyBossPlayerHurtValue(actionData) if actionData else 0 return msgList + [hurtValueTotal] # ÏÉÃËÉËѪÁì½±¼Ç¼ͬ²½ - ÓÃÓÚ¼ÓÈëÏÉÃËʱ£¬Í¬²½µ½GameServer£¬·½±ãͳһ´¦Àí²¹·¢½±Àø if msgType == "FamilyHurtAwardStateFamily": familyID, playerID, hurtAwardStateFamily = msgData actionData = GetFamilyBossFBActionData(familyID, playerID) actionData.SetValue2(hurtAwardStateFamily) return return def __addFBMemberHurtInfo(msgData): ## Ôö¼ÓÏÉÃËbossÏÉÃË×ÜÉËѪ statsType, familyID, fightMemCount, addFamilyHurt = msgData curFamily = GameWorld.GetFamilyManager().FindFamily(familyID) if not curFamily: return actionData = GetFamilyBossFBActionData(familyID) if not actionData: return actionData.SetValue4(fightMemCount) hurtValueTotal = GetFamilyBossPlayerHurtValue(actionData) + addFamilyHurt SetFamilyBossPlayerHurtValue(actionData, hurtValueTotal) #GameWorld.DebugLog("FamilyBossFBMemberHurt statsType=%s,familyID=%s,fightMemCount=%s,addFamilyHurt=%s,hurtValueTotal=%s" # % (statsType, familyID, fightMemCount, addFamilyHurt, hurtValueTotal)) if statsType: SyncFamilyBosFBInfo(familyID, curFamily) return def SyncFamilyBosFBInfo(familyID, curFamily=None, curPlayer=None): if not familyID: return if not curFamily and not curPlayer: return actionData = GetFamilyBossFBActionData(familyID) if not actionData: return clientPack = ChPyNetSendPack.tagGCFamilyBosFBInfo() clientPack.Clear() clientPack.HurtTotal = actionData.GetValue2() clientPack.HurtTotalPoint = actionData.GetValue3() clientPack.FightMemCount = actionData.GetValue4() if curFamily: for i in range(0, curFamily.GetCount()): notifyMember = curFamily.GetAt(i) curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(notifyMember.GetPlayerID()) if curPlayer == None: continue NetPackCommon.SendFakePack(curPlayer, clientPack) return if curPlayer: NetPackCommon.SendFakePack(curPlayer, clientPack) 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