#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.CrossRealmPlayer # # @todo:¿ç·þÍæ¼Ò # @author hxp # @date 2018-12-21 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þÍæ¼Ò # #------------------------------------------------------------------------------- #"""Version = 2018-12-21 18:00""" #------------------------------------------------------------------------------- import GameWorld import ReadChConfig import PlayerControl import IpyGameDataPY import IPY_GameWorld import ShareDefine import ChConfig import FBLogic # »ñÈ¡Íæ¼Ò¿ç·þ·þÎñÆ÷ÉϵÄÃû×Ö 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 GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID): ## »ñÈ¡¿ç·þ·ÖÇø zoneTypeName = ChConfig.Def_CrossZoneTypeName.get(mapID, "CrossZoneComm") crossZoneName = GameWorld.GetCrossZoneName() ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition(zoneTypeName, {"CrossZoneName":crossZoneName}, True) if not ipyDataList: return for ipyData in ipyDataList: serverGroupIDList = ipyData.GetServerGroupIDList() for serverGroupIDInfo in serverGroupIDList: if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \ or (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID): return ipyData GameWorld.ErrLog("ûÓÐÕÒµ½¿ç·þÍæ·¨¶ÔÓ¦·ÖÇø! mapID=%s, serverGroupID=%s, zoneTypeName=%s" % (mapID, serverGroupID, zoneTypeName)) return def GetServerCrossZoneMapIpyData(zoneID, mapID): ## »ñÈ¡±¾·þ¶ÔÓ¦¿ç·þÍæ·¨·ÖÇøµØÍ¼ÐÅÏ¢ - ½öÊÊÓÃÓڹ̶¨µØÍ¼¼°ÐéÄâ·ÖÏߵĿç·þÍæ·¨ if mapID not in ChConfig.Def_CrossZoneMapTableName: return tableName = ChConfig.Def_CrossZoneMapTableName[mapID] return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":zoneID}) def IsCrossServerOpen(): ## ¿ç·þ·þÎñÆ÷ÊÇ·ñ¿ª·ÅÖÐ return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen) def SetCrossPlayerAttrValue(curPlayer, setDict, isDelay=True): ''' ÅúÁ¿ÉèÖÃÍæ¼ÒÊôÐÔÖµ @param setDict: ÉèÖÃÊôÐÔ×Öµä {attrName:attrValue, ...} @param isDelay: ÊÇ·ñÑÓ³Ùͬ²½£¬±ÈÈçOnDay¸üеÄÊýÖµ£¬¿ÉÄܶà¸öÍæ¼Òͬʱ¸üжà¸öÊôÐÔÖµ£¬ËùÒÔÐèÒªÉèÖÃÑÓ³Ùͳһͬ²½£¬ÆäËû¾ßÌå¸ù¾Ý¹¦ÄÜÐèҪѡÔñÊÇ·ñÑÓ³Ù ''' if not setDict or not PlayerControl.GetCrossMapID(curPlayer): return playerID = curPlayer.GetPlayerID() setType = "PlayerAttr" msgList = str([playerID, setType, setDict, isDelay]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SetCrossPlayerAttrValue", msgList, len(msgList)) GameWorld.DebugLog("¸üпç·þÍæ¼ÒÊôÐÔ: isDelay=%s,%s" % (isDelay, setDict), playerID) return def SetCrossPlayerNomalDict(curPlayer, setDict, isDelay=True): ''' ÅúÁ¿ÉèÖÃÍæ¼Ò×ÖµäÖµ @param setDict: ÉèÖÃ×Öµä, ÎÞ dictType ÐÅϢʱĬÈÏÀàÐÍ0 {dictKey:dictValue, dictKey:[dictValue, dictType], ...} @param isDelay: ÊÇ·ñÑÓ³Ùͬ²½£¬±ÈÈçOnDay¸üеÄÊýÖµ£¬¿ÉÄܶà¸öÍæ¼Òͬʱ¸üжà¸öÊôÐÔÖµ£¬ËùÒÔÐèÒªÉèÖÃÑÓ³Ùͳһͬ²½£¬ÆäËû¾ßÌå¸ù¾Ý¹¦ÄÜÐèҪѡÔñÊÇ·ñÑÓ³Ù ''' if not setDict or not PlayerControl.GetCrossMapID(curPlayer): return playerID = curPlayer.GetPlayerID() setType = "PlayerDict" msgList = str([playerID, setType, setDict, isDelay]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SetCrossPlayerAttrValue", msgList, len(msgList)) GameWorld.DebugLog("¸üпç·þÍæ¼Ò×Öµä: isDelay=%s,%s" % (isDelay, setDict), playerID) return def ClientServerMsg_SetPlayerAttrValue(curPlayer, playerSetInfoList): ## ÊÕµ½×Ó·þͬ²½µÄÉèÖÿç·þÍæ¼ÒÊôÐÔÖµ playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("ÊÕµ½×Ó·þͬ²½µÄÉèÖÿç·þÍæ¼ÒÊôÐÔÖµ: %s" % playerSetInfoList, playerID) for setType, setDict in playerSetInfoList: if setType == "PlayerDict": for dictKey, valeInfo in setDict.items(): if isinstance(valeInfo, int): dictValue, dictType = valeInfo, 0 else: dictValue, dictType = valeInfo PlayerControl.NomalDictSetProperty(curPlayer, dictKey, dictValue, dictType) GameWorld.DebugLog(" NomalDictSetProperty dictKey=%s, dictValue=%s, dictType=%s" % (dictKey, dictValue, dictType), playerID) else: for attrName, attrValue in setDict.items(): if hasattr(curPlayer, attrName): getattr(curPlayer, attrName)(attrValue) GameWorld.DebugLog(" curPlayer.%s(%s)" % (attrName, attrValue)) elif hasattr(PlayerControl, attrName): getattr(PlayerControl, attrName)(curPlayer, attrValue) GameWorld.DebugLog(" PlayerControl.%s(curPlayer, %s)" % (attrName, attrValue), playerID) return #// C1 04 Ö÷¶¯Í˳ö¿ç·þ #tagCMExitCrossRealm # #struct tagCMExitCrossRealm #{ # tagHead Head; #}; def OnExitCrossRealm(index, curPackData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not GameWorld.IsCrossServer(): return FBLogic.DoPlayerLeaveFB(curPlayer, tick) PlayerExitCrossServer(curPlayer) return def PlayerExitCrossServer(curPlayer): ## Íæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷ # ֪ͨ×Ó·þÍæ¼ÒÍ˳ö¿ç·þ·þÎñÆ÷ playerID = curPlayer.GetPlayerID() serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer) GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID]) # ÉèÖ÷ǿç·þ״̬£¬ÌßÏÂÏß PlayerControl.SetCrossMapID(curPlayer, 0) curPlayer.Kick(IPY_GameWorld.disMapServerClose) GameWorld.Log("PlayerExitCrossServer...", curPlayer.GetPlayerID()) return def DoEnterCrossRealm(curPlayer): ## Íæ¼Ò½øÈë¿ç·þ´¦Àí£¬±¾·þµÄÂß¼­´¦Àí PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) return def DoExitCrossRealm(curPlayer): ## Íæ¼ÒÍ˳ö¿ç·þ´¦Àí£¬±¾·þµÄÂß¼­´¦Àí GameWorld.Log("DoExitCrossRealm...", curPlayer.GetPlayerID()) PlayerControl.SetPlayerSightLevel(curPlayer, 0) if PlayerControl.GetCrossMapID(curPlayer): PlayerControl.SetCrossMapID(curPlayer, 0) return