xdh
2019-03-07 094b99fdbd566444b3e029bae944e0263e23a458
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):
@@ -82,10 +78,11 @@
    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():
@@ -150,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()
@@ -165,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)
@@ -203,7 +201,6 @@
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    global g_npcHurtDict
    gameWorld = GameWorld.GetGameWorld()
    # 清除鼓舞buff
    FBCommon.ClearEncourageBuff(curPlayer, tick)
@@ -211,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)
@@ -254,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):
@@ -270,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
@@ -324,17 +325,22 @@
#  @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:
@@ -360,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)
    
@@ -404,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)
@@ -420,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)
@@ -433,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,6 +484,7 @@
    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt)
    # 每日活动
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_ZhuXianBOSS, addCnt)
    return prizeItemList
def OnPickUpItem(curPlayer, curItem, tick):
@@ -547,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)
@@ -614,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)
@@ -661,4 +666,27 @@
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