#!/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} 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"] 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: continue # ֪ͨµØÍ¼·¢·Å½±Àø msgInfo = ["HurtValueAward", [awardIndex, awardItemList]] 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