#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package CrossRealmPlayer
|
#
|
# @todo:¿ç·þÍæ¼Ò
|
# @author hxp
|
# @date 2018-12-21
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ç·þÍæ¼Ò
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-12-21 18:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ShareDefine
|
import CrossRealmMsg
|
import ReadChConfig
|
import ChConfig
|
import PlayerControl
|
import PlayerViewCache
|
import ChPyNetSendPack
|
import IPY_PlayerDefine
|
import NetPackCommon
|
import PyGameData
|
|
# »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö
|
#===============================================================================
|
# def GetCrossPlayerName(curPlayer):
|
# # ͨ¹ýÓÎÏ·Õ˺ÅÖÐµÄÆ½Ì¨±êÖ¾»ñÈ¡Ãû³Æ£¬Ä¿Ç°Îªspid
|
# playerName = curPlayer.GetPlayerName()
|
# nameFormat = ReadChConfig.GetPyMongoConfig("Merge", "NameFormat", True)
|
# if not nameFormat:
|
# return playerName
|
#
|
# opName = ReadChConfig.GetPyMongoConfig("Merge", "OpName_%s" % GameWorld.GetPlayerPlatform(curPlayer))
|
#
|
# return (nameFormat%{"opname":opName, "sid":GameWorld.GetPlayerServerID(curPlayer)}).decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
#===============================================================================
|
|
# »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö
|
def GetCrossPlayerName(curPlayer):
|
# ͨ¹ýÓÎÏ·Õ˺ÅÖÐµÄÆ½Ì¨±êÖ¾»ñÈ¡Ãû³Æ£¬Ä¿Ç°Îªspid
|
playerName = curPlayer.GetPlayerName()
|
|
opName = ReadChConfig.GetPyMongoConfig("Merge", "OpName_%s_%s" % (GameWorld.GetPlayerPlatform(curPlayer),
|
GameWorld.GetPlayerServerSID(curPlayer)))
|
|
if not opName:
|
return playerName
|
|
return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
|
def PlayerExitCrossServer(curPlayer):
|
## Íæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷
|
|
# ֪ͨ×Ó·þÍæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷
|
playerID = curPlayer.GetPlayerID()
|
serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
|
|
# ÉèÖ÷ǿç·þ״̬£¬ÌßÏÂÏß
|
PlayerControl.SetCrossRealmState(curPlayer, 0)
|
curPlayer.Kick(0)
|
GameWorld.Log("PlayerExitCrossServer...serverGroupID=%s" % serverGroupID, playerID)
|
return
|
|
def CrossServerMsg_ExitCrossServer(msgData):
|
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÍæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷
|
playerID = msgData
|
GameWorld.Log("ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÍæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷: playerID=%s" % playerID)
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if not curPlayer:
|
GameWorld.Log(" Í˳ö¿ç·þʱ±¾·þÍæ¼Ò²»ÔÚÏß!", playerID)
|
return
|
PlayerControl.SetCrossRealmState(curPlayer, 0)
|
return
|
|
def SendCrossRealmReg(curPlayer, actionType, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0):
|
# ·¢ËÍ¿ç·þÕ˺Å×¢²áÉÏ´«Êý¾Ý
|
|
# ÉèÖÃÉÏ´«Êý¾ÝµÄ»î¶¯ÀàÐÍ
|
curPlayer.SetDict(ChConfig.Def_PlayerKey_MergeRegisterType, actionType)
|
sysMsg = str([actionType, mapID, dataMapID, copyMapID, posX, posY])
|
curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossRealmReg", sysMsg, len(sysMsg))
|
GameWorld.Log("SendCrossRealmReg actionType=%s,mapID=%s,dataMapID=%s,copyMapID=%s,posX=%s,posY=%s"
|
% (actionType, mapID, dataMapID, copyMapID, posX, posY), curPlayer.GetPlayerID())
|
return
|
|
def OnCrossRealmRegOK(playerID, msgList, tick):
|
## ¿ç·þ±¨Ãû½á¹û
|
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if not curPlayer:
|
return
|
|
#newAccount, newName = msgList
|
|
actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)
|
GameWorld.Log("¿ç·þ±¨Ãû³É¹¦ , actionType=%s" % (actionType), playerID)
|
|
# ¿ç·þPKÉÏ´«Êý¾ÝÍê±Ï£¬Í¨Öª¿ç·þ·þÎñÆ÷£¬×¼±¸Íê±Ï
|
if actionType == ShareDefine.Def_CrossAction_PK:
|
regVSRoomID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterRoomID)
|
vsRoomID = curPlayer.GetVsRoomId()
|
|
if regVSRoomID != vsRoomID:
|
GameWorld.Log("ÉÏ´«¿ç·þ·þÎñÆ÷µÄ regVSRoomID=%s ÓëÍæ¼Òµ±Ç°µÄ roomID=%s ²»Í¬!²»·¢ËÍ×¼±¸Íê±Ï£¡"
|
% (regVSRoomID, vsRoomID), playerID)
|
return
|
|
dataMsg = {
|
"accID":curPlayer.GetAccID(), # ½ÇÉ«Õ˺ÅID
|
"playerID":playerID, # ½ÇÉ«ID
|
"vsRoomID":vsRoomID, # ËùÊô¶ÔÕ½·¿¼äID
|
}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PKPrepareOK, dataMsg)
|
GameWorld.Log("֪ͨ¿ç·þ·þÎñÆ÷, Íæ¼ÒÆ¥ÅäPK×¼±¸Íê±Ï£¡%s" % str(dataMsg), playerID)
|
|
# ÆäËûµÄ£¬ÔÚÉÏ´«Êý¾ÝÍê±Ïºó£¬Ê¹ÓÃͨÓõÄ֪ͨ¿É½øÈë¿ç·þ
|
else:
|
NotifyCanEnterMergeServer(curPlayer, actionType)
|
|
# hxp 2015.09.10 ¿ç·þboss£¬ºóÃæµÄÔÝʱ²»ÐèÒª
|
return
|
|
|
def NotifyCanEnterMergeServer(curPlayer, actionType):
|
# ͨÓðü£¬Í¨Öª¿Í»§¶Ë¿É½øÈë¿ç·þ·þÎñÆ÷
|
return
|
|
#// C0 03 Ç¿ÖÆÍ˳ö¿ç·þ״̬ #tagCGForceQuitCrossState
|
#
|
#struct tagCGForceQuitCrossState
|
#{
|
# tagHead Head;
|
#};
|
def OnForceQuitCrossState(index, clientData, tick):
|
''' Ô¼¶¨¸Ã·â°ü½öÍæ¼Òµ±Ç°´¦ÓÚ¿ç·þ״̬£¬µ«ÊÇÒ»Ö±Á¬²»ÉÏ¿ç·þ·þÎñÆ÷ʱ²Å»á·¢´Î°üÇ¿ÖÆÖØÖÿç·þ״̬
|
Ò»°ãÊÇ¿ç·þ·þÎñÆ÷Òì³£»òÆäËû´íÎóµ¼ÖÂÎÞ·¨µÇ¼¿ç·þ·þÎñÆ÷
|
'''
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
GameWorld.ErrLog("ijЩÒì³£Çé¿öÏ£¬Ç°¶ËÇ¿ÖÆ·¢°üÍ˳ö¿ç·þ״̬! ", curPlayer.GetPlayerID())
|
PlayerControl.SetCrossRealmState(curPlayer, 0)
|
return
|
|
#// C0 02 ²é¿´¿ç·þÍæ¼ÒÐÅÏ¢ #tagCGViewCrossPlayerInfo
|
#
|
#struct tagCGViewCrossPlayerInfo
|
#{
|
# tagHead Head;
|
# DWORD PlayerID; // ¿ç·þÍæ¼ÒID
|
#};
|
def OnViewCrossPlayerInfo(index, clientData, tick):
|
if GameWorld.IsCrossServer():
|
return
|
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
tagPlayerID = clientData.PlayerID
|
curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
|
## ±¾·þÓУ¬Ö±½Ó»Ø¿Í»§¶Ë
|
if curCache:
|
GameWorld.DebugLog("²é¿´¿ç·þÍæ¼Ò£¬ÊDZ¾·þÍæ¼Ò£¬Ö±½Ó»Ø¸´!tagPlayerID=%s" % (tagPlayerID), playerID)
|
sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
|
sendPack.PlayerID = tagPlayerID
|
sendPack.PropData = curCache.GetPropData()
|
sendPack.PropDataSize = len(sendPack.PropData)
|
sendPack.ItemData = PlayerViewCache.GetItemData(curCache)
|
sendPack.ItemDataSize = len(sendPack.ItemData)
|
sendPack.PlusData = PlayerViewCache.GetPlusData(curCache)
|
sendPack.PlusDataSize = len(sendPack.PlusData)
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
return
|
|
if tagPlayerID in PyGameData.g_crossPlayerViewCache:
|
validChaheTime = 5 * 60 * 1000
|
cacheInfo, updTick = PyGameData.g_crossPlayerViewCache[tagPlayerID]
|
if tick - updTick <= validChaheTime:
|
GameWorld.DebugLog("²é¿´¿ç·þÍæ¼ÒÊý¾Ýͬ²½CDÖУ¬Ö±½ÓÓûº´æÊý¾Ý»Ø¸´!tagPlayerID=%s" % (tagPlayerID), playerID)
|
SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo)
|
return
|
|
for crossPlayerID, cacheInfoList in PyGameData.g_crossPlayerViewCache.items():
|
if tick - cacheInfoList[1] > validChaheTime:
|
PyGameData.g_crossPlayerViewCache.pop(crossPlayerID)
|
|
# ·¢ËÍ¿ç·þ·þÎñÆ÷²éѯ
|
dataMsg = {"tagPlayerID":tagPlayerID, "playerID":playerID}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ViewPlayerCache, dataMsg)
|
return
|
|
def ClientServerMsg_ViewPlayerCache(serverGroupID, msgData):
|
tagPlayerID = msgData["tagPlayerID"]
|
playerID = msgData["playerID"]
|
|
GameWorld.Log("ÊÕµ½×Ó·þ²é¿´¿ç·þÍæ¼ÒÐÅÏ¢: serverGroupID=%s,playerID=%s,tagPlayerID=%s" % (serverGroupID, playerID, tagPlayerID))
|
|
cacheInfo = []
|
curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
|
if curCache:
|
cacheInfo = [curCache.GetPropData(), PlayerViewCache.GetItemData(curCache), PlayerViewCache.GetPlusData(curCache)]
|
|
viewPlayerCacheRet = [playerID, tagPlayerID, cacheInfo]
|
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ViewPlayerCacheRet, viewPlayerCacheRet, [serverGroupID])
|
return
|
|
def CrossServerMsg_ViewPlayerCacheRet(msgData, tick):
|
|
playerID, tagPlayerID, cacheInfo = msgData
|
GameWorld.Log("ÊÕµ½¿ç·þ·þÎñÆ÷»Ø¸´µÄ²é¿´Íæ¼ÒÐÅÏ¢: playerID=%s,tagPlayerID=%s" % (playerID, tagPlayerID))
|
|
PyGameData.g_crossPlayerViewCache[tagPlayerID] = [cacheInfo, tick] # ¸üÐÂÐÅÏ¢
|
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer:
|
SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo)
|
|
return
|
|
def SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo):
|
if not cacheInfo:
|
PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
|
return
|
PropData, ItemData, PlusData = cacheInfo
|
sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
|
sendPack.PlayerID = tagPlayerID
|
sendPack.PropData = PropData
|
sendPack.PropDataSize = len(sendPack.PropData)
|
sendPack.ItemData = ItemData
|
sendPack.ItemDataSize = len(sendPack.ItemData)
|
sendPack.PlusData = PlusData
|
sendPack.PlusDataSize = len(sendPack.PlusData)
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
return
|
|
|
|
|