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