From 69dc81f34df6887f26cbde4fad3fab687573f5b7 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期二, 28 五月 2019 14:55:29 +0800 Subject: [PATCH] 6965 【2.0】【后端】炼丹功能精简优化 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py | 89 ++++++++++++++++++++++++++++++++++++-------- 1 files changed, 72 insertions(+), 17 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py index 4c13c2d..4acc988 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py @@ -36,30 +36,83 @@ return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName -def GetServerCrossZoneIpyData(mapID, serverGroupID=0): - ## 获取本服对应跨服玩法分区地图信息 - if mapID not in ChConfig.Def_CrossZoneTableName: +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 - if not serverGroupID: - serverGroupID = GameWorld.GetServerGroupID() - - tableName = ChConfig.Def_CrossZoneTableName[mapID] - ipyDataMgr = IpyGameDataPY.IPY_Data() - if not hasattr(ipyDataMgr, "Get%sCount" % tableName): - return - - for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()): - ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i) + 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 # @@ -87,13 +140,14 @@ 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.SetCanAttack(False) curPlayer.SetVisible(False) curPlayer.SetSight(0) curPet = curPlayer.GetPetMgr().GetFightPet() @@ -104,14 +158,15 @@ def DoExitCrossRealm(curPlayer): ## 玩家退出跨服处理,本服的逻辑处理 GameWorld.Log("DoExitCrossRealm...", curPlayer.GetPlayerID()) + curPlayer.SetCanAttack(True) curPlayer.SetVisible(True) - curPlayer.SetSight(1) + curPlayer.SetSight(0) 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) + if PlayerControl.GetCrossMapID(curPlayer): + PlayerControl.SetCrossMapID(curPlayer, 0) return -- Gitblit v1.8.0