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