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