xdh
2019-03-11 ff52a6596b014b171a10de35779648e46b7a621b
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
@@ -27,16 +27,11 @@
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 PlayerActLogin
import EventReport
FBDict_StartTick = 'FBDict_StartTick%s' #开始时间
@@ -47,8 +42,9 @@
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):
@@ -151,9 +147,9 @@
#  @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()
@@ -166,6 +162,7 @@
    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)
@@ -204,7 +201,6 @@
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    global g_npcHurtDict
    gameWorld = GameWorld.GetGameWorld()
    # 清除鼓舞buff
    FBCommon.ClearEncourageBuff(curPlayer, tick)
@@ -212,7 +208,6 @@
    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)
@@ -255,12 +250,13 @@
#  @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):
@@ -271,24 +267,28 @@
        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
@@ -325,9 +325,14 @@
#  @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(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
        #没归属的不进伤害榜
@@ -335,7 +340,7 @@
    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:
@@ -361,15 +366,19 @@
        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)
    
@@ -405,10 +414,10 @@
    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)
@@ -421,11 +430,10 @@
        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)
@@ -434,24 +442,18 @@
                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=[]):
@@ -481,7 +483,8 @@
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID])
    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt)
    # 每日活动
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_ZhuXianBOSS, addCnt)
    return prizeItemList
def OnPickUpItem(curPlayer, curItem, tick):
@@ -548,7 +551,7 @@
            dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY()
        
        #结束 设置BOSS死亡
        FBCommon.ClearFBNPC()
        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
        GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID)
        playerHurtList = __GetSortHurtList(lineID)
@@ -615,6 +618,7 @@
    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)
@@ -669,10 +673,20 @@
def CheckCanAttackTagObjInFB(attacker, defender):
    atkObjType = attacker.GetGameObjType()
    defObjType = defender.GetGameObjType()
    if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC:
        gameWorld = GameWorld.GetGameWorld()
        lineID = gameWorld.GetPropertyID() - 1
        if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID):
            PlayerControl.NotifyCode(attacker, 'TryEnterJadeDynastyBossError_7')
    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