From 73b55c6865b24648ed53ed3b6092eda82342f368 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 07 一月 2019 09:55:37 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(进入跨服相关封包)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py |   52 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
index 0213d80..037a68c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
@@ -114,7 +114,6 @@
     fbTimeList = IpyGameDataPY.GetFuncEvalCfg("CrossRealmPKFB", 1)
     
     if fbStep == FB_State_Open:
-        curPlayer.SetFaction(1)
         gameFB.SetGameFBDict(GameFBDict_FBPlayerID % 1, playerID)
         gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosX, curPlayer.GetPosX())
         gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosY, curPlayer.GetPosY())
@@ -130,7 +129,6 @@
         playerIDA = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 1)
         playerIDB = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 2)
         if not playerIDB and playerIDA != playerID:
-            curPlayer.SetFaction(2)
             gameFB.SetGameFBDict(GameFBDict_FBPlayerID % 2, playerID)
             gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosX, curPlayer.GetPosX())
             gameFB.SetPlayerGameFBDict(playerID, FBPDict_ResetPosY, curPlayer.GetPosY())
@@ -155,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():
@@ -191,6 +191,26 @@
             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 or 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
 
 ## 获得副本帮助信息
@@ -260,6 +280,7 @@
                     其他情况则在线玩家获胜,如果没有玩家在线,则最迟离线的获胜
     '''
     winner, winnerID, loser, loserID = None, 0, None, 0
+    roomID = GameWorld.GetGameWorld().GetPropertyID()
     gameFB = GameWorld.GetGameFB()
     fbStep = gameFB.GetFBStep()
     copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
@@ -271,6 +292,7 @@
         # 时间到还没分出胜负, 根据以下规则决定胜负,这里用玩家ID处理,防止结算时都掉线了导致没有结果
         # 伤害输出 > 优先到达时间 > 剩余HP > 最大HP > playerID
         
+        GameWorld.Log("两个人都在线,根据超时规则判断胜负玩家! roomID=%s" % (roomID))
         playerInfoList = []
         for playerID in [playerIDA, playerIDB]:
             player = copyMapPlayerManager.FindPlayerByID(playerID)
@@ -296,13 +318,19 @@
         player = copyMapPlayerManager.GetPlayerByIndex(i)
         if player == None or player.IsEmpty():
             continue
+        playerID = player.GetPlayerID()
+        if playerID not in [playerIDA, playerIDB]:
+            GameWorld.ErrLog("副本中玩家不在进入的玩家ID里,不处理! roomID=%s,playerID=%s" % (roomID, playerID))
+            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
@@ -373,7 +401,7 @@
         
         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:
             __ResetPlayerState(gameFB, player, playerID, False)
@@ -450,6 +478,22 @@
     GameWorld.Log("回合结束: roomID=%s,roundNum=%s,winnerID=%s,loserID=%s,updWinCnt=%s" % (roomID, roundNum, winnerID, loserID, updWinCnt))
     isOver = (updWinCnt >= IpyGameDataPY.GetFuncCfg("CrossRealmPKFB", 3))
     if not isOver:
+        if winner:
+            clearDeBuff = False
+            # 胜利者马上清除负面buff,防止死亡导致回合表现异常,如中毒
+            for buffType in [IPY_GameWorld.bfDeBuff, IPY_GameWorld.bfProcessDeBuff, IPY_GameWorld.bfActionBuff]:
+                buffTuple = SkillCommon.GetBuffManagerByBuffType(winner, buffType)
+                if buffTuple:
+                    buffState = buffTuple[0]
+                    buffCount = buffState.GetBuffCount()
+                    if buffCount:
+                        clearDeBuff = True
+                        buffState.Clear()
+                        GameWorld.DebugLog("胜者马上清除 buffType=%s,buffCount=%s" % (buffType, buffCount), winner.GetPlayerID())
+                        
+            if clearDeBuff:
+                PlayerControl.PlayerControl(winner).RefreshAllState()
+                
         FBCommon.SetFBStep(FB_State_Reborn, tick)
         return
     
@@ -474,7 +518,7 @@
     SkillCommon.ResetAllSkillCD(player)
     return
 
-## 跨服PK结束处理
+## 跨服PK结束处理,注意 winner、loser 参数可能为None
 def __DoFBPKAllOver(winner, winnerID, loser, loserID, overType, tick):
     gameFB = GameWorld.GetGameFB()
     

--
Gitblit v1.8.0