xdh
2018-12-28 acb57c78d332420f59605f94dd0a071c536fe7dd
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
@@ -84,8 +84,15 @@
    fbStep = gameFB.GetFBStep()
    GameWorld.Log("DoEnterFB fbRoomID=%s,playerVSRoomID=%s,fbStep=%s" % (roomID, playerVSRoomID, fbStep), playerID)
    
    gameFB.SetGameFBDict(GameFBDict_PlayerLeaveTick % playerID, 0)
    if gameFB.GetGameFBDictByKey(GameFBDict_PlayerLeaveTick % playerID):
        GameWorld.Log("    玩家离线保护时间内上线!", playerID)
        gameFB.SetGameFBDict(GameFBDict_PlayerLeaveTick % playerID, 0)
        playerManager = GameWorld.GetMapCopyPlayerManager()
        for index in xrange(playerManager.GetPlayerCount()):
            player = playerManager.GetPlayerByIndex(index)
            if player and player.GetPlayerID() != curPlayer.GetPlayerID():
                player.Sync_TimeTick(ChConfig.tttPlayerLeave, 0, 0, True)
    fbRoundNum = gameFB.GetGameFBDictByKey(FB_RoundNum)
    playerRoundNum = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_RoundNum)
    if playerRoundNum and fbRoundNum and playerRoundNum != fbRoundNum:
@@ -98,6 +105,7 @@
    if fbStep >= FB_State_Leave or not roomID or not playerVSRoomID or roomID != playerVSRoomID:
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    PlayerControl.SetSight(curPlayer, ChConfig.Def_PlayerSight_Default * 3)
    
    # 非战斗阶段,通知动态障碍点
    if fbStep < FB_State_Fight:
@@ -111,8 +119,8 @@
        gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosY, curPlayer.GetPosY())
        gameFB.SetPlayerGameFBDict(playerID, FBPDict_RoundNum, 1)
        FBCommon.SetFBStep(FB_State_Waiting, tick)
        GameWorld.Log("    第一个进入,设置副本进入等待对手阶段!roomID=%s" % (roomID), playerID)
        __ResetPlayerState(gameFB, curPlayer, playerID, False)
        GameWorld.Log("    第一个进入,阵营1,设置副本进入等待对手阶段!roomID=%s" % (roomID), playerID)
        __ResetPlayerState(gameFB, curPlayer, playerID)
        curPlayer.Sync_TimeTick(ChConfig.tttWaitPlayer, 0, fbTimeList[Def_Time_MaxWait] * 1000, True)
        sendMsg = str([roomID])
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossPKRoomOpen", sendMsg, len(sendMsg))
@@ -125,8 +133,8 @@
            gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosX, curPlayer.GetPosX())
            gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosY, curPlayer.GetPosY())
            gameFB.SetPlayerGameFBDict(playerID, FBPDict_RoundNum, 1)
            GameWorld.Log("    第二个进入的玩家!roomID=%s" % (roomID), playerID)
            __ResetPlayerState(gameFB, curPlayer, playerID, False)
            GameWorld.Log("    第二个进入的玩家!阵营2,roomID=%s" % (roomID), playerID)
            __ResetPlayerState(gameFB, curPlayer, playerID)
            
        if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 2:
            GameWorld.Log("    两个人都在,设置副本进入战斗倒计时阶段!roomID=%s" % (roomID), playerID)
@@ -145,6 +153,8 @@
        curPlayer.Sync_TimeTick(ChConfig.tttTowerTake, 0, max(notify_tick, 0), True)
        
    FBCommon.Notify_FBHelp(curPlayer, __GetFBHelpInfo())
    PlayerControl.DelLimitSuperBuff(curPlayer, tick)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
def __GetFBHelpInfo():
@@ -172,6 +182,35 @@
    playerID = curPlayer.GetPlayerID()
    gameFB.SetGameFBDict(GameFBDict_PlayerLeaveTick % playerID, tick)
    GameWorld.Log("玩家战斗阶段下线!playerID=%s,waitPlayerID=%s" % (playerID, playerID))
    ## 通知对方,对手掉线
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        player = playerManager.GetPlayerByIndex(index)
        if player and player.GetPlayerID() != curPlayer.GetPlayerID():
            fbTimeList = IpyGameDataPY.GetFuncEvalCfg("CrossRealmPKFB", 1)
            player.Sync_TimeTick(ChConfig.tttPlayerLeave, 0, max(fbTimeList[Def_Time_Protect] * 1000, 0), True)
    return
##玩家主动离开副本.
def DoPlayerLeaveFB(curPlayer, tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep <= FB_State_Waiting and fbStep >= FB_State_Leave:
        return
    leavePlayerID = curPlayer.GetPlayerID()
    roomID = GameWorld.GetGameWorld().GetPropertyID()
    playerIDA = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 1)
    playerIDB = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 2)
    loser, loserID = curPlayer, leavePlayerID
    winnerID = playerIDA if playerIDB == loserID else playerIDB
    winner = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(winnerID)
    GameWorld.Log("玩家主动退出,直接算输! roomID=%s,leavePlayerID=%s,loserID=%s,winnerID=%s" % (roomID, leavePlayerID, loserID, winnerID))
    __DoFBPKAllOver(winner, winnerID, loser, loserID, Def_OverType_PlayerExit, tick)
    return
## 获得副本帮助信息
@@ -241,6 +280,7 @@
                    其他情况则在线玩家获胜,如果没有玩家在线,则最迟离线的获胜
    '''
    winner, winnerID, loser, loserID = None, 0, None, 0
    roomID = GameWorld.GetGameWorld().GetPropertyID()
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
@@ -252,6 +292,7 @@
        # 时间到还没分出胜负, 根据以下规则决定胜负,这里用玩家ID处理,防止结算时都掉线了导致没有结果
        # 伤害输出 > 优先到达时间 > 剩余HP > 最大HP > playerID
        
        GameWorld.Log("两个人都在线,根据超时规则判断胜负玩家! roomID=%s" % (roomID))
        playerInfoList = []
        for playerID in [playerIDA, playerIDB]:
            player = copyMapPlayerManager.FindPlayerByID(playerID)
@@ -279,11 +320,13 @@
            continue
        winner = player
        winnerID = player.GetPlayerID()
        GameWorld.Log("超时结算,玩家在线,直接获胜: roomID=%s,winnerID=%s" % (roomID, winnerID))
        break
    
    if not winner:
        playerLeaveTickA = gameFB.GetGameFBDictByKey(GameFBDict_PlayerLeaveTick % playerIDA)
        playerLeaveTickB = gameFB.GetGameFBDictByKey(GameFBDict_PlayerLeaveTick % playerIDB)
        GameWorld.Log("超时结算,没有玩家在线,后离线的获胜: playerLeaveTickA=%s,playerLeaveTickB=%s" % (playerLeaveTickA, playerLeaveTickB))
        # 离线tick较大的就是比较晚离线的
        if playerLeaveTickA > playerLeaveTickB:
            winnerID = playerIDA
@@ -343,7 +386,6 @@
    nextRoundNum = gameFB.GetGameFBDictByKey(FB_RoundNum) + 1
    gameFB.SetGameFBDict(FB_RoundNum, nextRoundNum)
    
    isWinnerResetState = False
    copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
    for i in xrange(copyMapPlayerManager.GetPlayerCount()):
        player = copyMapPlayerManager.GetPlayerByIndex(i)
@@ -355,11 +397,10 @@
        
        if player.GetPlayerAction() == IPY_GameWorld.paDie or player.GetHP() <= 0:
            GameWorld.DebugLog("复活玩家...", player.GetPlayerID())
            ChPlayer.PlayerRebornByType(player, ChConfig.rebornType_System, tick)
            ChPlayer.PlayerRebornByType(player, ChConfig.rebornType_System, tick, isAddSuperBuff=False)
            __ResetPlayerState(gameFB, player, playerID)
        else:
            if isWinnerResetState:
                __ResetPlayerState(gameFB, player, playerID)
            __ResetPlayerState(gameFB, player, playerID, False)
                
        FBCommon.Notify_FBHelp(player, helpDict)
        
@@ -440,12 +481,14 @@
    __DoFBPKAllOver(winner, winnerID, loser, loserID, overType, tick)
    return
def __ResetPlayerState(gameFB, player, playerID, resetPos=True):
    if resetPos:
        posX = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_ResetPosX)
        posY = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_ResetPosY)
        player.ResetPos(posX, posY)
def __ResetPlayerState(gameFB, player, playerID, resetAttr=True):
    posX = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_ResetPosX)
    posY = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_ResetPosY)
    player.ResetPos(posX, posY)
    if not resetAttr:
        return
    if player.GetHP() != player.GetMaxHP():
        player.SetHP(player.GetMaxHP())
        
@@ -455,7 +498,7 @@
    SkillCommon.ResetAllSkillCD(player)
    return
## 跨服PK结束处理
## 跨服PK结束处理,注意 winner、loser 参数可能为None
def __DoFBPKAllOver(winner, winnerID, loser, loserID, overType, tick):
    gameFB = GameWorld.GetGameFB()