| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_KillDevil  | 
| #  | 
| # @todo:ÌÖ·¥Ñýħ  | 
| # @author hxp  | 
| # @date 2020-01-07  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÌÖ·¥Ñýħ£¬×é¶Ó/µ¥ÈË  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2020-01-07 19:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import NPCCommon  | 
| import PyGameData  | 
| import PlayerAssist  | 
| import IpyGameDataPY  | 
| import ItemControler  | 
| import GameWorldProcess  | 
| import PlayerFairyDomain  | 
| import NPCCustomRefresh  | 
| import IPY_GameWorld  | 
| import ItemCommon  | 
| import GameWorld  | 
| import ChConfig  | 
|   | 
| (  | 
| Def_PrepareTime, # ×¼±¸Ê±¼ä, Ãë  | 
| Def_FightTime, # ¸±±¾Ê±¼ä, Ãë  | 
| Def_ExitTime, # Í˳öʱ¼ä, Ãë  | 
| ) = range(3)  | 
|   | 
| # ¸±±¾×´Ì¬  | 
| (  | 
| FB_Step_Open, #¿ªÆô  | 
| FB_Step_Prepare, #×¼±¸ÖÐ  | 
| FB_Step_Fight, # Õ½¶·ÖÐ  | 
| FB_Step_Over, # ½áÊøµÈ´ý  | 
| FB_Step_Close, # ¹Ø±ÕÖÐ  | 
| ) = range(5)  | 
|   | 
| FBDict_FBBossID = "FBBossID" # ¸±±¾bossID  | 
| FBDict_KillNPCCount = "KillNPCCount_%s" # ÒÑ»÷ɱNPCÊý£¬²ÎÊýnpcID  | 
|   | 
| ## ¿ªÆô¸±±¾  | 
| def OnOpenFB(tick):  | 
|     return  | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     teamID = curPlayer.GetTeamID()  | 
|     if teamID:  | 
|         if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader:  | 
|             return True  | 
|           | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'MapID':mapID, 'LineID':lineID})  | 
|     if not ipyData:  | 
|         return  | 
|     fdeventID = ipyData.GetID()  | 
|     if not PlayerFairyDomain.SetFairyDomainEventState(curPlayer, fdeventID, PlayerFairyDomain.FDEventState_Visiting):  | 
|         GameWorld.DebugLog("ÉèÖÃʼþѰ·ÃÖÐʧ°Ü£¬¿ÉÄÜûÓиÃʼþ! fdeventID=%s" % fdeventID)  | 
|         return  | 
|       | 
|     return True  | 
|   | 
| ## ¸±±¾Íæ¼Ò½øÈëµã  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineID, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
| ## ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
| ## Íæ¼Ò½øÈ븱±¾  | 
| def DoEnterFB(curPlayer, tick):  | 
|     mapID = GameWorld.GetGameWorld().GetMapID()  | 
|     mapID = FBCommon.GetRecordMapID(mapID)  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     lineTimeCfg = FBCommon.GetFBLineStepTime(mapID)  | 
|           | 
|     fbStep = gameFB.GetFBStep()  | 
|     if fbStep == FB_Step_Open:  | 
|         FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
|         bossID = FBCommon.GetFBLineRefreshNPC(mapID)[1]  | 
|         gameFB.SetGameFBDict(FBDict_FBBossID, bossID)  | 
|           | 
|     if fbStep <= FB_Step_Prepare:  | 
|         PyGameData.g_fbPickUpItemDict.pop(curPlayer.GetPlayerID(), 0)  | 
|         notify_tick = lineTimeCfg[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttAddUpTime, 0, max(notify_tick, 0), True)  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)  | 
|           | 
|     elif fbStep == FB_Step_Fight:  | 
|         notify_tick = lineTimeCfg[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)  | 
|           | 
|     DoFBHelp(curPlayer, tick)  | 
|     return  | 
|   | 
| ## ¸±±¾°ïÖúÐÅÏ¢  | 
| def DoFBHelp(curPlayer, tick):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     npcID = gameFB.GetGameFBDictByKey(FBDict_FBBossID)  | 
|     killCount = gameFB.GetGameFBDictByKey(FBDict_KillNPCCount % npcID)  | 
|     #fbHelpDict = {FBCommon.Help_npcTotal:killCount}  | 
|     fbHelpDict = {FBCommon.Help_npc:FBCommon.GetJsonNPCKillList({npcID:killCount})}  | 
|     FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)  | 
|     GameWorld.DebugLog("DoFBHelp %s" % str(fbHelpDict), playerID)  | 
|     return  | 
|   | 
| ## Íæ¼ÒÍ˳ö¸±±¾.  | 
| def DoExitFB(curPlayer, tick):  | 
|     return  | 
|   | 
| ## Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|     return  | 
|   | 
| ## ¹Ø±Õ¸±±¾  | 
| def OnCloseFB(tick):  | 
|     return  | 
|   | 
| ## Íæ¼Ò¸±±¾¸´»î  | 
| def DoFBOnReborn(curPlayer, rebornType, tick):  | 
|     return  | 
|   | 
| ## ¸±±¾¶¨Ê±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|   | 
|     # ¸±±¾×¼±¸  | 
|     if fbStep == FB_Step_Prepare:  | 
|         __DoLogic_FB_Prepare(tick)  | 
|     elif fbStep == FB_Step_Fight:  | 
|         __ProcessFight(tick)  | 
|     elif fbStep == FB_Step_Over:  | 
|         __ProcessCloseFB(tick)  | 
|           | 
|     return  | 
|   | 
| ## ¸±±¾×¼±¸  | 
| def __DoLogic_FB_Prepare(tick):  | 
|     #gameFB = GameWorld.GetGameFB()  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     fbCfg = FBCommon.GetFBLineStepTime(mapID)  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_PrepareTime] * 1000:  | 
|         return  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     refreshMark, bossID = FBCommon.GetFBLineRefreshNPC(mapID)  | 
|     gameFB.SetGameFBDict(FBDict_FBBossID, bossID)  | 
|       | 
|     NPCCustomRefresh.SetNPCRefresh(refreshMark, [bossID])  | 
|     NPCCustomRefresh.ProcessAllNPCRefresh(tick) # Á¢¼´³ö·¢Ò»´Î±êʶµãˢР | 
|       | 
|     FBCommon.SetFBStep(FB_Step_Fight, tick)  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, fbCfg[Def_FightTime] * 1000)  | 
|     return  | 
|   | 
| ## ¸±±¾Õ½¶·  | 
| def __ProcessFight(tick):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     fbCfg = FBCommon.GetFBLineStepTime(mapID)  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_FightTime] * 1000:  | 
|         return  | 
|       | 
|     __DoKillDevilOver(tick)  | 
|     return  | 
|       | 
| ## ¸±±¾¹Ø±Õ  | 
| def __ProcessCloseFB(tick):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     fbCfg = FBCommon.GetFBLineStepTime(mapID)  | 
|     closeTime = ChConfig.Def_FBPickupItemTime + fbCfg[Def_ExitTime] * 1000  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < closeTime:  | 
|         return  | 
|       | 
|     GameWorldProcess.CloseFB(tick)  | 
|     FBCommon.SetFBStep(FB_Step_Close, tick)  | 
|     return  | 
|   | 
| ## Íæ¼ÒɱËÀNPC  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     npcID = curNPC.GetNPCID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbBossID = gameFB.GetGameFBDictByKey(FBDict_FBBossID)  | 
|     if npcID != fbBossID:  | 
|         return  | 
|     gameFB.SetGameFBDict(FBDict_KillNPCCount % npcID, gameFB.GetGameFBDictByKey(FBDict_KillNPCCount % npcID) + 1)  | 
|     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)  | 
|       | 
|     __DoKillDevilOver(tick, curNPC)  | 
|     return  | 
|   | 
| def __DoKillDevilOver(tick, curNPC=None):  | 
|     # Õ½¶·³¬Ê±  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() == FB_Step_Over:  | 
|         return  | 
|     FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|       | 
|     isPass = curNPC != None  | 
|     lineID = 0  | 
|     mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())  | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'MapID':mapID, 'LineID':lineID})  | 
|     fdeventID = ipyData.GetID()  | 
|     GameWorld.DebugLog("¸±±¾½áËã: isPass=%s" % (isPass))  | 
|       | 
|     noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict = PlayerAssist.OnFBAssistOver(isPass, mapID)  | 
|     exitTime = FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000  | 
|     rewardInfo = FBCommon.GetFBLineReward(mapID, 0)  | 
|     assistItemList = [] if not rewardInfo else rewardInfo  | 
|       | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     playerCount = playerManager.GetPlayerCount()  | 
|     for index in xrange(playerCount):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|           | 
|         playerID = curPlayer.GetPlayerID()  | 
|         overDict = {}  | 
|         if isPass and noAssistPlayerID:  | 
|             if playerID == noAssistPlayerID:  | 
|                 bossID = curNPC.GetNPCID()  | 
|                 dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY()  | 
|                 isOnlySelfSee = False  | 
|                 isDropDisperse = True  | 
|                 dropItemMapInfo = [dropPosX, dropPosY, isOnlySelfSee, isDropDisperse]  | 
|                 jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, {bossID:1}, dropItemMapInfo=dropItemMapInfo)  | 
|                 if not jsonItemList:  | 
|                     # Ã»ÓеôÂäʱֱ½Ó֪ͨ½áË㣬·ÀÖ¹¿¨¸±±¾  | 
|                     curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, exitTime, True)  | 
|                     FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)  | 
|                 else:  | 
|                     PlayerFairyDomain.SetFairyDomainEventState(curPlayer, fdeventID, PlayerFairyDomain.FDEventState_Visited)  | 
|                     curPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True)  | 
|                 continue  | 
|                       | 
|             elif playerID in assistPlayerMoneyDict:  | 
|                 addAssistMoney = assistPlayerMoneyDict[playerID]  | 
|                 overDict.update({FBCommon.Over_isAssist:1, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(assistItemList),  | 
|                                  FBCommon.Over_money:FBCommon.GetJsonMoneyList({assistMoneyType:addAssistMoney})})  | 
|                 ItemControler.GivePlayerItemOrMail(curPlayer, assistItemList)  | 
|               | 
|             else:  | 
|                 pass  | 
|               | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, exitTime, True)  | 
|         FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)  | 
|           | 
|     return  | 
|   | 
| 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 = 0  | 
|     mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())  | 
|     leaveTick = FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000  | 
|     jsonItemList = PyGameData.g_fbPickUpItemDict.get(playerID, [])  | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)  | 
|     overDict = {FBCommon.Over_itemInfo:jsonItemList}  | 
|     FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)  | 
|     return  | 
|   | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     return GameWorld.GetGameFB().GetFBStep() == FB_Step_Fight  | 
|   | 
|   | 
|   |