#!/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)  
 | 
    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])  
 | 
          
 | 
    Sync_BossFirstKillState(curPlayer, [bossID])  
 | 
    return  
 | 
  
 | 
def Sync_BossFirstKillState(curPlayer, syncBossIDList=[], isForce=False):  
 | 
    if not 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  
 | 
  
 | 
      
 |