| | |
| | | #"""Version = 2018-12-21 18:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | | import GameWorld
|
| | | import PyGameData
|
| | | import ReadChConfig
|
| | | import PlayerControl
|
| | | import IpyGameDataPY
|
| | | import IPY_GameWorld
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import ShareDefine
|
| | | import ChConfig
|
| | | import FBLogic
|
| | |
| | | def GetCrossPlayerName(curPlayer):
|
| | | # 通过游戏账号中的平台标志获取名称,目前为spid
|
| | | playerName = curPlayer.GetPlayerName()
|
| | | nameFormat = ReadChConfig.GetPyMongoConfig("Merge", "NameFormat", True)
|
| | | if not nameFormat:
|
| | | |
| | | opName = ReadChConfig.GetPyMongoConfig("Merge", "OpName_%s_%s" % (GameWorld.GetPlayerPlatform(curPlayer), |
| | | GameWorld.GetPlayerServerSID(curPlayer)))
|
| | | |
| | | if not opName:
|
| | | 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
|
| | | 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
|
| | | #
|
| | |
| | | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
|
| | |
|
| | | # 设置非跨服状态,踢下线
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | curPlayer.Kick(IPY_GameWorld.disMapServerClose)
|
| | | GameWorld.Log("PlayerExitCrossServer...", curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | | def DoEnterCrossRealm(curPlayer):
|
| | | ## 玩家进入跨服处理,本服的逻辑处理
|
| | | curPlayer.SetVisible(False)
|
| | | curPlayer.SetSight(0)
|
| | | curPet = curPlayer.GetPetMgr().GetFightPet()
|
| | | if curPet:
|
| | | curPet.SetVisible(False)
|
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
|
| | | return
|
| | |
|
| | | def DoExitCrossRealm(curPlayer):
|
| | | ## 玩家退出跨服处理,本服的逻辑处理
|
| | | GameWorld.Log("DoExitCrossRealm...", curPlayer.GetPlayerID())
|
| | | curPlayer.SetVisible(True)
|
| | | curPlayer.SetSight(1)
|
| | | curPlayer.RefreshView()
|
| | | curPlayer.SetSight(ChConfig.Def_PlayerSight_Default)
|
| | | curPlayer.RefreshView()
|
| | | curPet = curPlayer.GetPetMgr().GetFightPet()
|
| | | if curPet:
|
| | | curPet.SetVisible(True)
|
| | | if PlayerControl.GetCrossRealmState(curPlayer):
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetPlayerSightLevel(curPlayer, 0)
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | return
|
| | |
|
| | | def GetPlayerCrossActInfo(curPlayer, actName):
|
| | | ## 获取跨服玩家对应的跨服活动信息
|
| | | actInfoDict = PyGameData.g_crossActInfoDict.get(actName, {})
|
| | | if not actInfoDict:
|
| | | return {}
|
| | | playerServerID = GameWorld.GetPlayerServerID(curPlayer)
|
| | | for actInfo in actInfoDict.values():
|
| | | if ShareDefine.ActKey_ServerIDRangeList not in actInfo:
|
| | | continue
|
| | | serverIDRangeList = actInfo[ShareDefine.ActKey_ServerIDRangeList]
|
| | | if not serverIDRangeList:
|
| | | # 全服开启
|
| | | return actInfo
|
| | | for serverIDA, serverIDB in serverIDRangeList:
|
| | | if serverIDA <= playerServerID <= serverIDB:
|
| | | return actInfo
|
| | | return {}
|
| | |
|
| | | def NotifyCrossActEnd(curPlayer, actName):
|
| | | '''通知跨服运营活动结束
|
| | | 防止跨服服务器与子服时间不一致导致可能出现活动实际已关闭
|
| | | 但是前端根据本服服务器时间判断还未关闭,可能引起玩家误以为活动未关闭而引发的一系列问题
|
| | | 前端跨服活动显隐规则:
|
| | | 显示:根据通知的活动包 且 时间>=活动开始日期 才显示
|
| | | 关闭:收到后端通知的活动结束包 或 时间>=活动结束日期 则直接关闭活动界面
|
| | | '''
|
| | | |
| | | clientPack = ChPyNetSendPack.tagGCCrossActEnd()
|
| | | clientPack.ActName = actName
|
| | | clientPack.ActNameLen = len(clientPack.ActName)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|