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