From b60fd3b8a91432c1491f0c017fc90735dd28ebcf Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 11 一月 2019 20:34:44 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(宝箱怪物刷新、跨服地图NPC个数查询支持)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py |   75 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 549d5d7..535acd2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -72,6 +72,8 @@
 import CrossRealmPlayer
 import CrossRealmMsg
 import CrossRealmPK
+import ChPyNetSendPack
+import NetPackCommon
 
 import time
 import datetime
@@ -258,7 +260,7 @@
         return
     # 查询地图NPC数量
     elif queryType == ChConfig.queryType_NPCCnt:
-        __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD)
+        __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD, tick)
         return
     else:
         GameWorld.ErrLog('unKnow queryType = %s' % (queryType))
@@ -299,7 +301,7 @@
 #  @param queryCallName: 请求回调名
 #  @param sendCMD: 请求的命令 根据请求类型和请求命令来决定最终操作
 #  @return None
-def __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD):
+def __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD, tick):
     playerManager = GameWorld.GetPlayerManager()
     try:
         mapInfo = eval(sendCMD)
@@ -311,10 +313,79 @@
         return
     
     tagMapID = mapInfo[0]
+    npcIDList = mapInfo[2]
+    # 本服查询跨服地图怪物数
+    if tagMapID in ChConfig.Def_CrossMapIDList and not GameWorld.IsCrossServer():
+        __QueryCrossServerMapNPCCntInfo(curPlayer, tagMapID, npcIDList, tick)
+        return
     playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), ChConfig.queryType_NPCCnt, 0, tagMapID,
                 queryCallName, sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
     return
 
+def __QueryCrossServerMapNPCCntInfo(curPlayer, mapID, npcIDList, tick):
+    ## 查询跨服地图NPC个数信息
+    if mapID in PyGameData.g_crossMapNPCInfo:
+        infoTick, mapNPCInfoDict = PyGameData.g_crossMapNPCInfo[mapID]
+        if tick - infoTick < 60 * 1000:
+            #GameWorld.DebugLog("直接同步本服缓存的跨服地图NPC信息")
+            SyncPlayerCrossMapNPCInfo(curPlayer, mapID, npcIDList, mapNPCInfoDict)
+            return
+        
+    # 本服缓存超时,发送跨服服务器查询
+    playerID = curPlayer.GetPlayerID()
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryNPCInfo, {"PlayerID":playerID, "MapID":mapID, "NPCIDList":npcIDList})
+    return
+
+def ClientServerMsg_QueryNPCInfo(serverGroupID, msgData):
+    ## 收到子服请求查看跨服地图NPC个数信息
+    
+    mapID = msgData["MapID"]
+    zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
+    if not zoneIpyData:
+        return
+    realMapID = zoneIpyData.GetMapID()
+    copyMapID = zoneIpyData.GetCopyMapID()
+    
+    sendCMD = {"ServerGroupID":serverGroupID, "CopyMapID":copyMapID}
+    sendCMD.update(msgData)
+    sendCMD = str(sendCMD)
+    GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, realMapID, "NPCCntCross", sendCMD, len(sendCMD))
+    return
+
+def CrossServerMsg_NPCInfoRet(msgData, tick):
+    ## 收到跨服服务器同步的地图NPC信息
+    
+    mapID = msgData["MapID"]
+    playerID = msgData["PlayerID"]
+    npcIDList = msgData["NPCIDList"]
+    mapNPCInfoDict = msgData["Result"]
+    PyGameData.g_crossMapNPCInfo[mapID] = [tick, mapNPCInfoDict]
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if curPlayer:
+        SyncPlayerCrossMapNPCInfo(curPlayer, mapID, npcIDList, mapNPCInfoDict)
+        
+    return
+
+def SyncPlayerCrossMapNPCInfo(curPlayer, mapID, npcIDList, mapNPCInfoDict):
+    ## 同步给玩家跨服地图NPC信息
+    
+    npcInfoPack = ChPyNetSendPack.tagMCNPCCntList()
+    npcInfoPack.Clear()
+    npcInfoPack.MapID = mapID
+    npcInfoPack.NPCInfoList = []
+    
+    for npcID in npcIDList:
+        npcInfo = ChPyNetSendPack.tagMCNPCCntInfo()
+        npcInfo.Clear()
+        npcInfo.NPCID = npcID
+        npcInfo.Cnt = mapNPCInfoDict.get(npcID, 0)
+        npcInfoPack.NPCInfoList.append(npcInfo)
+        
+    npcInfoPack.NPCInfoCnt = len(npcInfoPack.NPCInfoList)
+    NetPackCommon.SendFakePack(curPlayer, npcInfoPack)
+    return
+
+
 ## 获得家族属性(等级,人数)获得自己所在家族的属性
 #  @param curPlayer 请求的玩家
 #  @return 成功则返回相应的信息,家族等级和成员数量,如果不在家族中则返回None

--
Gitblit v1.8.0