#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package CrossYaomoBoss
|
#
|
# @todo:¿ç·þÑýħboss
|
# @author hxp
|
# @date 2022-11-11
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ç·þÑýħboss
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2022-11-11 15:30"""
|
#-------------------------------------------------------------------------------
|
|
import ShareDefine
|
import PyDataManager
|
import CrossRealmMsg
|
import IpyGameDataPY
|
import CrossBillboard
|
import ChPyNetSendPack
|
import PlayerCompensation
|
import CrossRealmPlayer
|
import PlayerViewCache
|
import NetPackCommon
|
import PlayerControl
|
import PyGameData
|
import GameWorld
|
|
Def_RecType_CrossYaomoBossHurtInfo = ShareDefine.Def_UniversalGameRecType_CrossYaomoBossHurtInfo
|
'''
|
¿ç·þÑýħbossÉËѪÐÅÏ¢
|
ShareDefine.Def_UniversalGameRecType_CrossYaomoBossHurtInfo
|
value1:zoneID ·ÖÇøID
|
value2:playerID Íæ¼ÒID
|
value3:awardState Ä¿±êÉ˺¦Áì½±¼Ç¼
|
StrValue1:hurtTotal ½ñÈÕ×ÜÉ˺¦
|
'''
|
def GetRecZoneID(recData): return recData.GetValue1()
|
def SetRecZoneID(recData, zoneID): return recData.SetValue1(zoneID)
|
def GetRecPlayerID(recData): return recData.GetValue2()
|
def SetRecPlayerID(recData, playerID): return recData.SetValue2(playerID)
|
def GetRecAwardState(recData): return recData.GetValue3()
|
def SetRecAwardState(recData, awardState): return recData.SetValue3(awardState)
|
def GetRecHurtTotal(recData): return GameWorld.ToIntDef(recData.GetStrValue1(), 0)
|
def SetRecHurtTotal(recData, hurtTotal): return recData.SetStrValue1(str(hurtTotal))
|
|
def DoOnDay():
|
|
if not GameWorld.IsCrossServer():
|
return
|
|
hurtValueAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 3, {})
|
hurtValueIntAwardDict = {int(k):v for k, v in hurtValueAwardDict.items()}
|
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
|
for index in xrange(recDataList.Count()):
|
recData = recDataList.At(index)
|
playerID = GetRecPlayerID(recData)
|
awardState = GetRecAwardState(recData)
|
hurtTotal = GetRecHurtTotal(recData)
|
|
for awardIndex, hurtValueInfo in hurtValueIntAwardDict.items():
|
needHurtValue, awardItemList = hurtValueInfo
|
if hurtTotal < needHurtValue:
|
continue
|
if awardState & pow(2, awardIndex):
|
continue
|
paramList = [needHurtValue]
|
PlayerCompensation.SendMailByKey("CrossYaomoBossHurtValue", [playerID], awardItemList, paramList, crossMail=True)
|
|
universalRecMgr.Delete(Def_RecType_CrossYaomoBossHurtInfo)
|
|
# ¹ã²¥×Ó·þÖØÖÃÉ˺¦
|
serverGroupIDList = []
|
sendMsg = {"HurtReset":1}
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
|
return
|
|
def ClientServerMsg_CrossYaomoBossHurtAward(serverGroupID, msgData):
|
|
playerID = msgData["playerID"]
|
awardIndex = msgData["awardIndex"]
|
|
hurtValueAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 3, {})
|
if str(awardIndex) not in hurtValueAwardDict:
|
return
|
needHurtValue, awardItemList = hurtValueAwardDict[str(awardIndex)]
|
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
|
for index in xrange(recDataList.Count()):
|
recData = recDataList.At(index)
|
if playerID != GetRecPlayerID(recData):
|
continue
|
|
awardState = GetRecAwardState(recData)
|
hurtTotal = GetRecHurtTotal(recData)
|
if hurtTotal < needHurtValue:
|
GameWorld.ErrLog("¿ç·þÑýħbossÉ˺¦²»×㣬ÎÞ·¨Áì½±! awardIndex=%s,needHurtValue=%s > %s" % (awardIndex, needHurtValue, hurtTotal), playerID)
|
return
|
|
if awardState & pow(2, awardIndex):
|
GameWorld.ErrLog("ÒѾÁìÈ¡¹ý¸Ã¿ç·þÑýħbossÉ˺¦½±Àø! awardIndex=%s,awardState=%s" % (awardIndex, awardState), playerID)
|
return
|
awardState |= pow(2, awardIndex)
|
SetRecAwardState(recData, awardState)
|
GameWorld.Log("ÁìÈ¡¿ç·þÑýħbossÉ˺¦½±Àø! awardIndex=%s,awardState=%s,awardItemList=%s" % (awardIndex, awardState, awardItemList), playerID)
|
|
serverGroupIDList = [serverGroupID]
|
syncPlayerHurtInfo = {playerID:{"hurtTotal":hurtTotal, "awardState":awardState, "awardIndex":awardIndex, "awardItemList":awardItemList}}
|
sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo}
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
|
return
|
|
return
|
|
def Sync_CrossYaomoBossDataToClientServer(serverGroupID=0):
|
''' ͬ²½¿ç·þÊý¾Ýµ½×Ó·þÎñÆ÷
|
@param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ
|
'''
|
GameWorld.Log("ͬ²½¸ø×Ó·þ¿ç·þÑýħBossÊý¾Ý: syncServerGroupID=%s" % (serverGroupID))
|
|
syncPlayerHurtInfo = {}
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
|
for index in xrange(recDataList.Count()):
|
recData = recDataList.At(index)
|
playerID = GetRecPlayerID(recData)
|
awardState = GetRecAwardState(recData)
|
hurtTotal = GetRecHurtTotal(recData)
|
syncPlayerHurtInfo[playerID] = {"hurtTotal":hurtTotal, "awardState":awardState}
|
|
# ¹ã²¥×Ó·þÖØÖÃÉ˺¦
|
if syncPlayerHurtInfo:
|
serverGroupIDList = []
|
sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo}
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
|
return
|
|
def MapServer_CrossYaomoBossHurtInfo(msgList):
|
|
zoneID, npcID, playerHurtList = msgList
|
GameWorld.Log("µØÍ¼¿ç·þÑýħbossÉ˺¦½áËãÐÅÏ¢: zoneID=%s,npcID=%s,hurtPlayerCount=%s" % (zoneID, npcID, len(playerHurtList)))
|
|
rankAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 2, {})
|
rankIntAwardDict = {int(k):v for k, v in rankAwardDict.items()}
|
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
|
hurtRecDict = {}
|
for index in xrange(recDataList.Count()):
|
recData = recDataList.At(index)
|
hurtRecDict[(GetRecZoneID(recData), GetRecPlayerID(recData))] = recData
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_YaomoBossHurt, groupValue1)
|
billboardObj.ClearData()
|
|
syncPlayerHurtInfo = {}
|
for rank, hurtInfo in enumerate(playerHurtList, 1):
|
playerID, hurtValue, hurtName = hurtInfo
|
|
job, realmLV, accID = 1, 1, ""
|
curCache = PlayerViewCache.FindViewCache(playerID)
|
if curCache:
|
cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
|
job = cacheDict.get("Job", job)
|
realmLV = cacheDict.get("RealmLV", realmLV)
|
accID = cacheDict.get("AccID", accID)
|
|
# ¸üÐÂ×îÐÂÒ»´ÎÉ˺¦ÅÅÃû°ñµ¥
|
dataID, name1, name2 = playerID, hurtName, ""
|
type2, value1, value2 = job, realmLV, 0
|
cmpValue = hurtValue / ShareDefine.Def_PerPointValue
|
cmpValue2 = hurtValue % ShareDefine.Def_PerPointValue
|
noSortAndSync = False if rank == len(playerHurtList) else True
|
CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_YaomoBossHurt, groupValue1, dataID, name1, name2,
|
type2, value1, value2, cmpValue, cmpValue2, noSortAndSync=noSortAndSync)
|
|
# Ãû´Î½±ÀøÖ±½Ó·¢·Å
|
awardItemList = GameWorld.GetOrderValueByDict(rankIntAwardDict, rank, False)
|
if awardItemList:
|
paramList = [rank]
|
PlayerCompensation.SendMailByKey("CrossYaomoBossHurtRank", [playerID], awardItemList, paramList, crossMail=True)
|
|
key = (zoneID, playerID)
|
if key not in hurtRecDict:
|
recData = recDataList.AddRec()
|
SetRecZoneID(recData, zoneID)
|
SetRecPlayerID(recData, playerID)
|
hurtTotal = hurtValue
|
else:
|
recData = hurtRecDict[key]
|
hurtTotal = GetRecHurtTotal(recData) + hurtValue
|
SetRecHurtTotal(recData, hurtTotal)
|
syncPlayerHurtInfo[playerID] = {"hurtTotal":hurtTotal, "awardState":GetRecAwardState(recData)}
|
GameWorld.Log(" rank=%s,playerID=%s,hurtValue=%s,hurtTotal=%s,accID=%s" % (rank, playerID, hurtValue, hurtTotal, accID))
|
|
# ֪ͨ×Ó·þ¸üÐÂÍæ¼Ò×ÜÉ˺¦
|
if syncPlayerHurtInfo:
|
serverGroupIDList = []
|
sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo, "killBoss":1}
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
|
|
return
|
|
def CrossServerMsg_CrossYaomoBossHurtInfo(msgData):
|
|
playerMgr = GameWorld.GetPlayerManager()
|
|
if "HurtReset" in msgData:
|
# ÖØÖÃÉ˺¦
|
syncPlayerIDList = PyGameData.g_crossYaomoBossHurtInfo.keys()
|
PyGameData.g_crossYaomoBossHurtInfo = {}
|
for playerID in syncPlayerIDList:
|
curPlayer = playerMgr.FindPlayerByID(playerID)
|
if not curPlayer or not curPlayer.GetInitOK():
|
continue
|
Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
|
|
return
|
|
#zoneID = msgData["zoneID"]
|
#npcID = msgData["npcID"]
|
syncPlayerHurtInfo = msgData["syncPlayerHurtInfo"]
|
isKillBoss = msgData.get("killBoss") == 1
|
|
for playerID, hurtInfo in syncPlayerHurtInfo.items():
|
if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
continue
|
awardIndex = hurtInfo.pop("awardIndex", None)
|
awardItemList = hurtInfo.pop("awardItemList", None)
|
|
PyGameData.g_crossYaomoBossHurtInfo[playerID] = hurtInfo
|
|
curPlayer = playerMgr.FindPlayerByID(playerID)
|
if not curPlayer or not curPlayer.GetInitOK():
|
continue
|
Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
|
|
if awardIndex != None:
|
# ֪ͨµØÍ¼·¢·Å½±Àø
|
msgInfo = ["HurtValueAward", [awardIndex, awardItemList]]
|
CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossYaomoBoss", msgInfo)
|
|
if isKillBoss:
|
# ֪ͨµØÍ¼»÷ɱÑýħboss
|
msgInfo = ["KillYaomoBoss", hurtInfo]
|
CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossYaomoBoss", msgInfo)
|
|
return
|
|
def OnPlayerLogin(curPlayer):
|
if GameWorld.IsCrossServer():
|
return
|
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in PyGameData.g_crossYaomoBossHurtInfo:
|
return
|
|
Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
|
return
|
|
def Sync_CrossYaomoBossPlayerHurtInfo(curPlayer):
|
hurtInfo = PyGameData.g_crossYaomoBossHurtInfo.get(curPlayer.GetPlayerID(), {})
|
hurtTotal = hurtInfo.get("hurtTotal", 0)
|
awardState = hurtInfo.get("awardState", 0)
|
clientPack = ChPyNetSendPack.tagGCCrossYaomoBossPlayerHurtInfo()
|
clientPack.HurtTotal = hurtTotal % ShareDefine.Def_PerPointValue
|
clientPack.HurtTotalEx = hurtTotal / ShareDefine.Def_PerPointValue
|
clientPack.AwardState = awardState
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|