#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_SealDemon # # @todo:·âħ̳ # @author xdh # @date 2017-11-09 # @version 1.0 # # ÏêϸÃèÊö: ·âħ̳ # #------------------------------------------------------------------------------- #"""Version = 2017-11-09 14:30""" #------------------------------------------------------------------------------- import FBCommon import GameWorld import IPY_GameWorld import IpyGameDataPY import ChConfig import PyGameData import PlayerControl import NPCCommon import ItemCommon import ShareDefine import PlayerSuccess import PlayerActivity import GameObj import PlayerBossReborn import PlayerFairyCeremony import PlayerNewFairyCeremony import PlayerFeastTravel import PlayerWeekParty import PlayerActLogin import PlayerActTask import EventReport import PlayerTeam import NPCHurtManager import GameWorldProcess import PetControl import AttackCommon import PlayerGubao #µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_Step_Open, # ¸±±¾¿ªÆô FB_Step_Fighting, # ¸±±¾½øÐÐÖÐ FB_Step_Over, # ¸±±¾½áÊø FB_Step_Close, # ¹Ø±Õ״̬ ) = range(4) FBPlayerDict_EncourageLV = 'FBPlayerDict_EncourageLV' # ¹ÄÎèµÈ¼¶ FBPlayerDict_Rank = "FBPlayerDict_Rank" # Íæ¼ÒÅÅÃû g_npcHurtDict = {} ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë def OnEnterFBEvent(curPlayer, mapID, lineID, tick): return True ## ¸±±¾Íæ¼Ò½øÈëµã def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return ipyEnterPosInfo ## ²éѯµØÍ¼ÊÇ·ñ¿ªÆô #def OnCanOpen(tick): # return True ## ²éѯÊÇ·ñ¿ÉÒÔ½øÈëµØÍ¼ def OnChangeMapAsk(ask, tick): return IPY_GameWorld.cmeAccept ## ¿ªÆô¸±±¾ def OnOpenFB(tick): FBCommon.SetFBStep(FB_Step_Fighting, tick) return ## ½ø¸±±¾ def DoEnterFB(curPlayer, tick): playerID = curPlayer.GetPlayerID() lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() GameWorld.DebugLog("DoEnterFB...playerCnt=%s,lineID=%s" % (playerCnt, lineID), playerID) gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_Step_Fighting: PlayerControl.PlayerLeaveFB(curPlayer) return hadDelTicket = FBCommon.GetHadDelTicket(curPlayer) if not hadDelTicket: FBCommon.SetHadDelTicket(curPlayer) PyGameData.g_fbPickUpItemDict.pop(playerID, 0) if playerCnt == 1: posX, posY = IpyGameDataPY.GetFuncEvalCfg('SealDemonFirstPos') GameWorld.ResetPlayerPos(curPlayer, posX, posY) EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SealDemon, 0, ChConfig.CME_Log_Start) # ÉϹÄÎèbuff encourageLV = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EncourageLV) if encourageLV > 0: FBCommon.AddFbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, tick) else: FBCommon.SendFBEncourageInfo(curPlayer, encourageLV) return ## ¹Ø±Õ¸±±¾ def OnCloseFB(tick): #GameWorld.GetGameWorld().SetPropertyID(0) return ## Íæ¼ÒÍ˳ö¸±±¾ def DoExitFB(curPlayer, tick): # Çå³ý¹ÄÎèbuff FBCommon.ClearEncourageBuff(curPlayer, tick) return ## Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoPlayerLeaveFB(curPlayer, tick): FBCommon.SetHadDelTicket(curPlayer, 0) #×îºóÒ»ÈË if GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() == 1: GameWorldProcess.CloseFB(tick) return ## Íæ¼ÒÇл»µØÍ¼ def DoPlayerChangeMapLogic(curPlayer): FBCommon.SetHadDelTicket(curPlayer, 0) return ## ÊÇ·ñ¸±±¾¸´»î def OnPlayerReborn(): return True ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢ def DoFBHelp(curPlayer, tick): return ## ¸±±¾ÐÐΪ def DoFBAction(curPlayer, actionType, actionInfo, tick): if actionType == 0: FBCommon.FbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, actionInfo, tick) return ## ¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ def OnProcess(tick): fbStep = GameWorld.GetGameFB().GetFBStep() # ¸±±¾½áÊø if fbStep == FB_Step_Over: __DoLogic_FB_Over(tick) return def __DoLogic_FB_Over(tick): # ¼ä¸ôδµ½ if tick - GameWorld.GetGameFB().GetFBStepTick() < ChConfig.Def_FBPickupItemTime: return #¸±±¾¹Ø±Õ GameWorldProcess.CloseFB(tick) FBCommon.SetFBStep(FB_Step_Close, tick) return ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼­ÓÉÍâ²ã¾ö¶¨ # @param attacker ¹¥»÷·½ # @param defender ·ÀÊØ·½ # @return bool def CheckCanAttackTagObjInFB(attacker, defender): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_Step_Fighting: return False lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if defender.GetGameObjType() == IPY_GameWorld.gotNPC and defender.GetNPCID() == CurFBLineBOSSID(lineID): atkObjType = attacker.GetGameObjType() if atkObjType == IPY_GameWorld.gotPlayer: return NPCHurtManager.CheckPlayerCanAttackFBNPC(attacker, defender, ChConfig.Def_FBMapID_SealDemon, True) elif atkObjType == IPY_GameWorld.gotNPC: if PetControl.IsPet(attacker) or attacker.GetGameNPCObjType()== IPY_GameWorld.gnotSummon: ownerPlayer = AttackCommon.GetAttackPlayer(attacker)[0] if not ownerPlayer: return False return NPCHurtManager.CheckPlayerCanAttackFBNPC(ownerPlayer, defender, ChConfig.Def_FBMapID_SealDemon) return True def DoFB_Npc_KillNPC(attacker, curNPC, tick): __FBNPCOnKilled(curNPC, tick) return def DoFB_Player_KillNPC(curPlayer, curNPC, tick): __FBNPCOnKilled(curNPC, tick) return ## Ö´Ðи±±¾É±¹ÖÂß¼­ def __FBNPCOnKilled(curNPC, tick): lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 bossID = CurFBLineBOSSID(lineID) if curNPC.GetNPCID() != bossID: return FBCommon.SetFBStep(FB_Step_Over, tick) dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY() GameWorld.DebugLog('½áÊøÉèÖÃBOSSËÀÍö lineID=%s' % lineID) NPCCommon.GameServe_GameWorldBossState(bossID, 0) npcHurtList = NPCHurtManager.GetPlayerHurtList(curNPC) if not npcHurtList: GameWorld.ErrLog("ûÓÐÉËѪÁбí!lineID=%s,bossID=%s" % (lineID, bossID)) return isPass = 1 gameFB = GameWorld.GetGameFB() mapID = GameWorld.GetMap().GetMapID() leaveTick = FBCommon.GetFBLineStepTime(mapID, lineID) * 1000 copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(npcHurtList.GetHurtCount()): hurtObj = npcHurtList.GetHurtAt(index) hurtID = hurtObj.GetValueID() hurtType = hurtObj.GetValueType() playerIDList = [] if hurtType == ChConfig.Def_NPCHurtTypePlayer: playerIDList = [hurtID] elif hurtType == ChConfig.Def_NPCHurtTypeTeam: teamID = hurtID mapTeamPlayerIDList = PlayerTeam.GetMapTeamPlayerIDList(teamID) for teamPlayerID in mapTeamPlayerIDList: if not npcHurtList.IsNoAssistPlayer(teamPlayerID): continue playerIDList.append(teamPlayerID) else: continue rank = index + 1 if rank == 1: NPCCommon.GameServer_KillGameWorldBoss(bossID, hurtObj.GetHurtName(), hurtObj.GetHurtValue()) for playerID in playerIDList: curPlayer = copyMapPlayerManager.FindPlayerByID(playerID) if curPlayer == None: continue gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank) if not dropPosX or not dropPosY: dropPosX, dropPosY = curPlayer.GetPosX(), curPlayer.GetPosY() prizeItemList = GiveSealDemonAward(curPlayer, lineID, rank, dropItemMapInfo=[dropPosX, dropPosY, True]) if not prizeItemList: # ûÓеôÂäʱֱ½Ó֪ͨ½áË㣬·ÀÖ¹¿¨¸±±¾ curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) overDict = {FBCommon.Over_rank:rank, FBCommon.Over_itemInfo:prizeItemList} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_SealDemon, lineID, isPass, overDict) else: curPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True) return def GiveSealDemonAward(curPlayer, lineID, rank, isMail=False, isClientSend=False, dropItemMapInfo=[]): newbielineList = IpyGameDataPY.GetFuncEvalCfg('SealDemonNewbieLine') isNewbieLine = lineID in newbielineList sealDemonIpyData = GetSealDemonIpyData(lineID) if not sealDemonIpyData: return {} prizeMultiple = 1 addCnt = 1 if isNewbieLine: newbieLineStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [ChConfig.Def_FBMapID_SealDemon]) # ÐÂÊÖ±¾¸ÄΪ¿ÉÖØ¸´½øÈë # hasEnter = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [ChConfig.Def_FBMapID_SealDemon]) # if hasEnter: # #ÒѸø¹ý # return {} elif isClientSend: return {} else: #prizeMultiple = 2 if rank == 1 else 1 # µÚÒ»ÃûÖ´ÐÐË«±¶µôÂä½±Àø£¬ÆäËûÒ»´Î prizeMultiple = 1 # È¥³ýµÚÒ»ÃûË«±¶Âß¼­£¬¸ÄΪ·ÅÔÚ¶îÍâ½±Àø²ú³ö equipList = [] prizeItemDict = {} bossID = CurFBLineBOSSID(lineID) extraItemList = sealDemonIpyData.GetOwnerAwardItemEx() * addCnt if rank == 1 else [] jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, ChConfig.Def_FBMapID_SealDemon, {bossID:addCnt}, mailTypeKey="SealDemonMail", isMail=isMail, extraItemList=extraItemList, prizeMultiple=prizeMultiple, dropItemMapInfo=dropItemMapInfo, isVirtualDrop=isClientSend) for jsonItem in jsonItemList: if 'UserData' in jsonItem: equipList.append(jsonItem) else: itemID, itemCnt = jsonItem['ItemID'], jsonItem.get('Count', 1) prizeItemDict[itemID] = prizeItemDict.get(itemID, 0) + itemCnt GameWorld.DebugLog("·âħ̳½áËã½±Àø: lineID=%s,bossID=%s,rank=%s,totalExp=%s,totalMoney=%s,jsonItemList=%s" % (lineID, bossID, rank, totalExp, totalMoney, jsonItemList), curPlayer.GetPlayerID()) prizeItemList = equipList + FBCommon.GetJsonItemList(prizeItemDict.items()) if rank == 1: PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FMTFirst, addCnt) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_SealDemon, addCnt) PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_KillSealDemonBoss, addCnt) #»÷É±ÌØ¶¨NPC³É¾Í PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID]) #ÐÂÊÖÏß·µÄ¸üнøÈ¥¼Ç¼ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, 1, False, [ChConfig.Def_FBMapID_SealDemon]) if isNewbieLine: # δ¹ý¹Ø²»¿Û´ÎÊý if newbieLineStar: FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_SealDemon, addCnt) else: FBCommon.Sync_FBPlayerFBInfoData(curPlayer, ChConfig.Def_FBMapID_SealDemon) # ͬ²½ÐÅÏ¢ else: FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_SealDemon, addCnt) # ÿÈջ PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SealDemon, addCnt) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_FMT, addCnt) PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FMT, addCnt) PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FMT, addCnt) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FMT, addCnt) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FMT, addCnt) PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_FMT, addCnt) PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_FMT, addCnt) return prizeItemList def OnPickUpItem(curPlayer, curItem, tick): mapItemType = curItem.GetType() if mapItemType == ChConfig.Def_ItemType_Money: return playerID = curPlayer.GetID() isEquip = ItemCommon.CheckItemIsEquip(curItem) jsonItem = ItemCommon.GetJsonItem(curItem) if playerID in PyGameData.g_fbPickUpItemDict: if isEquip: PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: isIn = False for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]: if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsBind") == jsonItem.get("IsBind"): itemInfo["Count"] = itemInfo.get("Count", 1) + jsonItem.get("Count", 1) isIn = True break if not isIn: PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem] playerItemCount = 0 mapItemManager = GameWorld.GetMapItemManager() for index in xrange(mapItemManager.GetMapItemCount()): mapItem = mapItemManager.GetMapItemByIndex(index) if not mapItem or mapItem.IsEmpty(): continue # »¹ÓÐÊôÓÚ×Ô¼ºµÄ¶«Î÷û¼ñ²»Í¨Öª½áÊø if mapItem.GetOwnerID() == curPlayer.GetPlayerID(): playerItemCount += 1 isItemAllPickUp = (playerItemCount <= 1) if not isItemAllPickUp: return isPass = 1 lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 leaveTick = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SealDemon, lineID) * 1000 gameFB = GameWorld.GetGameFB() rank = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_Rank) jsonItemList = PyGameData.g_fbPickUpItemDict.get(playerID, []) curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) overDict = {FBCommon.Over_rank:rank, FBCommon.Over_itemInfo:jsonItemList} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_SealDemon, lineID, isPass, overDict) return def OnClientEndFB(curPlayer, mapID, lineID, dataList): #¿Í»§¶Ë¸±±¾·¢ËͽáÊø GameWorld.DebugLog('·âħ̳ ¿Í»§¶Ë¸±±¾·¢ËͽáÊømapID=%s,lineID=%s,dataList=%s' % (mapID, lineID, dataList), curPlayer.GetPlayerID()) rank, hurt = dataList[:2] prizeItemList = GiveSealDemonAward(curPlayer, lineID, rank, False, True, [curPlayer.GetPosX(), curPlayer.GetPosY(), True]) if rank == 1 and prizeItemList: bossID = CurFBLineBOSSID(lineID) NPCCommon.GameServer_KillGameWorldBoss(bossID, curPlayer.GetName(), hurt, False) #GameWorld.Log("֪ͨǰ¶Ë½áËã!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID()) overDict = {FBCommon.Over_rank:rank, FBCommon.Over_itemInfo:prizeItemList} FBCommon.NotifyFBOver(curPlayer, mapID, lineID, 1, overDict) PlayerControl.SetCustomMap(curPlayer, 0, 0) return def GetBossRemainHPPer(copyMapID, funcLineID, tick): bossID = CurFBLineBOSSID(funcLineID) curBoss = GameWorld.FindNPCByNPCIDEx(copyMapID, bossID) if not curBoss: return 100 return GameObj.GetHP(curBoss) * 100 / GameObj.GetMaxHP(curBoss) def CurFBLineBOSSID(lineID= -1): #¸Ã·ÖÏßË¢µÄBOSSID if lineID == -1: lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if lineID == -1: return 0 ipyData = IpyGameDataPY.GetIpyGameDataByCondition('SealDemon', {'LineID':lineID}) if not ipyData: return 0 bossID = ipyData.GetNPCID() return bossID def GetSealDemonIpyData(lineID= -1): #¸Ã·ÖÏßË¢µÄBOSSID if lineID == -1: lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if lineID == -1: return return IpyGameDataPY.GetIpyGameDataByCondition('SealDemon', {'LineID':lineID}) ##Íæ¼ÒËÀÍö. # @param curPlayer:ËÀÍöµÄÍæ¼Ò # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoPlayerDead(curPlayer): return #// B1 03 ÉèÖ÷âħ̳¶à±¶»÷ɱ #tagCMSetFMTDouble # #struct tagCMSetFMTDouble #{ # tagHead Head; # BYTE IsDouble; //ÊÇ·ñË«±¶ #}; def SetFMTDouble(playerIndex, clientData, tick): return