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