#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldLogic.BossHurtMng
|
#
|
# @todo:BossÉËѪÁбí¹ÜÀí£¨²»Çå¿Õ£©
|
# @author hxp
|
# @date 2014-10-30
|
# @version 2.7
|
#
|
# @change: "2014-11-12 16:30" hxp Ôö¼Ó»÷ɱÊÀ½çBoss³É¾Í
|
# @change: "2014-12-16 16:30" hxp Ö§³Ö²»ÅäÖý±Àø
|
# @change: "2014-12-30 03:30" hxp Ö§³Ö°´Ãû´Î¶ÎÅäÖý±Àø
|
# @change: "2015-01-08 22:00" hxp Ôö¼ÓOnHurtValueOrder¸±±¾Í¨Öª
|
# @change: "2015-01-10 11:30" hxp Ôö¼ÓÇå¿Õ×Ô¶¨ÒåÉËѪÁбí(½öÇå¿ÕÁÐ±í£¬²»´¥·¢½±Àø)
|
# @change: "2015-02-07 15:00" hxp Ôö¼Ó»î¶¯¸ø½±ÀøÎïÆ·
|
# @change: "2015-02-12 10:00" hxp NPC¶ÔÏóÑéÖ¤
|
# @change: "2015-06-09 16:20" ljd ÐÞ¸ÄÓʼþ²ÎÊýbossÃûΪNPCID
|
# @change: "2015-09-18 19:30" hxp Ôö¼ÓOnHurtListNotify
|
# @change: "2015-10-28 12:00" hxp ÐÞ¸´µ±´æÔÚ¶àÌõÐéÄâ·ÖÏßʱ£¬ÈôÒÔobjIDΪkey¿ÉÄܵ¼ÖÂÉËѪÁÐ±í±»´íÎóÇå¿ÕµÄbug
|
# @change: "2015-10-29 15:30" hxp Ôö¼ÓOnBossHurtListClear; OnHurtListNotify¸ÄΪOnBossKilledHurtList
|
# @change: "2016-06-30 21:30" hxp bossÌôÕ½¿ª·þ»î¶¯£¬Ö§³ÖÃþ¹Ö
|
# @change: "2016-09-29 21:30" xdh ÖÐÁ¢ÒªÈûboos»÷ɱ³É¾Í¸ÄΪÃþ¹Ö´ï³É
|
# @change: "2016-11-08 12:00" xdh Ôö¼ÓÊÀ½çboss×î´ó¹¥»÷´ÎÊýÏÞÖÆ
|
# @change: "2016-11-22 21:00" hxp ¼Ç¼×î´óÉ˺¦µÄÍæ¼ÒID
|
# @change: "2016-12-07 15:00" hxp ÐÞ¸´ÉËѪÁÐ±í²»Î¨Ò»µÄÇé¿öµ¼ÖµÄbug, Ψһkey¸ñʽ¸ÄΪ lineID_objID_npcID
|
# (¿Í»§¶Ë¶àÓà²éѯµ¼ÖÂbossËÀÍöºóÓÖÖØÐÂÉú³ÉÒ»¸ö¿ÕµÄobjID¶ÔÓ¦µÄÉËѪÁбí, µ±ÁíÒ»¸öNPCIDµÄbossÖØÉúºóÇÒ¸ÕºÃÕ¼ÓøÃobjID
|
# Ôò»áµ¼Ö¸ÃobjID¶ÔÓ¦ÉËѪÁбíÖеÄbossIDûÓиüÐÂΪÕýÈ·µÄID, ´Ó¶øµ¼ÖÂÆäËûÂß¼´íÎóµÄ¿ÉÄÜÐÔ)
|
# @change: "2017-01-19 00:30" xdh ÊÀ½çBOSSµÄÐèÒª»÷ɱ²Å¼ÆËã½ø¿ª·þºÏ·þBOSS»î¶¯
|
# ÏêϸÃèÊö: BossÉËѪÁбí¹ÜÀí£¨²»Çå¿Õ£¬Ö±µ½boss±»»÷ɱ£©
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2017-01-19 00:30"""
|
#---------------------------------------------------------------------
|
|
import GameWorld
|
import ReadChConfig
|
import IPY_GameWorld
|
import NetPackCommon
|
import PlayerControl
|
import ChPyNetSendPack
|
import DataRecordPack
|
import IpyGameDataPY
|
import ItemControler
|
import CrossRealmPlayer
|
import ShareDefine
|
import ChConfig
|
import FBLogic
|
import PlayerVip
|
import PlayerGoldInvest
|
|
import operator
|
import json
|
|
|
## ÉËÑªÍæ¼Ò
|
#
|
## ÉËÑªÍæ¼Ò
|
class HurtPlayer():
|
|
## ¹¹Ô캯Êý
|
# @param None:
|
# @return
|
def __init__(self, playerID, playerName):
|
self.playerID = playerID
|
self.playerName = playerName
|
self.hurtValue = 0
|
GameWorld.DebugLog("HurtPlayer __init__ playerID=%s, playerName=%s" % (playerID, playerName))
|
return
|
|
## Ôö¼ÓÉËѪ
|
# @param value: Ôö¼ÓµÄÉËѪÊýÖµ
|
# @return
|
def AddHurtValue(self, value):
|
self.hurtValue += value
|
return
|
|
## ¶ÔÓ¦BossÉËѪÁбí
|
#
|
## ¶ÔÓ¦BossÉËѪÁбí
|
class BossHurtValueList():
|
|
## ¹¹Ô캯Êý
|
# @param None:
|
# @return
|
def __init__(self, objID, bossID):
|
self.ClearHurtValue(objID, bossID)
|
GameWorld.DebugLog("BossHurtValueList __init__ objID=%s, bossID=%s" % (objID, bossID))
|
return
|
|
## Çå³ýÉËѪÁбí
|
# @param None:
|
# @return
|
def ClearHurtValue(self, objID, bossID):
|
self.objID = objID
|
self.bossID = bossID
|
self.hurtList = []
|
self.queryPlayerIDList = [] # Óвéѯ¹ýÉËѪÁбíµÄÍæ¼ÒIDÁÐ±í£¬ÕâÀïµÄÍæ¼Ò²»Ò»¶¨¶ÔbossÓйýÉ˺¦
|
return
|
|
## Ìí¼Ó²éѯ¹ý¸ÃbossÉËѪÁбíµÄÍæ¼Ò£¨boss±»»÷ɱºóͬ²½×îÖÕ½á¹û¸ø¸ÃÍæ¼Ò£¬Èç¹û»¹Ôڴ˵ØÍ¼µÄ»°£©
|
# @param None:
|
# @return
|
# @remarks ÓÐЩÊÇÕ¾ÔÚÅԱ߿´Ï·µÄ£¬µ«ÊÇÒ»ÑùÒª¿ÉÒÔ²éѯµ½ÉËѪÁбí
|
def AddQueryPlayer(self, playerID):
|
if playerID in self.queryPlayerIDList:
|
return
|
self.queryPlayerIDList.append(playerID)
|
return
|
|
## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪÊýÖµ
|
# @param None:
|
# @return
|
def AddPlayerHurtValue(self, curPlayer, hurtValue):
|
playerID = curPlayer.GetPlayerID()
|
playerName = curPlayer.GetPlayerName()
|
isFind = False
|
for hurtPlayer in self.hurtList:
|
if hurtPlayer.playerID == playerID:
|
isFind = True
|
break
|
|
if not isFind:
|
hurtPlayer = HurtPlayer(playerID, playerName)
|
self.hurtList.append(hurtPlayer)
|
GameWorld.DebugLog("ÐÂÔöBossÉËÑªÍæ¼Ò, objID=%s,bossID=%s,playerID=%s,name=%s,value=%s"
|
% (self.objID, self.bossID, playerID, playerName, hurtValue))
|
|
limitBossIDList, limitCnt = ReadChConfig.GetEvalChConfig("AttackBossCntLimit")
|
if self.bossID in limitBossIDList:
|
#½ñÈÕÃþ¹Ö´ÎÊý+1
|
key = ChConfig.Def_PDict_WorldBoss_HurtCnt
|
newCnt = curPlayer.NomalDictGetProperty(key, 0) + 1
|
PlayerControl.NomalDictSetProperty(curPlayer, key, newCnt)
|
NotifyAttackBossCnt(curPlayer)
|
GameWorld.DebugLog("½ñÈÕÃþ¹Ö´ÎÊý playerID=%s, playerName=%s, newCnt=%s" % (playerID, playerName, newCnt))
|
|
dataDict = {"objID":self.objID, "bossID":self.bossID, "touchCnt":newCnt,
|
"AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()}
|
DataRecordPack.SendEventPack("AddTouchBossCnt", dataDict, curPlayer)
|
|
|
else:
|
curValue = hurtPlayer.hurtValue
|
GameWorld.DebugLog("ÀÛ¼ÓBossÉËѪ, objID=%s,bossID=%s,playerID=%s,name=%s,curValue=%s,addValue=%s"
|
% (self.objID, self.bossID, playerID, playerName, curValue, hurtValue))
|
|
hurtPlayer.AddHurtValue(hurtValue)
|
return
|
|
## »ñÈ¡¸ÃbossÅÅÐòºóµÄÉËѪÁбí
|
# @param None:
|
# @return
|
def GetPlayerHurtValue(self, playerID):
|
isFind = False
|
for hurtPlayer in self.hurtList:
|
if hurtPlayer.playerID == playerID:
|
isFind = True
|
break
|
if not isFind:
|
return 0
|
curValue = hurtPlayer.hurtValue
|
return curValue
|
|
|
## »ñÈ¡¸ÃbossÅÅÐòºóµÄÉËѪÁбí
|
# @param None:
|
# @return
|
def GetSortHurtList(self):
|
self.hurtList = sorted(self.hurtList, key=operator.attrgetter('hurtValue'), reverse=True)
|
return self.hurtList
|
|
## ÉËѪ¹ÜÀí
|
#
|
## ÉËѪ¹ÜÀí
|
class HurtValueMng():
|
|
## ¹¹Ô캯Êý
|
# @param None:
|
# @return
|
def __init__(self):
|
self.objHurtListDict = {}
|
GameWorld.DebugLog("HurtValueMng 222__init__£¡")
|
return
|
|
## Çå³ý¶ÔÓ¦objIDÉËѪÁбí
|
# @param objID:
|
# @return
|
def ClearBossHurtList(self, objID, bossID):
|
key = self.__GetObjHurtListDictKey(objID, bossID)
|
if key not in self.objHurtListDict:
|
return
|
|
self.objHurtListDict.pop(key)
|
GameWorld.DebugLog("ClearBossHurtList key=%s" % key)
|
return True
|
|
## ²éÕÒboss¶ÔÓ¦ÉËѪÁбí
|
# @param None:
|
# @return
|
def FindBossHurtList(self, objID, bossID):
|
key = self.__GetObjHurtListDictKey(objID, bossID)
|
hurtList = self.objHurtListDict.get(key)
|
if not hurtList:
|
hurtList = BossHurtValueList(objID, bossID)
|
self.objHurtListDict[key] = hurtList
|
GameWorld.DebugLog("AddBossHurtList key=%s" % key)
|
return hurtList
|
|
## »ñÈ¡obj¶ÔÓ¦ÉËѪÁбí×Öµäkey£¬ÐèÒÔ·ÖÏßID+objID+npcIDÈ·±£keyΨһ
|
def __GetObjHurtListDictKey(self, objID, bossID):
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
return "%s_%s_%s" % (lineID, objID, bossID)
|
|
## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪ
|
# @param None:
|
# @return
|
def BossAddPlayerInHurtList(self, curPlayer, curBoss, hurtValue):
|
if hurtValue <= 0:
|
return
|
|
if not curPlayer or not curBoss:
|
return
|
|
curObjType = curPlayer.GetGameObjType()
|
if curObjType != IPY_GameWorld.gotPlayer:
|
return
|
|
curBossType = curBoss.GetGameObjType()
|
if curBossType != IPY_GameWorld.gotNPC:
|
return
|
|
objID = curBoss.GetID()
|
bossID = curBoss.GetNPCID()
|
|
bossHurtList = self.FindBossHurtList(objID, bossID)
|
bossHurtList.AddPlayerHurtValue(curPlayer, hurtValue)
|
return
|
|
## »ñÈ¡Íæ¼Ò¶ÔÓ¦bossÉËѪ
|
# @param None:
|
# @return
|
def GetPlayerBossHurt(self, curPlayer, curBoss):
|
if not curPlayer or not curBoss:
|
return 0
|
|
curObjType = curPlayer.GetGameObjType()
|
if curObjType != IPY_GameWorld.gotPlayer:
|
return 0
|
|
curBossType = curBoss.GetGameObjType()
|
if curBossType != IPY_GameWorld.gotNPC:
|
return 0
|
|
objID = curBoss.GetID()
|
bossID = curBoss.GetNPCID()
|
|
bossHurtList = self.FindBossHurtList(objID, bossID)
|
return bossHurtList.GetPlayerHurtValue(curPlayer.GetPlayerID())
|
|
## Ö´ÐÐboss±»»÷ɱºóÂß¼
|
# @param None:
|
# @return
|
def DoLogicOnBossKilled(self, curBoss):
|
objID = curBoss.GetID()
|
bossID = curBoss.GetNPCID()
|
GameWorld.Log("HurtValueMng __DoLogicOnBossKilled objID=%s, bossID=%s" % (objID, bossID))
|
bossHurtList = self.FindBossHurtList(objID, bossID)
|
sortHurtList = bossHurtList.GetSortHurtList()
|
|
# ¼Ç¼×î¸ßÉ˺¦µÄÍæ¼Ò, ÆäËû½áËãÂß¼Óõ½
|
if len(sortHurtList) > 0:
|
maxHurtPlayer = sortHurtList[0]
|
playerID = maxHurtPlayer.playerID
|
curBoss.SetDict(ChConfig.Def_NPC_Dict_BossMaxHurtID % (objID, bossID), playerID)
|
else:
|
curBoss.SetDict(ChConfig.Def_NPC_Dict_BossMaxHurtID % (objID, bossID), 0)
|
|
playerMng = GameWorld.GetPlayerManager()
|
|
# ǰ¼¸Ãû·¢Ëͽ±ÀøÓʼþ
|
bossAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossAward")
|
awardDict = bossAwardDict.get(bossID)
|
if awardDict != None:
|
bossAwardMailInfo = ReadChConfig.GetEvalChConfig("GameWorldBossAwardMail")
|
title, content, getDays = bossAwardMailInfo
|
prizeOrderList = awardDict.keys()
|
prizeOrderList.sort()
|
|
isFB = GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull
|
preOrder = 0
|
for prizeOrder in prizeOrderList:
|
|
for prizeIndex in range(preOrder, prizeOrder):
|
|
if prizeIndex > len(sortHurtList) - 1:
|
GameWorld.DebugLog("½±ÀøË÷Òý(%s)´óÓÚ ÉËѪÁбílen=%s break range(%s,%s)"
|
% (prizeIndex, len(sortHurtList), preOrder, prizeOrder))
|
break
|
|
hurtPlayer = sortHurtList[prizeIndex]
|
playerID = hurtPlayer.playerID
|
order = prizeIndex + 1
|
mailContent = content % (bossID, order)
|
giveItemList = awardDict[prizeOrder]
|
#ɾ³ý¾É°æ·¢ËÍÓʼþ£¬Èç¹û¹¦ÄÜ»¹ÓÐÐèÒª£¬¿ÉʹÓÃа汾·¢ËÍÓʼþ PlayerMail
|
GameWorld.Log(" SendMail order=%s,playerID=%s,giveItemList=%s,isFB=%s"
|
% (order, playerID, str(giveItemList), isFB))
|
|
if isFB:
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer:
|
FBLogic.OnHurtValueOrder(curPlayer, bossID, hurtPlayer.hurtValue, order, giveItemList)
|
|
preOrder = prizeOrder
|
|
# ͬ²½×îÖÕ½á¹û¸ø²éѯ¹ýµÄÍæ¼Ò
|
queryPlayerList = bossHurtList.queryPlayerIDList
|
sendPack = self.GetBossHurtListPack(objID, bossID, sortHurtList, True)
|
GameWorld.DebugLog("ͬ²½×îÖÕ½á¹û¸ø²éѯ¹ý¸ÃbossµÄÍæ¼Ò queryPlayerList=%s" % str(queryPlayerList))
|
for playerID in queryPlayerList:
|
curPlayer = playerMng.FindPlayerByID(playerID)
|
if curPlayer:
|
GameWorld.DebugLog(" playerID=%s" % playerID)
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
|
# »î¶¯½±Àø±ýͼ¸ÅÂÊÁбí
|
actionRandAwardList = []
|
gameWorldMgr = GameWorld.GetGameWorld()
|
bossActionAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossActionAward")
|
for keyInfo, bossAwardDict in bossActionAwardDict.items():
|
|
if len(keyInfo) != 2:
|
continue
|
|
if gameWorldMgr.GetGameWorldDictByKey(keyInfo[0]) != keyInfo[1]:
|
continue
|
|
if bossID in bossAwardDict:
|
actionRandAwardList = bossAwardDict[bossID]
|
break
|
|
# ÉËÑªÍæ¼Ò¶îÍâ´¦Àí
|
|
for hurtPlayer in sortHurtList:
|
playerID = hurtPlayer.playerID
|
curPlayer = playerMng.FindPlayerByID(playerID)
|
if not curPlayer:
|
continue
|
|
# ¸ø»î¶¯½±Àø
|
if actionRandAwardList:
|
randAwardList = GameWorld.GetResultByRandomList(actionRandAwardList)
|
if randAwardList:
|
for itemID, itemCnt, isBind in randAwardList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
|
|
|
# ͬ²½É˺¦Áбí
|
FBLogic.OnBossKilledHurtList(objID, bossID, sortHurtList)
|
|
# Çå¿ÕÉËѪÁбíÊý¾Ý
|
bossHurtList.ClearHurtValue(objID, bossID)
|
return
|
|
## »ñÈ¡bossÉËѪÁбíͬ²½·â°ü½á¹¹
|
# @param None:
|
# @return
|
def GetBossHurtListPack(self, objID, bossID, hurtList, isSort):
|
if isSort:
|
GameWorld.DebugLog("BossÉËѪÁÐ±í£ºobjID=%s,bossID=%s,isSort=%s,hurtList=%s"
|
% (objID, bossID, isSort, hurtList))
|
bossHurtPack = ChPyNetSendPack.tagMCBossHurtList()
|
bossHurtPack.Clear()
|
bossHurtPack.ObjID = objID
|
bossHurtPack.BossID = bossID
|
bossHurtPack.IsSort = isSort
|
bossHurtPack.HurtPlayerList = []
|
for hurtPlayer in hurtList:
|
hPlayer = ChPyNetSendPack.tagMCHurtPlayer()
|
hPlayer.PlayerID = hurtPlayer.playerID
|
hPlayer.PlayerName = hurtPlayer.playerName
|
hPlayer.NameLen = len(hPlayer.PlayerName)
|
hPlayer.HurtValue = hurtPlayer.hurtValue
|
bossHurtPack.HurtPlayerList.append(hPlayer)
|
if isSort:
|
GameWorld.DebugLog(" playerID=%s,playerName=%s,hurtValue=%s"
|
% (hurtPlayer.playerID, hurtPlayer.playerName, hurtPlayer.hurtValue))
|
bossHurtPack.HurtCnt = len(bossHurtPack.HurtPlayerList)
|
return bossHurtPack
|
|
|
g_hurtValueMng = HurtValueMng()
|
|
|
## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪ£¬Íⲿµ÷Óøú¯Êý
|
# @param None:
|
# @return
|
def BossAddPlayerInHurtList(curPlayer, curBoss, hurtValue):
|
|
if not __CheckIsNeedProcessBoss(curBoss):
|
return
|
|
g_hurtValueMng.BossAddPlayerInHurtList(curPlayer, curBoss, hurtValue)
|
return
|
|
## »ñÈ¡Íæ¼Ò¶ÔÓ¦bossÉËѪ£¬Íⲿµ÷Óøú¯Êý
|
# @param None:
|
# @return
|
def GetPlayerBossHurt(curPlayer, curBoss):
|
|
if not __CheckIsNeedProcessBoss(curBoss):
|
return 0
|
|
return g_hurtValueMng.GetPlayerBossHurt(curPlayer, curBoss)
|
|
## boss±»»÷ɱ£¬Íⲿµ÷Óøú¯Êý
|
# @param None:
|
# @return
|
def BossOnKilled(curBoss):
|
|
if not __CheckIsNeedProcessBoss(curBoss):
|
return
|
|
g_hurtValueMng.DoLogicOnBossKilled(curBoss)
|
return
|
|
## Íæ¼Ò²éѯ¶ÔÓ¦bossµÄÉËѪÁбí
|
# @param None:
|
# @return
|
def OnQueryBossHurtList(curPlayer, clientData):
|
objID = clientData.ObjID
|
bossID = clientData.BossID
|
if not __IsNeedProcess(bossID):
|
return
|
|
bossHurtList = g_hurtValueMng.FindBossHurtList(objID, bossID)
|
# ´æ´¢¸ÃÍæ¼Ò²éѯ¹ý£¬boss±»»÷ɱʱ£¬Í¬²½×îÖÕÉËѪÁÐ±í¸ø¸ÃÍæ¼Ò
|
bossHurtList.AddQueryPlayer(curPlayer.GetPlayerID())
|
sendPack = g_hurtValueMng.GetBossHurtListPack(objID, bossID, bossHurtList.hurtList, False)
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
return
|
|
## Çå³ý¶ÔÓ¦objIDÉËѪÁбí
|
# @param curNPC:
|
# @return
|
def ClearHurtValueList(curNPC):
|
|
if not __CheckIsNeedProcessBoss(curNPC):
|
return
|
|
objID = curNPC.GetID()
|
bossID = curNPC.GetNPCID()
|
|
bossHurtList = g_hurtValueMng.FindBossHurtList(objID, bossID)
|
sortHurtList = bossHurtList.GetSortHurtList()
|
FBLogic.OnBossHurtListClear(objID, bossID, sortHurtList)
|
g_hurtValueMng.ClearBossHurtList(objID, bossID)
|
return
|
|
def __CheckIsNeedProcessBoss(curBoss):
|
''' ¼ì²éÊÇ·ñΪÐèÒª´¦ÀíµÄboss '''
|
curBossType = curBoss.GetGameObjType()
|
if curBossType != IPY_GameWorld.gotNPC:
|
return False
|
|
if not ChConfig.IsGameBoss(curBoss):
|
return False
|
|
if not __IsNeedProcess(curBoss.GetNPCID()):
|
return False
|
|
return True
|
|
|
## ÊÇ·ñÐèÒª´¦Àí
|
# @param bossID:
|
# @return
|
def __IsNeedProcess(bossID):
|
bossAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossAward")
|
if bossID in bossAwardDict:
|
return True
|
|
gameWorldMgr = GameWorld.GetGameWorld()
|
bossActionAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossActionAward")
|
for keyInfo, bossAwardDict in bossActionAwardDict.items():
|
|
if len(keyInfo) != 2:
|
continue
|
|
if gameWorldMgr.GetGameWorldDictByKey(keyInfo[0]) != keyInfo[1]:
|
continue
|
|
if bossID in bossAwardDict:
|
return True
|
|
return False
|
|
## ¹ýÌì
|
def OnDay(curPlayer):
|
#Çå¿Õµ±ÌìÃþboss´ÎÊý
|
setCrossDict = {}
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WorldBoss_HurtCnt, 0)
|
killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {})
|
for index, limitCnt in killBossCntLimitDict.items():
|
|
killCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%index, 0)
|
#hasBuyKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%index, 0)
|
# if killCnt >= limitCnt:
|
# itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%index, 0)
|
# updItemAddCnt = max(0, limitCnt + hasBuyKillCnt + vipAddKillCnt + itemAddKillCnt -killCnt)
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntItemAddCnt%index, updItemAddCnt)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCnt % index, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntBuyCnt % index, 0)
|
if index == ShareDefine.Def_Boss_Func_Dogz:
|
setCrossDict.update({ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index:0,
|
ChConfig.Def_PDict_Boss_KillCnt % index:0,
|
ChConfig.Def_PDict_Boss_KillCntBuyCnt % index:0,
|
})
|
|
NotifyAttackBossCnt(curPlayer)
|
CrossRealmPlayer.SetCrossPlayerNomalDict(curPlayer, setCrossDict)
|
return
|
|
## µÇ¼´¦Àí
|
# @param curPlayer
|
# @return None
|
def OnLogin(curPlayer):
|
NotifyAttackBossCnt(curPlayer)
|
return
|
|
|
## ֪ͨ¿Í»§¶Ë¹¥»÷boss´ÎÊý
|
def NotifyAttackBossCnt(curPlayer, limitIndex=-1):
|
packdata = ChPyNetSendPack.tagMCBOSSAttactCnt()
|
packdata.Clear()
|
packdata.KillCntInfoList = []
|
|
killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {})
|
|
for index in killBossCntLimitDict.keys():
|
if limitIndex !=-1 and index != limitIndex:
|
continue
|
killCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt % index, 0)
|
hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt % index, 0)
|
itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index, 0)
|
infoPack = ChPyNetSendPack.tagMCBossCntInfo()
|
infoPack.BossType = index
|
infoPack.KillCnt = killCnt
|
infoPack.ItemAddCnt = itemAddCnt
|
infoPack.BuyCnt = hasBuyCnt
|
infoPack.KillCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntTotal % index, 0)
|
packdata.KillCntInfoList.append(infoPack)
|
|
packdata.Cnt = len(packdata.KillCntInfoList)
|
NetPackCommon.SendFakePack(curPlayer, packdata)
|
return
|
|
|
# BOSSÊ£Óà¿É»÷ɱ´ÎÊý
|
def GetCanKillBossCnt(curPlayer, bossFuncIndex):
|
#»ñÈ¡BOSSÊ£Óà¿É»÷ɱÊýÁ¿Óë×î´óÊýÁ¿
|
hasKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%bossFuncIndex, 0)
|
itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%bossFuncIndex, 0)
|
hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%bossFuncIndex, 0)
|
killLimitPrivilege = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 4, {}).get(bossFuncIndex, 0)
|
if killLimitPrivilege:
|
limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, killLimitPrivilege)
|
else:
|
limitCnt = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}).get(bossFuncIndex, 0)
|
limitCnt += PlayerGoldInvest.GetAddBossCnt(curPlayer, bossFuncIndex) # Ͷ×Ê¿¨¼ÓÉÏÏÞ
|
return max(0, limitCnt + itemAddKillCnt + hasBuyCnt - hasKillCnt), limitCnt
|
|
|