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