|  |  | 
 |  |  | import ItemCommon
 | 
 |  |  | import ChPyNetSendPack
 | 
 |  |  | import ShareDefine
 | 
 |  |  | import EventShell
 | 
 |  |  | import NPCCustomRefresh
 | 
 |  |  | import PlayerSuccess
 | 
 |  |  | import PlayerActivity
 | 
 |  |  | import NetPackCommon
 | 
 |  |  | import ItemControler
 | 
 |  |  | import PlayerMagicWeapon
 | 
 |  |  | import PlayerBossReborn
 | 
 |  |  | import PlayerFairyCeremony
 | 
 |  |  | import PlayerWeekParty
 | 
 |  |  | import EventReport
 | 
 |  |  | 
 | 
 |  |  | FBDict_StartTick = 'FBDict_StartTick%s' #开始时间
 | 
 |  |  | 
 |  |  | FBDict_IsReduceing = 'FBDict_IsReduceing%s' #是否掉血中
 | 
 |  |  | FBPlayerDict_Rank = "FBPlayerDict_Rank" # 玩家排名
 | 
 |  |  | FBDict_BossTotalHP = 'FBDict_BossTotalHP%s' #BOSS血量
 | 
 |  |  | FBDict_LastHurtTick = 'FBDict_LastHurtTick'  #上次伤害时间
 | 
 |  |  | 
 | 
 |  |  | g_npcHurtDict = {}
 | 
 |  |  | g_heroHurtDict = {} #{playerID:hurt}
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | def OnFBPlayerOnLogin(curPlayer):
 | 
 |  |  | 
 |  |  |     if curPlayer.GetOfficialRank() < ipyData.GetRealmLV():
 | 
 |  |  |         return
 | 
 |  |  |     #诛仙总评分
 | 
 |  |  |      | 
 |  |  |     if ItemCommon.GetZhuXianEquipTotalGS(curPlayer) < ipyData.GetZhuXianScore():
 | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
 | 
 |  |  |     if enterCnt >= FBCommon.GetEnterFBMaxCnt:
 | 
 |  |  |     if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
 | 
 |  |  |         if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt):
 | 
 |  |  |             return
 | 
 |  |  |         if not curPlayer.GetFamilyID():
 | 
 |  |  | 
 |  |  | #  @param tick
 | 
 |  |  | #  @return None
 | 
 |  |  | def DoEnterFB(curPlayer, tick):
 | 
 |  |  |     global g_heroHurtDict
 | 
 |  |  |     playerID = curPlayer.GetPlayerID()
 | 
 |  |  |     mapID = GameWorld.GetMap().GetMapID()
 | 
 |  |  |     | 
 |  |  | 
 | 
 |  |  |     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1    
 | 
 |  |  |     
 | 
 |  |  |     playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount()
 | 
 |  |  | 
 |  |  |     if not hadDelTicket:
 | 
 |  |  |         FBCommon.SetHadDelTicket(curPlayer)
 | 
 |  |  |         PyGameData.g_fbPickUpItemDict.pop(playerID, 0)
 | 
 |  |  |         g_heroHurtDict.pop(playerID, 0)
 | 
 |  |  | #        if playerCnt == 1:
 | 
 |  |  | #            posX, posY = IpyGameDataPY.GetFuncEvalCfg('ZhuXianBossFirstPos')
 | 
 |  |  | #            GameWorld.ResetPlayerPos(curPlayer, posX, posY)
 | 
 |  |  | 
 |  |  | # @param tick 时间戳
 | 
 |  |  | # @return 无意义
 | 
 |  |  | def DoExitFB(curPlayer, tick):
 | 
 |  |  |     global g_npcHurtDict
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     # 清除鼓舞buff
 | 
 |  |  |     FBCommon.ClearEncourageBuff(curPlayer, tick)
 | 
 |  |  | 
 |  |  |     if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:
 | 
 |  |  |         lineID = gameWorld.GetPropertyID() - 1
 | 
 |  |  |         PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = {}
 | 
 |  |  |         g_npcHurtDict[lineID] = {}
 | 
 |  |  |         gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0)
 | 
 |  |  |         GameWorld.GetGameFB().ClearGameFBDict()
 | 
 |  |  |         GameWorldProcess.CloseFB(tick)
 | 
 |  |  | 
 |  |  | #  @return None
 | 
 |  |  | def DoFBHelp(curPlayer, tick):
 | 
 |  |  |     #伤害排行信息
 | 
 |  |  |     if GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_IsOver):
 | 
 |  |  |         return
 | 
 |  |  |     hurtInfo = []
 | 
 |  |  |     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
 | 
 |  |  |     playerHurtList = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}).items()
 | 
 |  |  |     npcHurtList = g_npcHurtDict.get(lineID, {}).items()
 | 
 |  |  |      | 
 |  |  |     syncHurtList = (playerHurtList + npcHurtList)[:5]
 | 
 |  |  | 
 | 
 |  |  |     syncHurtList = playerHurtList[:5]
 | 
 |  |  |     syncHurtList.sort(key=lambda asd:asd[1][1], reverse=True)
 | 
 |  |  |         
 | 
 |  |  |     for i, info in enumerate(syncHurtList, 1):
 | 
 |  |  | 
 |  |  |         hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
 | 
 |  |  |         hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
 | 
 |  |  |         hurtInfo.append(hurtDict)
 | 
 |  |  |     myRank = __GetSelfHurtRank(curPlayer)
 | 
 |  |  |     if myRank and myRank > 5:
 | 
 |  |  |         hurtDict = {}
 | 
 |  |  |         hurtDict["rank"] = myRank
 | 
 |  |  |         info = playerHurtList[myRank - 1]
 | 
 |  |  |         playerName, hurt = info[1][:2]
 | 
 |  |  |         hurtDict["playerName"] = playerName
 | 
 |  |  |         hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
 | 
 |  |  |         hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
 | 
 |  |  |         hurtInfo.append(hurtDict)
 | 
 |  |  | #    myRank = __GetSelfHurtRank(curPlayer)
 | 
 |  |  | #    if myRank and myRank > 5:
 | 
 |  |  | #        hurtDict = {}
 | 
 |  |  | #        hurtDict["rank"] = myRank
 | 
 |  |  | #        info = playerHurtList[myRank - 1]
 | 
 |  |  | #        playerName, hurt = info[1][:2]
 | 
 |  |  | #        hurtDict["playerName"] = playerName
 | 
 |  |  | #        hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
 | 
 |  |  | #        hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
 | 
 |  |  | #        hurtInfo.append(hurtDict)
 | 
 |  |  |     
 | 
 |  |  |     curSpeed = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_Speed % lineID) 
 | 
 |  |  |     isReduceing = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_IsReduceing % lineID) 
 | 
 |  |  |     remainHP = GetBossRemainHP(lineID, tick)
 | 
 |  |  |     totalHP = __GetBossTotalHP(lineID)
 | 
 |  |  |     hpReduceSpeed = curSpeed * 10000 / totalHP if totalHP else 0
 | 
 |  |  |     remainHPPer = min(100, remainHP * 100 / totalHP) if totalHP else 0
 | 
 |  |  |     fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed, 'remainHPPer':remainHPPer, 'isReduceing':isReduceing}
 | 
 |  |  |     remainHPPer = min(1000000, remainHP * 1000000 / totalHP) if totalHP else 0
 | 
 |  |  |     myHurt = g_heroHurtDict.get(curPlayer.GetID(), 0)
 | 
 |  |  |     fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed,  | 
 |  |  |                   'remainHPPer':remainHPPer, 'isReduceing':isReduceing,'myHurt':myHurt % ChConfig.Def_PerPointValue,
 | 
 |  |  |                   'myHurtEx':myHurt / ChConfig.Def_PerPointValue
 | 
 |  |  |                   }
 | 
 |  |  |     GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
 | 
 |  |  |     FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
 | 
 |  |  |     return
 | 
 |  |  | 
 |  |  | #  @return None
 | 
 |  |  | def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):
 | 
 |  |  |     UpdateHurtInfo(curPlayer, hurtHP)
 | 
 |  |  |     GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, GameWorld.GetGameWorld().GetTick())
 | 
 |  |  |     return
 | 
 |  |  | #
 | 
 |  |  | def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False):
 | 
 |  |  |     global g_heroHurtDict
 | 
 |  |  |     playerID = curPlayer.GetPlayerID()
 | 
 |  |  |     g_heroHurtDict[playerID] = g_heroHurtDict.get(playerID, 0) + hurtHP
 | 
 |  |  |      | 
 |  |  |     enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
 | 
 |  |  |     if enterCnt >= FBCommon.GetEnterFBMaxCnt:
 | 
 |  |  |     if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
 | 
 |  |  |         #没归属的不进伤害榜
 | 
 |  |  |         return
 | 
 |  |  |     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
 | 
 |  |  |     
 | 
 |  |  |     playerName = curPlayer.GetName() 
 | 
 |  |  |     playerID = curPlayer.GetPlayerID()
 | 
 |  |  |      | 
 |  |  |     familyID = curPlayer.GetFamilyID()
 | 
 |  |  |     playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {})
 | 
 |  |  |     if playerID not in playerHurtDict:
 | 
 |  |  | 
 |  |  |         GameWorld.Log("强制踢出玩家关闭副本: overTick=%s,tick=%s" % (overTick, tick))
 | 
 |  |  |         FBCommon.DoLogic_FBKickAllPlayer()
 | 
 |  |  |         return
 | 
 |  |  |     mapID = GameWorld.GetMap().GetMapID()
 | 
 |  |  |     | 
 |  |  | 
 | 
 |  |  |     lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
 | 
 |  |  |     if lineID <0:
 | 
 |  |  |         return
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
 | 
 |  |  |     if not startTick:
 | 
 |  |  |     if not startTick or overTick:
 | 
 |  |  |         return
 | 
 |  |  |     lastHurtTick = gameFB.GetGameFBDictByKey(FBDict_LastHurtTick)
 | 
 |  |  |     if lastHurtTick and tick - lastHurtTick >= 2000:
 | 
 |  |  |         StopReduceHP(lineID, tick)
 | 
 |  |  |         GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, 0)
 | 
 |  |  |              | 
 |  |  |     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
 | 
 |  |  |     __CheckBossHP(tick)
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  |     playerManager = GameWorld.GetMapCopyPlayerManager()#GameWorld.GetPlayerManager()
 | 
 |  |  |     firstPlayer = playerManager.FindPlayerByID(firstPlayerID)
 | 
 |  |  |     if firstPlayer:
 | 
 |  |  |         #gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank)
 | 
 |  |  |         gameFB.SetPlayerGameFBDict(firstPlayerID, FBPlayerDict_Rank, 1)
 | 
 |  |  |         if not dropPosX or not dropPosY:
 | 
 |  |  |             dropPosX, dropPosY = firstPlayer.GetPosX(), firstPlayer.GetPosY()
 | 
 |  |  |         prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True])
 | 
 |  |  |         prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True, True])
 | 
 |  |  |         if not prizeItemList:
 | 
 |  |  |             # 没有掉落时直接通知结算,防止卡副本
 | 
 |  |  |             firstPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
 | 
 |  |  | 
 |  |  |         if leaveServerTick and tick - leaveServerTick < ChConfig.Def_PlayerOfflineProtectTime:
 | 
 |  |  |             #离线超过3分钟的不给奖励
 | 
 |  |  |             msgStr = str([ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord, [firstPlayerID, lineID], [], 0, 0])
 | 
 |  |  |             playerManager.GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
 | 
 |  |  |             GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
 | 
 |  |  |             
 | 
 |  |  |     helpItemList = FBCommon.GetFBLineReward(mapID, lineID)
 | 
 |  |  |     if helpItemList: #同盟协助奖励
 | 
 |  |  |         needSpace = len(helpItemList)
 | 
 |  |  |         jsonItemList = FBCommon.GetJsonItemList(helpItemList)
 | 
 |  |  |         for index in range(0 , playerManager.GetPlayerCount()):
 | 
 |  |  |             curPlayer = playerManager.GetPlayerByIndex(index)
 | 
 |  |  | 
 |  |  |                 continue
 | 
 |  |  |             if curPlayerID == firstPlayerID:
 | 
 |  |  |                 continue
 | 
 |  |  |             if curPlayer.GetFamilyID() != firstPlayerFamilyID:
 | 
 |  |  |                 continue
 | 
 |  |  |             remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
 | 
 |  |  |             if not remainCnt:
 | 
 |  |  |                 continue
 | 
 |  |  |             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1)
 | 
 |  |  |             NotifyZXHelpCnt(curPlayer)
 | 
 |  |  |             curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
 | 
 |  |  |             overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList}
 | 
 |  |  |             FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
 | 
 |  |  |              | 
 |  |  |             packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
 | 
 |  |  |             if needSpace > packSpace:
 | 
 |  |  |                 PlayerControl.SendMailByKey('ZXBossHelperReward', [curPlayerID], helpItemList)
 | 
 |  |  |             remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
 | 
 |  |  |             if curPlayer.GetFamilyID() == firstPlayerFamilyID and remainCnt:
 | 
 |  |  |                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1)
 | 
 |  |  |                 NotifyZXHelpCnt(curPlayer)
 | 
 |  |  |                 ItemControler.GivePlayerItemOrMail(curPlayer, helpItemList, 'ZXBossHelperReward')
 | 
 |  |  |                 overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList}
 | 
 |  |  |                 FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
 | 
 |  |  |             else:
 | 
 |  |  |                 for itemID, itemCount, isBind in helpItemList:
 | 
 |  |  |                     ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])
 | 
 |  |  |      | 
 |  |  |                 overDict = {FBCommon.Over_rank:0}
 | 
 |  |  |                 FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, 0, overDict)
 | 
 |  |  |              | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def GiveZhuXianBossAward(curPlayer, lineID, isMail=False, dropItemMapInfo=[]):
 | 
 |  |  | 
 |  |  |             dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY()
 | 
 |  |  |         
 | 
 |  |  |         #结束 设置BOSS死亡
 | 
 |  |  | 
 | 
 |  |  |         FBCommon.ClearFBNPC()
 | 
 |  |  |         FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
 | 
 |  |  |         GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID)
 | 
 |  |  |         playerHurtList = __GetSortHurtList(lineID)
 | 
 |  |  | 
 |  |  |     if not startTick:
 | 
 |  |  |         gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, __GetBossTotalHP(lineID))
 | 
 |  |  |     gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick)
 | 
 |  |  |     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | def __GetBossTotalHP(lineID):return GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_BossTotalHP%lineID)
 | 
 |  |  | 
 |  |  | def DoPlayerDead(curPlayer):
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | ## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
 | 
 |  |  | #  @param attacker 攻击方
 | 
 |  |  | #  @param defender 防守方
 | 
 |  |  | #  @return bool
 | 
 |  |  | def CheckCanAttackTagObjInFB(attacker, defender):
 | 
 |  |  |     atkObjType = attacker.GetGameObjType()
 | 
 |  |  |     defObjType = defender.GetGameObjType()
 | 
 |  |  |     gameWorld = GameWorld.GetGameWorld()
 | 
 |  |  |     lineID = gameWorld.GetPropertyID() - 1
 | 
 |  |  |     if defObjType == IPY_GameWorld.gotNPC and defender.GetNPCID() == CurFBLineBOSSID(lineID):
 | 
 |  |  |         if not PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}):
 | 
 |  |  |             if atkObjType == IPY_GameWorld.gotPlayer:
 | 
 |  |  |                 PlayerControl.NotifyCode(attacker, 'TryEnterJadeDynastyBossError_7')
 | 
 |  |  |             return False
 | 
 |  |  |     return True
 | 
 |  |  | 
 | 
 |  |  | ##处理副本中杀死玩家逻辑
 | 
 |  |  | # @param curPlayer 玩家实例
 | 
 |  |  | # @param defender 防守者
 | 
 |  |  | # @param tick 时间戳
 | 
 |  |  | # @return 布尔值
 | 
 |  |  | # @remarks 处理副本中杀死玩家逻辑
 | 
 |  |  | def DoFBOnKill_Player(atkobj, defender, tick):
 | 
 |  |  |     return True |