#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.RemoteQuery.GY_Query_BossFirstKill
|
#
|
# @todo:BossÊ×ɱ
|
# @author hxp
|
# @date 2019-09-20
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: BossÊ×ɱ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2019-09-20 14:00"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import GameWorld
|
import PlayerControl
|
import IpyGameDataPY
|
import IPY_GameWorld
|
import ItemControler
|
import ChPyNetSendPack
|
import NetPackCommon
|
import ShareDefine
|
import ItemCommon
|
|
# bossÊ×ɱ״̬붨Òå
|
(
|
BossFKState_IsKill, # ÊÇ·ñÒѾ»÷ɱ¹ý¸Ãboss
|
BossFKState_PubAward, # ÊÇ·ñÁìÈ¡¹ýÈ«·þÊ×ɱ½±Àø
|
BossFKState_PriAward, # ÊÇ·ñÁìÈ¡¹ý¸öÈËÊ×ɱ½±Àø
|
) = range(3)
|
|
def OnPlayerLogin(curPlayer):
|
maxBossFKDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1)
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
if openServerDay > maxBossFKDay:
|
return
|
|
Sync_BossFirstKillState(curPlayer)
|
return
|
|
def SetPlayerFirstKillBoss(curPlayer, bossID):
|
fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
|
if GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
|
GameWorld.DebugLog("ÒѾ»÷ɱ¹ý¸Ãboss£¡")
|
return
|
updFKState = GameWorld.ChangeDataByDigitPlace(fkState, BossFKState_IsKill, 1)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
|
GameWorld.DebugLog("ÉèÖÃÊ×ɱ¹ý¸Ãboss: bossID=%s,fkState=%s,updFKState=%s" % (bossID, fkState, updFKState))
|
Sync_BossFirstKillState(curPlayer, [bossID])
|
return
|
|
#------------------------------------------------------------------------------
|
## ¿ç·þÈü±¨Ãûµ÷ÓýӿÚ
|
# @param query_Type ÇëÇóÀàÐÍ
|
# @param query_ID ÇëÇóµÄÍæ¼ÒID
|
# @param packCMDList ·¢°üÃüÁî
|
# @param tick µ±Ç°Ê±¼ä
|
# @return "True" or "False" or ""
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoLogic(query_Type, query_ID, packCMDList, tick):
|
return
|
|
|
#------------------------------------------------------------------------------
|
## Ö´Ðнá¹û
|
# @param curPlayer ·¢³öÇëÇóµÄÍæ¼Ò
|
# @param callFunName ¹¦ÄÜÃû³Æ
|
# @param funResult ²éѯµÄ½á¹û
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoResult(curPlayer, callFunName, funResult, tick):
|
bossID, awardType = eval(funResult)
|
GameWorld.DebugLog("GY_Query_BossFirstKill bossID=%s, awardType=%s" % (bossID, awardType), curPlayer.GetPlayerID())
|
if not curPlayer:
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
|
if not ipyData:
|
return
|
|
if awardType == 0:
|
__DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData)
|
elif awardType == 1:
|
__DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData)
|
|
return
|
|
def __DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData):
|
## Ê×ɱȫ·þ¹«¹²½±Àø
|
|
bitIndex = BossFKState_PubAward
|
fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
|
if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
|
GameWorld.DebugLog("ÒѾÁìÈ¡¹ý¸ÃÊ×ɱȫ·þ½±Àø£¡fkState=%s,bitIndex=%s" % (fkState, bitIndex))
|
return
|
updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
|
GameWorld.DebugLog("¸üÐÂBossÊ×ɱȫ·þ½±ÀøÁì½±¼Ç¼£¡fkState=%s,bitIndex=%s,updFKState=%s"
|
% (fkState, bitIndex, updFKState))
|
|
awardGoldPaper = ipyData.GetPerPlayerMoneyAward()
|
addDataDict = {"bossID":bossID}
|
PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, awardGoldPaper, ChConfig.Def_GiveMoney_BossFirstKill, addDataDict)
|
ItemControler.NotifyGiveAwardInfo(curPlayer, [], "BossFirstKill", moneyInfo={IPY_GameWorld.TYPE_Price_Gold_Paper:awardGoldPaper})
|
Sync_BossFirstKillState(curPlayer, [bossID])
|
return
|
|
def __DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData):
|
## ¸öÈËÊ×ɱ½±Àø
|
|
fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
|
if not GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
|
GameWorld.DebugLog("»¹Î´»÷ɱ¹ý¸Ãboss£¬ÎÞ·¨ÁìÈ¡¸öÈËÊ×ɱ½±Àø£¡fkState=%s,bitIndex=%s" % (fkState, BossFKState_IsKill))
|
return
|
|
awardItemList = ipyData.GetPersonFirstKillAward()
|
needSpace = len(awardItemList)
|
emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if emptySpace < needSpace:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580")
|
return
|
|
bitIndex = BossFKState_PriAward
|
if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
|
GameWorld.DebugLog("ÒѾÁìÈ¡¹ý¸Ã¸öÈËÊ×ɱ½±Àø£¡fkState=%s,bitIndex=%s" % (fkState, bitIndex))
|
return
|
updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
|
GameWorld.DebugLog("¸üÐÂBossÊ×ɱ¸öÈ˽±ÀøÁì½±¼Ç¼£¡fkState=%s,bitIndex=%s,updFKState=%s"
|
% (fkState, bitIndex, updFKState))
|
|
for itemID, itemCount, isAuctionItem in awardItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
|
ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, "BossFirstKill")
|
|
Sync_BossFirstKillState(curPlayer, [bossID])
|
return
|
|
def Sync_BossFirstKillState(curPlayer, syncBossIDList=None, isForce=False):
|
if syncBossIDList == None:
|
syncBossIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
|
ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
|
syncBossIDList.append(ipyData.GetNPCID())
|
|
firstKillStateList = []
|
for bossID in syncBossIDList:
|
fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
|
if not fkState and not isForce:
|
continue
|
fkStatePack = ChPyNetSendPack.tagMCBossFirstKillState()
|
fkStatePack.NPCID = bossID
|
fkStatePack.FKState = fkState
|
firstKillStateList.append(fkStatePack)
|
|
if not firstKillStateList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCBossFirstKillStateInfo()
|
clientPack.FirstKillStateList = firstKillStateList
|
clientPack.BossCount = len(clientPack.FirstKillStateList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def OnGMResetBossFirstKillState(curPlayer):
|
syncBossIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
|
ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
|
bossID = ipyData.GetNPCID()
|
fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
|
if not fkState:
|
continue
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, 0)
|
syncBossIDList.append(bossID)
|
Sync_BossFirstKillState(curPlayer, syncBossIDList, isForce=True)
|
return
|
|
|