#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerActHorsePetFeast
|
#
|
# @todo:Æï³èÊ¢Ñç
|
# @author hxp
|
# @date 2021-05-08
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Æï³èÊ¢Ñç
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2021-05-08 17:00"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import PlayerTJG
|
import ShareDefine
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PyGameData
|
import GameWorld
|
import NPCCommon
|
|
def OnLogin(curPlayer):
|
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_HorsePetFeast, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
if actInfo.get(ShareDefine.ActKey_CfgID):
|
SyncHorsePetFeastInfo(curPlayer, actNum)
|
|
return
|
|
def RefreshOperationAction_HorsePetFeast(actNum):
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_HorsePetFeast, actNum)
|
if not actInfo.get(ShareDefine.ActKey_CfgID):
|
return
|
|
playerManager = GameWorld.GetPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if not GameWorld.IsNormalPlayer(curPlayer):
|
continue
|
SyncHorsePetFeastInfo(curPlayer, actNum)
|
|
return
|
|
def SyncHorsePetFeastInfo(curPlayer, actNum):
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_HorsePetFeast, actNum)
|
#state = actInfo.get(ShareDefine.ActKey_State)
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
if not cfgID:
|
return
|
|
actIpyData = IpyGameDataPY.GetIpyGameData("ActHorsePetFeast", cfgID)
|
if not actIpyData:
|
return
|
|
startTimeList = actIpyData.GetStartTimeList()
|
endTimeList = actIpyData.GetEndTimeList()
|
if len(startTimeList) != len(endTimeList):
|
return
|
|
startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(actIpyData)
|
actInfo = ChPyNetSendPack.tagMCActHorsePetFeastInfo()
|
actInfo.Clear()
|
actInfo.StartDate = startDateStr
|
actInfo.EndtDate = endDateStr
|
actInfo.ActTimeList = []
|
for i, startTime in enumerate(startTimeList):
|
timeObj = ChPyNetSendPack.tagMCActHorsePetFeastTime()
|
timeObj.StartTime = startTime
|
timeObj.EndtTime = endTimeList[i]
|
actInfo.ActTimeList.append(timeObj)
|
actInfo.TimeCount = len(actInfo.ActTimeList)
|
actInfo.LimitLV = actIpyData.GetLVLimit()
|
NetPackCommon.SendFakePack(curPlayer, actInfo)
|
return
|
|
|
def DoActBossOnKilledLogic(npcRankHurtMgr):
|
## »î¶¯boss±»»÷ɱ
|
# @param rankHurtList: NPCHurtMgr.PlayerRankHurtList
|
|
npcID = npcRankHurtMgr.npcID
|
|
# Êܽ±Àø´ÎÊýÓ°ÏìµÄÎïÆ·µôÂä¸ÅÂÊ {NPCID:[[ÎïÆ·ID,¸öÊý, ÊÇ·ñÅÄÆ·, µôÂäÍò·ÖÂÊ], ...], ...}£¬¸ù¾Ý½±Àø´ÎÊýËæ»ú¶à´Î£¬×¢Òâ¸ÃÅäÖ÷DZýͼ£¬Ã¿ÖÖÎïÆ·¶¼»á¶ÀÁ¢ÅжÏ
|
dropByPlayerCountInfo = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 2, {})
|
if npcID not in dropByPlayerCountInfo:
|
return
|
# ²»Êܽ±Àø´ÎÊýÓ°ÏìµÄÎïÆ·µôÂä¸ÅÂÊ {NPCID:[[ÎïÆ·ID,¸öÊý, ÊÇ·ñÅÄÆ·, µôÂäÍò·ÖÂÊ], ...], ...}£¬½öËæ»úÒ»´Î£¬×¢Òâ¸ÃÅäÖ÷DZýͼ£¬Ã¿ÖÖÎïÆ·¶¼»á¶ÀÁ¢ÅжÏ
|
dropOneChanceInfo = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 3, {})
|
|
GameWorld.Log("Æï³èÊ¢Ñç»î¶¯boss±»»÷ɱ: npcID=%s" % (npcID))
|
|
curNPC = npcRankHurtMgr.curNPC
|
|
awardPlayerDict = {}
|
copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(npcRankHurtMgr.GetHurtCount()):
|
hurtObj = npcRankHurtMgr.GetHurtAt(index)
|
if hurtObj.GetValueType() != ChConfig.Def_NPCHurtTypePlayer:
|
continue
|
playerID = hurtObj.GetValueID()
|
hurtPlayer = copyPlayerManager.FindPlayerByID(playerID)
|
if not hurtPlayer or PlayerTJG.GetIsTJG(hurtPlayer):
|
continue
|
if curNPC and not hurtPlayer.CanSeeOther(curNPC):
|
GameWorld.Log(" ÉËÑªÍæ¼Ò²»ÔÚbossÊÓÒ°ÄÚ£¬ÎÞ·¨»ñµÃ½±Àø!playerPos(%s,%s), npcPos(%s,%s)"
|
% (hurtPlayer.GetPosX(), hurtPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY()))
|
continue
|
awardPlayerDict[playerID] = hurtPlayer
|
|
awardPlayerIDList = awardPlayerDict.keys()
|
GameWorld.Log(" ½±ÀøÍæ¼ÒÈËÊý=%s, awardPlayerIDList=%s" % (len(awardPlayerIDList), awardPlayerIDList))
|
if not awardPlayerDict:
|
return
|
awardRandCount = len(awardPlayerIDList)
|
|
awardRandCountMin, awardRandCountMax = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 1, [])
|
awardRandCount = max(awardRandCountMin, min(awardRandCountMax, awardRandCount))
|
GameWorld.Log(" ½±ÀøËæ»ú´ÎÊý: %s" % awardRandCount)
|
|
dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY()
|
awardByPlayerCountList = dropByPlayerCountInfo[npcID]
|
awardOneChanceList = dropOneChanceInfo.get(npcID, [])
|
for playerID, hurtPlayer in awardPlayerDict.items():
|
awardItemList = []
|
for itemID, itemCount, isAuctionItem, dropRate in awardByPlayerCountList:
|
dropCountTotal = 0
|
for _ in xrange(awardRandCount):
|
if dropRate < ShareDefine.Def_MaxRateValue and not GameWorld.CanHappen(dropRate):
|
continue
|
dropCountTotal += itemCount
|
if not dropCountTotal:
|
continue
|
awardItemList.append([itemID, dropCountTotal, isAuctionItem])
|
|
for itemID, itemCount, isAuctionItem, dropRate in awardOneChanceList:
|
if not GameWorld.CanHappen(dropRate):
|
continue
|
awardItemList.append([itemID, itemCount, isAuctionItem])
|
|
GameWorld.Log(" Íæ¼ÒµôÂä: %s" % awardItemList, playerID)
|
if not awardItemList:
|
continue
|
|
# Ö±½Ó¸øÎïÆ·²¢Õ¹Ê¾ÐéÄâµôÂä
|
NPCCommon.DoGiveItemByVirtualDrop(hurtPlayer, awardItemList, npcID, dropPosX, dropPosY)
|
|
return
|
|