ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -46,19 +46,14 @@
import ShareDefine
import GameDataRecord
import GameWorldShopItem
import PlayerMergeRegister
import PlayerCompensation
import PlayerFB
import UpdatePlayerName
import PlayerFamilyBoss
import PlayerManorWar
import GameWorldBoss
import MergeBroadcast
import GameWorldFamilyWar
import GameWorldMergeKing
import GameWorldMergePK
#import PlayerFamilyTech
import MergeChildMsg
import PlayerFamilyRedPacket
import PlayerFBHelpBattle
import PlayerFamilyStore
@@ -74,6 +69,11 @@
import PyGameData
import PlayerTalk
import PlayerStore
import CrossRealmPlayer
import CrossRealmMsg
import CrossRealmPK
import ChPyNetSendPack
import NetPackCommon
import time
import datetime
@@ -260,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))
@@ -301,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)
@@ -313,9 +313,78 @@
        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 请求的玩家
@@ -426,12 +495,14 @@
        PlayerCompensation.SendPersonalItemMailBatch(eval(resultName))
        return
    
    if callName == 'SendMergerChildMsg':
        operType, dataMsg = eval(resultName)
        MergeChildMsg.SendMergerChildToCenterStringData(operType, dataMsg)
        # 如果是恢复跨服PK连胜的,先记录恢复的玩家ID, 等待成功后同步最新结果给玩家
        if operType == ChConfig.Def_RecoverMergePKWin:
            GameWorldMergePK.Add_RecoverMergePKWinPlayer(srcPlayerID)
    if callName == "SendMsgToCrossServer":
        msgType, dataMsg = eval(resultName)
        CrossRealmMsg.SendMsgToCrossServer(msgType, dataMsg)
        return
    if callName == "SendMsgToClientServer":
        msgType, dataMsg, serverGroupIDList = eval(resultName)
        CrossRealmMsg.SendMsgToClientServer(msgType, dataMsg, serverGroupIDList)
        return
    
    if callName == 'MergeWorldNotify':
@@ -527,33 +598,35 @@
        GameDataRecord.ChangeCoinCnt(eval(resultName))
        return
    
    #跨服广播子服
    if callName == 'SendBroadcastMergeClient':
        operType, mapID, dataDict, isRepeat = eval(resultName)
        MergeBroadcast.SendBroadcastMerge(operType, mapID, dataDict, isRepeat)
        return
    #跨服赛报名获得新账号
    if callName == 'MergeRegister':
        PlayerMergeRegister.MergeWarRegisterNewAcc(srcPlayerID, eval(resultName), tick)
        return
    #跨服王者争霸
    if callName == 'MergeKingFB':
        GameWorldMergeKing.MapServer_MergeKingFB(eval(resultName))
    #跨服匹配PK战斗结算
    if callName == "CrossPKOver":
        CrossRealmPK.MapServer_CrossPKOver(eval(resultName), tick)
        return
    
    #跨服匹配PK
    if callName == 'MergePKOver':
        GameWorldMergePK.MapServer_MergePKOver(eval(resultName))
    #跨服匹配房间开启
    if callName == "CrossPKRoomOpen":
        CrossRealmPK.MapServer_CrossPKRoomOpen(eval(resultName), tick)
        return
    
    #跨服匹配PK取消匹配
    if callName == 'MergePKCancel':
    if callName == "CrossRealmPKCancel":
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        if not curPlayer:
            return
        GameWorldMergePK.SendCancelMergePKMatch(curPlayer, resultName)
        CrossRealmPK.SendCancelCrossRealmPKMatch(curPlayer, resultName)
        return
    #跨服PK请求玩家当前排名
    if callName == "CrossPKSeasonOrder":
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        if not curPlayer:
            return
        CrossRealmPK.MapServer_QueryCrossPKSeasonOrder(curPlayer, eval(resultName))
        return
    #跨服注册结果
    if callName == "CrossRealmReg":
        CrossRealmPlayer.OnCrossRealmRegOK(srcPlayerID, eval(resultName), tick)
        return
    
    #py喇叭聊天
@@ -562,6 +635,14 @@
        if not curPlayer:
            return
        PlayerTalk.ChatPYSpeaker(curPlayer, eval(resultName))
        return
    #刷新本服角色信息
    if callName == 'RefreshMainServerRole':
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        if not curPlayer:
            return
        ChPlayer.DoRefreshMainServerRole(curPlayer)
        return
    
    # 战盟联赛
@@ -829,15 +910,6 @@
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        resultName = '%s' % GameWorldOpenServerCampaign.CanGiveCampaignAward(curPlayer, eval(resultName))
        
    # 跨服PK奖励
    if callName == 'MergePKAward':
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        resultName = '%s' % GameWorldMergePK.MapServer_QueryMergePKAward(curPlayer, eval(resultName))
    # 跨服王者争霸
    if callName == 'MergeKing':
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        resultName = '%s' % GameWorldMergeKing.MapServer_MergeKingQuery(curPlayer, eval(resultName))
    
    # 玩家自身战盟科技等级提升, 改为地图直接处理, 暂屏蔽
#    if callName == 'PlayerFamilyTechLVUP':