| #!/usr/bin/python | 
| # -*- coding: GBK -*- | 
| #------------------------------------------------------------------------------- | 
| # | 
| ##@package Player.PlayerActBossTrial | 
| # | 
| # @todo:bossÀúÁ· | 
| # @author hxp | 
| # @date 2023-10-20 | 
| # @version 1.0 | 
| # | 
| # ÏêϸÃèÊö: bossÀúÁ· | 
| # | 
| #------------------------------------------------------------------------------- | 
| #"""Version = 2023-10-20 16:00""" | 
| #------------------------------------------------------------------------------- | 
|   | 
| import PyGameData | 
| import ItemCommon | 
| import ShareDefine | 
| import PlayerControl | 
| import IpyGameDataPY | 
| import ChPyNetSendPack | 
| import PlayerBillboard | 
| import ItemControler | 
| import NetPackCommon | 
| import IPY_GameWorld | 
| import GameWorld | 
| import ChConfig | 
|   | 
| def OnMixFirstLogin(curPlayer): | 
|      | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossTrial, {}).values(): | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) | 
|         if not actInfo.get(ShareDefine.ActKey_State): | 
|             continue | 
|         submitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitCount % actNum) | 
|         if not submitCount: | 
|             continue | 
|         GameWorld.Log("BossÀúÁ·ºÏ·þÊ×µÇͬ²½Æ¾Ö¤°ñµ¥: actNum=%s,submitCount=%s" % (actNum, submitCount), curPlayer.GetPlayerID()) | 
|         PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_BossTrialSubmit, submitCount) | 
|         break | 
|      | 
|     return | 
|   | 
| def OnPlayerLogin(curPlayer): | 
|      | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossTrial, {}).values(): | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) | 
|         isReset = __CheckPlayerBossTrialAction(curPlayer, actNum) | 
|         # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ | 
|         if not isReset and actInfo.get(ShareDefine.ActKey_State): | 
|             Sync_BossTrialActionInfo(curPlayer, actNum) | 
|             Sync_BossTrialPlayerInfo(curPlayer, actNum) | 
|              | 
|     return | 
|   | 
| def RefreshBossTrialActionInfo(actNum): | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ | 
|     playerManager = GameWorld.GetPlayerManager() | 
|     for index in xrange(playerManager.GetPlayerCount()): | 
|         curPlayer = playerManager.GetPlayerByIndex(index) | 
|         if curPlayer.GetID() == 0: | 
|             continue | 
|         __CheckPlayerBossTrialAction(curPlayer, actNum) | 
|     return | 
|   | 
| def __CheckPlayerBossTrialAction(curPlayer, actNum): | 
|     ## ¼ì²éÍæ»î¶¯Êý¾ÝÐÅÏ¢ | 
|      | 
|     playerID = curPlayer.GetPlayerID() | 
|      | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BossTrial, actNum) | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0) | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0) | 
|      | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialID % actNum) # Íæ¼ÒÉíÉϵĻID | 
|      | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí | 
|     if actID == playerActID: | 
|         GameWorld.DebugLog("BossÀúÁ·»î¶¯ID²»±ä£¬²»´¦Àí£¡ actID=%s" % actID, curPlayer.GetPlayerID()) | 
|         return | 
|     GameWorld.DebugLog("BossÀúÁ·»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID) | 
|      | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialID % actNum, actID) | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialSubmitCount % actNum, 0) | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialSubmitAward % actNum, 0) | 
|      | 
|     if state: | 
|         Sync_BossTrialActionInfo(curPlayer, actNum) | 
|         Sync_BossTrialPlayerInfo(curPlayer, actNum) | 
|          | 
|     return True | 
|   | 
| #// AA 23 BossÀúÁ·Ìύƾ֤ #tagCMActBossTrialSubmit | 
| # | 
| #struct    tagCMActBossTrialSubmit | 
| #{ | 
| #    tagHead        Head; | 
| #    BYTE        ActNum;        //»î¶¯±àºÅ | 
| #    WORD        SubmitCount;    //Ìύƾ֤¸öÊý | 
| #}; | 
| def OnActBossTrialSubmit(index, clientData, tick): | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|     actNum = clientData.ActNum | 
|     submitCount = clientData.SubmitCount | 
|      | 
|     playerID = curPlayer.GetPlayerID() | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BossTrial, actNum) | 
|     if not actInfo.get(ShareDefine.ActKey_State): | 
|         GameWorld.DebugLog("BossÀúÁ··Ç»î¶¯ÖÐ: actNum=%s" % actNum, playerID) | 
|         return | 
|      | 
|     itemID = IpyGameDataPY.GetFuncCfg("BossTrial", 1) | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|     lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList({itemID:submitCount}, itemPack) | 
|     if lackItemDict: | 
|         GameWorld.DebugLog("BossÀúÁ·Ìύƾ֤ÎïÆ·²»×㣡 actNum=%s,itemID=%s,submitCount=%s,lackItemDict=%s" % (actNum, itemID, submitCount, lackItemDict), playerID) | 
|         return | 
|     ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "BossTrialSubmit") | 
|      | 
|     nowSubmitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitCount % actNum) | 
|     updSubmitCount = nowSubmitCount + submitCount     | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialSubmitCount % actNum, updSubmitCount) | 
|     GameWorld.DebugLog("BossÀúÁ·Ìύƾ֤: actNum=%s,itemID=%s,submitCount=%s,updSubmitCount=%s" % (actNum, itemID, submitCount, updSubmitCount), playerID) | 
|      | 
|     PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_BossTrialSubmit, updSubmitCount) | 
|      | 
|     Sync_BossTrialPlayerInfo(curPlayer, actNum) | 
|     return | 
|   | 
| #// AA 24 BossÀúÁ·Áì½± #tagCMActBossTrialGetAward | 
| # | 
| #struct    tagCMActBossTrialGetAward | 
| #{ | 
| #    tagHead        Head; | 
| #    BYTE        ActNum;        //»î¶¯±àºÅ | 
| #    WORD        SubmitCount;    //Áìȡƾ֤¸öÊý¶ÔÓ¦½±Àø | 
| #}; | 
| def OnActBossTrialGetAward(index, clientData, tick): | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|     actNum = clientData.ActNum | 
|     submitCount = clientData.SubmitCount | 
|      | 
|     playerID = curPlayer.GetPlayerID() | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BossTrial, actNum) | 
|     if not actInfo.get(ShareDefine.ActKey_State): | 
|         GameWorld.DebugLog("BossÀúÁ··Ç»î¶¯ÖÐ: actNum=%s" % actNum, playerID) | 
|         return | 
|      | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID) | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ActBossTrial", cfgID) | 
|     if not ipyData: | 
|         return | 
|     submitItemAwardInfo = ipyData.GetSubmitItemAwardInfo() | 
|     if submitCount not in submitItemAwardInfo: | 
|         GameWorld.DebugLog("BossÀúÁ·Ã»Óиý±Àø: actNum=%s,submitCount=%s not in %s" % (actNum, submitCount, submitItemAwardInfo.keys()), playerID) | 
|         return | 
|     recordIndex, awardItemList = submitItemAwardInfo[submitCount] | 
|      | 
|     nowSubmitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitCount % actNum) | 
|     if nowSubmitCount < submitCount: | 
|         GameWorld.DebugLog("BossÀúÁ·Ìύƾ֤¸öÊý²»×㣬ÎÞ·¨Áì½±: actNum=%s,nowSubmitCount=%s < %s" % (actNum, nowSubmitCount, submitCount), playerID) | 
|         return | 
|      | 
|     awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitAward % actNum) | 
|     if awardState & pow(2, recordIndex): | 
|         GameWorld.DebugLog("BossÀúÁ·Áì½±ÒÑÁìÈ¡¹ý: actNum=%s,submitCount=%s,recordIndex=%s,awardState=%s" % (actNum, submitCount, recordIndex, awardState), playerID) | 
|         return | 
|     updAwardState = awardState | pow(2, recordIndex) | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialSubmitAward % actNum, updAwardState) | 
|     GameWorld.DebugLog("BossÀúÁ·Áì½±: actNum=%s,submitCount=%s,recordIndex=%s,awardState=%s,updAwardState=%s"  | 
|                        % (actNum, submitCount, recordIndex, awardState, updAwardState), playerID) | 
|      | 
|     ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["BossTrial", False, {}]) | 
|     Sync_BossTrialPlayerInfo(curPlayer, actNum) | 
|     return | 
|   | 
| def GetBossTrialDropItemIDList(curPlayer, limitIndex): | 
|     bossIndexList = IpyGameDataPY.GetFuncEvalCfg("BossTrial", 2) | 
|     if limitIndex not in bossIndexList: | 
|         return | 
|      | 
|     dropCountTotal = 0 | 
|     itemID = IpyGameDataPY.GetFuncCfg("BossTrial", 1) | 
|     dropCountRateList = IpyGameDataPY.GetFuncEvalCfg("BossTrial", 3) | 
|      | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossTrial, {}).values(): | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) | 
|         if not actInfo.get(ShareDefine.ActKey_State): | 
|             GameWorld.DebugLog("BossÀúÁ··Ç»î¶¯ÖУ¬²»µôÂä! actNum=%s" % actNum) | 
|             continue | 
|         dropCount = GameWorld.GetResultByRandomList(dropCountRateList) | 
|         if not dropCount: | 
|             continue | 
|         dropCountTotal += dropCount | 
|          | 
|     return itemID, dropCountTotal | 
|   | 
| def Sync_BossTrialPlayerInfo(curPlayer, actNum): | 
|     ## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢ | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BossTrial, actNum) | 
|     if not actInfo.get(ShareDefine.ActKey_State): | 
|         return | 
|     clientPack = ChPyNetSendPack.tagMCActBossTrialPlayerInfo() | 
|     clientPack.ActNum = actNum | 
|     clientPack.SubmitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitCount % actNum) | 
|     clientPack.SubmitCountAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialSubmitAward % actNum) | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack) | 
|     return | 
|   | 
| def Sync_BossTrialActionInfo(curPlayer, actNum): | 
|     ## Í¨Öª»î¶¯ÐÅÏ¢ | 
|      | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BossTrial, actNum) | 
|     if not actInfo.get(ShareDefine.ActKey_State): | 
|         return | 
|      | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID) | 
|     dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ActBossTrial", cfgID) | 
|     if not ipyData: | 
|         return | 
|     templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) | 
|     if not templateID: | 
|         return | 
|     tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) | 
|     if not tempIpyDataList: | 
|         return | 
|      | 
|     startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) | 
|     startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr) | 
|     actInfo = ChPyNetSendPack.tagMCActBossTrialInfo() | 
|     actInfo.ActNum = actNum | 
|     actInfo.StartDate = startDateSync | 
|     actInfo.EndtDate = endDateStr | 
|     actInfo.IsDayReset = ipyData.GetIsDayReset() | 
|     actInfo.ResetType = ipyData.GetResetType() | 
|     actInfo.LimitLV = ipyData.GetLVLimit() | 
|      | 
|     actInfo.SubmitInfoList = [] | 
|     submitItemAwardInfo = ipyData.GetSubmitItemAwardInfo() | 
|     submitCountList = submitItemAwardInfo.keys() | 
|     submitCountList.sort() | 
|     for submitCount in submitCountList: | 
|         recordIndex, awardItemList = submitItemAwardInfo[submitCount] | 
|         subInfo = ChPyNetSendPack.tagMCActBossTrialSubmitInfo() | 
|         subInfo.Clear() | 
|         subInfo.RecordIndex = recordIndex | 
|         subInfo.NeedCount = submitCount | 
|         subInfo.AwardItemList = [] | 
|         for itemID, itemCount, isAuctionItem in awardItemList: | 
|             item = ChPyNetSendPack.tagMCActBossTrialItem() | 
|             item.Clear() | 
|             item.ItemID = itemID | 
|             item.ItemCount = itemCount | 
|             item.IsBind = isAuctionItem | 
|             subInfo.AwardItemList.append(item) | 
|         subInfo.Count = len(subInfo.AwardItemList) | 
|         actInfo.SubmitInfoList.append(subInfo) | 
|     actInfo.SubmitCount = len(actInfo.SubmitInfoList) | 
|      | 
|     actInfo.BillboardInfoList = [] | 
|     for tempIpyData in tempIpyDataList: | 
|         rankInfo = ChPyNetSendPack.tagMCActBossTrialBillard() | 
|         rankInfo.Rank = tempIpyData.GetRank() | 
|         rankInfo.AwardItemList = [] | 
|                  | 
|         awardItemList = tempIpyData.GetAwardItemList() | 
|         for itemID, itemCount, isAuctionItem in awardItemList: | 
|             item = ChPyNetSendPack.tagMCActBossTrialItem() | 
|             item.Clear() | 
|             item.ItemID = itemID | 
|             item.ItemCount = itemCount | 
|             item.IsBind = isAuctionItem | 
|             rankInfo.AwardItemList.append(item) | 
|         rankInfo.Count = len(rankInfo.AwardItemList) | 
|         actInfo.BillboardInfoList.append(rankInfo) | 
|     actInfo.BillardCount = len(actInfo.BillboardInfoList) | 
|      | 
|     NetPackCommon.SendFakePack(curPlayer, actInfo) | 
|     return |