#!/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, autoSort=True) 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, autoSort=True) 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