From 95fb3b3d2ebabcc183b50722f7e7c0d65c115952 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 二月 2021 14:13:56 +0800
Subject: [PATCH] 4949 【主干】【BT2】节日祝福-在boss之家击杀个人boss完成了击杀boss之家boss游历值
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py | 146 ++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 128 insertions(+), 18 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 2729273..ca42a7b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -15,9 +15,13 @@
#"""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
@@ -26,13 +30,92 @@
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
#
@@ -56,31 +139,58 @@
# 通知子服玩家退出跨服服务器
playerID = curPlayer.GetPlayerID()
- serverGroupID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ServerGroupID)
+ serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
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)
- 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.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
+
--
Gitblit v1.8.0