From 0be2d6f2947fe9f3573841aee07dde4b9f4211b9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 19 九月 2024 16:39:21 +0800
Subject: [PATCH] 10267 【越南】【英文】【砍树】优化GivePlayerItemOrMail,防范列表元素包含None报错;

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py |   43 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
index 86ba160..3298d23 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
@@ -36,6 +36,7 @@
 import CrossChampionship
 import DataRecordPack
 import CrossRealmMsg
+import PyDataManager
 import ShareDefine
 import CrossBoss
 import time
@@ -64,8 +65,9 @@
 ## 跨服地图动态分配的虚拟线路信息 {(mapID, copyMapID):CrossCopyMapInfo, ...}
 class CrossCopyMapInfo():
     
-    def __init__(self, zoneID, funcLineID):
+    def __init__(self, zoneID, funcMapID, funcLineID):
         self.zoneID = zoneID
+        self.funcMapID = funcMapID
         self.funcLineID = funcLineID
         self.newFuncLineNum = 0
         self.realMapID = 0
@@ -95,9 +97,28 @@
             
         return totalPlayerCount
     
-    def IsMustCopyMapPlayer(self, playerID):
+    def IsMustCopyMapPlayer(self, playerID, checkTeam=True):
         ## 是否必定在此分线的玩家, 在请求队列里 或 曾经进入到该分线的,都强制认为属于该分线的玩家
-        return playerID in self.waitPlayerDict or playerID in self.enterPlayerIDList
+        if playerID in self.waitPlayerDict or playerID in self.enterPlayerIDList:
+            return True
+        if self.openState != IPY_PlayerDefine.fbosOpen:
+            return False
+        if not checkTeam:
+            return False
+        # 队友强制在一起
+        funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+        teamID = funcTeamMgr.GetPlayerTeamID(playerID, self.funcMapID)
+        if not teamID:
+            return False
+        funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+        if not funcTeam:
+            return False
+        for memID in funcTeam.GetMemberIDList():
+            if memID in self.waitPlayerDict or memID in self.enterPlayerIDList:
+                GameWorld.DebugLog("强制和队友在一条线路!  funcMapID=%s,memID=%s,realMapID=%s,copyMapID=%s" 
+                                   % (self.funcMapID, memID, self.realMapID, self.copyMapID), playerID)
+                return True
+        return False
         
     def OnRequestEnterCrossCopyMap(self, playerID, tick, copyMapPlayerMax, includeOffline):
         if not copyMapPlayerMax or self.IsMustCopyMapPlayer(playerID):
@@ -256,7 +277,7 @@
         
     realMapID, copyMapID, openState = tagCopyMapObj.realMapID, tagCopyMapObj.copyMapID, tagCopyMapObj.openState
     
-    if openState == IPY_PlayerDefine.fbosWaitForClose:
+    if openState >= IPY_PlayerDefine.fbosWaitForClose:
         PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossFBClose")
         GameWorld.ErrLog("分流的副本线路关闭中! mapID=%s,funcLineID=%s,zoneID=%s,realMapID=%s,copyMapID=%s,openState=%s" 
                          % (mapID, funcLineID, zoneID, realMapID, copyMapID, openState), playerID)
@@ -343,7 +364,7 @@
         
         copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
         openState = copyMapObj.openState
-        if openState == IPY_PlayerDefine.fbosWaitForClose:
+        if openState >= IPY_PlayerDefine.fbosWaitForClose:
             # 没有限制分流人数的情况,代表都在同一场,这种情况下当副本已经在关闭的状态下,则代表已经结束了,不可再进入
             if not shuntPlayerMax:
                 PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossFBClose")
@@ -456,7 +477,7 @@
     newFuncLineObj.copyMapID = copyMapID
     newFuncLineObj.newFuncLineNum = newFuncLineNum
     
-    copyMapObj = CrossCopyMapInfo(zoneID, funcLineID)
+    copyMapObj = CrossCopyMapInfo(zoneID, mapID, funcLineID)
     copyMapObj.realMapID = realMapID
     copyMapObj.copyMapID = copyMapID
     copyMapObj.newFuncLineNum = newFuncLineNum
@@ -529,7 +550,11 @@
         OnCrossDynamicLineClose(realMapID, copyMapID)
     elif state == IPY_PlayerDefine.fbosOpen:
         OnCrossDynamicLineOpen(mapID, realMapID, copyMapID)
-        
+    else:
+        key = (realMapID, copyMapID)
+        if key in PyGameData.g_crossDynamicLineCopyMapInfo:
+            copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
+            copyMapObj.openState = state
     return
 
 def OnCrossDynamicLineOpen(mapID, realMapID, copyMapID):
@@ -773,10 +798,6 @@
         if not GameWorldFamilyWar.CheckPlayerCanEnterFamilyWarFBMap(curPlayer):
             return
         
-    elif tagMapID == ChConfig.Def_FBMapID_FamilyBossMap:
-        if not PlayerFamilyBoss.CheckIsFamilyBossFBOpen(curPlayer.GetFamilyID(), tagMapID):
-            GameWorld.Log("EnterFBLine mapID=%s is familyBossFB, but is not open!" % tagMapID)
-            return
     #守卫人皇 是否已参加
     elif tagMapID == ChConfig.Def_FBMapID_FamilyInvade:
         if curPlayer.GetFamilyID() in PyGameData.g_swrhJoinRecord:

--
Gitblit v1.8.0