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