From aff7dd9f1dbcea2cea4d10e1d1ebadfd94493bdb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 18 十一月 2025 15:32:20 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(优化演武场匹配,不匹配无战斗缓存的玩家;优化真实玩家缓存存储逻辑;优化机器人、假人加载逻辑;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py |   82 +++++++++++++++++++++++++---------------
 1 files changed, 51 insertions(+), 31 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
index 7dd4d13..76ecda7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
@@ -256,6 +256,7 @@
     toOrder = playerOrder + fromLowerCnt * matchPerRank # 从低名次往高名次匹配
     GameWorld.DebugLog("    fromLowerCnt=%s,matchPerRank=%s,toOrder=%s" % (fromLowerCnt, matchPerRank, toOrder), playerID)
     matchOrderList = [] # 匹配到的名次
+    viewCacheDict = {}
     for _ in range(matchPlayerCnt):
         fromOrder = max(1, toOrder - matchPerRank)
         if toOrder <= fromOrder:
@@ -267,36 +268,26 @@
         if not orderList:
             break
         
-        if fromOrder == 1:
-            for order in orderList:
-                if order > maxOrder:
-                    continue
-                matchOrderList.append(order)
+        for order in orderList:
+            if order > maxOrder:
+                continue
+            billData = billBoard.At(order - 1)
+            tagID = billData.GetID()
+            viewCache = PlayerViewCache.FindBattleViewCache(tagID)
+            if not viewCache:
+                GameWorld.DebugLog("    无战斗缓存的玩家不匹配: tagID=%s,order=%s,fromOrder=%s,toOrder=%s" % (tagID, order, fromOrder, toOrder), playerID)
+                continue
+            matchOrderList.append(order)
+            viewCacheDict[tagID] = viewCache
+            
+            if fromOrder == 1:
                 if len(matchOrderList) >= matchPlayerCnt:
                     break
-        else:
-            order = orderList[0]
-            if order <= maxOrder:
-                matchOrderList.append(order)
-                
+            else:
+                break
+            
         GameWorld.DebugLog("    匹配玩家: fromOrder=%s,toOrder=%s,matchOrderList=%s" % (fromOrder, toOrder, matchOrderList), playerID)
         toOrder = fromOrder - 1
-        
-    # GM指定匹配测试
-    if gmMatchIDList != None and curPlayer.GetGMLevel():
-        for gmMatchID in gmMatchIDList:
-            if gmMatchID == playerID:
-                GameWorld.DebugAnswer(curPlayer, "目标ID不能是自己!无法匹配!%s" % gmMatchID)
-                continue
-            
-            gmMatchOrder = billBoard.IndexOfByID(gmMatchID) + 1
-            if gmMatchOrder <= 0:
-                GameWorld.DebugAnswer(curPlayer, "目标ID不在榜单上!无法匹配!%s" % gmMatchID)
-                continue
-            GameWorld.DebugAnswer(curPlayer, "指定匹配ID(%s),order(%s)" % (gmMatchID, gmMatchOrder))
-            if gmMatchID not in matchOrderList:
-                matchOrderList.insert(0, gmMatchOrder)
-        matchOrderList = matchOrderList[:needMatchCount]
         
     matchOrderList.sort()
     matchIDList = [] # 最终匹配的玩家ID列表
@@ -304,10 +295,34 @@
         if matchOrder > maxOrder or matchOrder <= 0:
             break
         billData = billBoard.At(matchOrder - 1)
-        matchIDList.append(billData.GetID())
+        tagID = billData.GetID()
+        matchIDList.append(tagID)
+    GameWorld.DebugLog("    匹配榜单结果: matchIDList=%s,matchOrderList=%s" % (matchIDList, matchOrderList), playerID)
+    
+    # GM指定匹配测试
+    if gmMatchIDList != None and curPlayer.GetGMLevel():
+        for gmMatchID in gmMatchIDList:
+            if gmMatchID == playerID:
+                GameWorld.DebugAnswer(curPlayer, "不能匹配自己!%s" % gmMatchID)
+                continue
+            
+            if gmMatchID in matchIDList:
+                continue
+            
+            viewCache = PlayerViewCache.FindBattleViewCache(gmMatchID)
+            if not viewCache:
+                GameWorld.DebugAnswer(curPlayer, "没有战斗缓存目标不匹配!%s" % gmMatchID)
+                continue
+            
+            GameWorld.DebugAnswer(curPlayer, "指定匹配ID(%s)" % (gmMatchID))
+            matchIDList.append(gmMatchID)
+            viewCacheDict[gmMatchID] = viewCache
+            
+        matchOrderList = matchOrderList[:needMatchCount]
+        GameWorld.DebugLog("    指定匹配结果: matchIDList=%s" % (matchIDList), playerID)
         
     needRobotCnt = needMatchCount - len(matchIDList)
-    GameWorld.DebugLog("    匹配榜单结果: matchIDList=%s,matchOrderList=%s,needRobotCnt=%s" % (matchIDList, matchOrderList, needRobotCnt), playerID)
+    GameWorld.DebugLog("    还需机器人数=%s" % (needRobotCnt), playerID)
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     robotMax = ipyDataMgr.GetRobotCount()
     doCnt = 100
@@ -322,16 +337,21 @@
     GameWorld.DebugLog("    最终匹配结果: matchIDList=%s" % matchIDList, playerID)
     
     PyGameData.g_arenaPlayerMatchDict[playerID] = matchIDList
-    __SyncMatchList(curPlayer, matchIDList)
+    __SyncMatchList(curPlayer, matchIDList, viewCacheDict)
     return
 
-def __SyncMatchList(curPlayer, matchIDList):
+def __SyncMatchList(curPlayer, matchIDList, viewCacheDict={}):
     ## 同步匹配列表
     objPool = ObjPool.GetPoolMgr()
     clientPack = objPool.acquire(ChPyNetSendPack.tagSCArenaMatchList)
     clientPack.MatchList = []
     for matchID in matchIDList:
-        viewCache = PlayerViewCache.FindViewCache(matchID)
+        if matchID in viewCacheDict:
+            viewCache = viewCacheDict[matchID]
+        else:
+            viewCache = PlayerViewCache.FindBattleViewCache(matchID)
+        if not viewCache:
+            continue
         matchInfo = objPool.acquire(ChPyNetSendPack.tagSCArenaMatchInfo)
         matchInfo.PlayerID = matchID
         if viewCache:

--
Gitblit v1.8.0