From c5b0df325fe592a22c885a313eee2219d2ae54b5 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 04 六月 2019 20:21:57 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 被动触发被动的处理
---
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 287 +++++++++++++++++++++++++++++++++++---------------------
1 files changed, 178 insertions(+), 109 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
index d6c0c46..578cae2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -27,32 +27,21 @@
import GMCommon
import ShareDefine
#import PlayerFamilyTech
-import PlayerDataCollect
import time
import ChPyNetSendPack
import NetPackCommon
import GameDataRecord
-import GameConfig
-import ReadChConfig
import UpdatePlayerName
import GameWorldBoss
import PlayerFamilyBoss
-#import PlayerManorWar
import PlayerBourse
-import GameWorldActionTeHui
+import PlayerZhuXianBoss
import PlayerXMZZ
-import GameWorldMergePK
-import GameWorldShopItem
-import MergeChildMsg
import PlayerTruck
-import PlayerMergeEvent
-import HighLadder
-import EventReport
-import MergePlayer
+import PlayerHorsePetBoss
import PlayerCompensation
import PlayerFamilyRedPacket
-import PlayerFamilyStore
-import PyDataManager
+#import PlayerFamilyStore
import PlayerSocial
import PlayerFamilyParty
import PlayerSealDemon
@@ -63,18 +52,43 @@
import IpyGameDataPY
import PlayerTalk
import PlayerGeTui
+import PlayerStore
import GameWorldActionControl
+import PlayerFBHelpBattle
import GMT_CTG
+import PyGameData
+import GMShell
+import IPY_PlayerDefine
+import CrossRealmPK
+import AuctionHouse
+import PlayerFB
#---------------------------------------------------------------------
#---------------------------------------------------------------------
+
+def DoRefreshMainServerRole(curPlayer):
+ ## 刷新本服角色信息
+
+ curTeam = curPlayer.GetTeam()
+ if curTeam:
+ PlayerTeam.Sync_TeamMemberInfo(curTeam)
+ return
+
## 玩家登录初始化(封包参数)
# @param index 玩家索引
# @param tick 当前时间
# @return None
# @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
def PlayerLogin(index, tick):
- GameWorld.GetPsycoFunc(__Func_PlayerLogin)(index, tick)
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ try:
+ __Func_PlayerLogin(curPlayer, tick)
+ except:
+ curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError)
+ import traceback
+ GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
return
#---------------------------------------------------------------------
@@ -83,16 +97,30 @@
# @param tick 当前时间
# @return None
# @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
-def __Func_PlayerLogin(index, tick):
+def __Func_PlayerLogin(curPlayer, tick):
- #玩家登录初始化
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ GameWorld.Log("__Func_PlayerLogin mapID=%s" % curPlayer.GetMapID(), curPlayer.GetPlayerID())
+ curPlayer.SetDict(ChConfig.Def_PDict_LoginMapID, curPlayer.GetMapID())
#玩家在线时间初始化
InitPlayerOnLineTime(curPlayer, tick)
#玩家响应信息初始化
InitPlayerOnLineReply(curPlayer, tick)
# 统计登入人数
GameDataRecord.PlayerLoginRecord(curPlayer, tick)
+ __DoPlayerLoginServer(curPlayer, tick)
+
+ #通知地图服务器自己初始化成功
+ curPlayer.MapServer_InitOK()
+ return
+
+def __DoPlayerLoginServer(curPlayer, tick):
+ ''' 玩家登录需要处理的内容,本服及跨服服务器分开
+ '''
+ if GameWorld.IsCrossServer():
+ #跨服PK
+ CrossRealmPK.OnPlayerLoginCrossServer(curPlayer)
+ return
+
#玩家家族刷新
#家族任务需要刷新 FamilyLV, 地图服务器需要知道FamilyLV来通知玩家家族任务次数
PlayerFamily.PlayerLoginRefreshFamily(curPlayer, tick)
@@ -108,31 +136,24 @@
#通知玩家登陆信息,来自运营方
#DoLogic_LoginUserData(curPlayer)
- #通知开服天数
- PlayerEventCounter.Sync_OpenServerDay(curPlayer)
+ #通知开服天数, 登录时改为地图通知,因为GameServer的PlayerLogin在地图之后,前端有些功能处理需要提前得到开服天
+ #PlayerEventCounter.Sync_OpenServerDay(curPlayer)
# 通知广播信息
GMCommon.SendBroadCastToClient(curPlayer)
-
-
- # 在非跨服服务器上线时,在跨服PK赛期间如果roomID不为0则重置
- #if not GameWorld.IsMergeServer() and GameWorldMergePK.IsMergePKMatchOpen() \
- # and curPlayer.GetVsRoomId() != 0:
- # PlayerControl.SetVsRoomId(curPlayer, 0)
PlayerTruck.SyncPlayerTruckStartTime(curPlayer)
#通知玩家交易所挂单情况
PlayerBourse.OnPlayerLogin(curPlayer)
-
+ #拍卖行
+ AuctionHouse.OnPlayerLogin(curPlayer)
+
#上线广播
__CheckWorldNotifyOnLogin(curPlayer, tick)
- #上线奖励处理
- #PlayerMergeEvent.MergeEventOnPlayerLogin(curPlayer)
- #MergePlayer.OnPlayerLogin(curPlayer)
#仙盟红包
PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)
#仙盟仓库
- PlayerFamilyStore.OnPlayerLogin(curPlayer)
+ #PlayerFamilyStore.OnPlayerLogin(curPlayer)
#仙盟宴会
PlayerFamilyParty.OnPlayerLogin(curPlayer)
#封魔坛
@@ -141,7 +162,8 @@
PlayerXMZZ.OnXMZZOnLogin(curPlayer)
#等级奖励
PlayerLVAward.OnPlayerLogin(curPlayer)
-
+ #商店购买次数
+ PlayerStore.OnPlayerLogin(curPlayer)
#通知世界boss信息
GameWorldBoss.OnPlayerLogin(curPlayer)
#家族副本boss状态通知
@@ -154,11 +176,17 @@
PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
#活动
GameWorldActionControl.OnPlayerLogin(curPlayer)
-
+ #玩家等级记录
+ PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
+ #副本助战
+ PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer)
+ #跨服PK
+ CrossRealmPK.OnPlayerLogin(curPlayer)
+ #诛仙BOSS
+ PlayerZhuXianBoss.OnPlayerLogin(curPlayer)
+ #骑宠boss状态通知
+ PlayerHorsePetBoss.OnLogin(curPlayer)
GMT_CTG.OnPlayerLogin(curPlayer)
-
- #通知地图服务器自己初始化成功
- curPlayer.MapServer_InitOK()
return
## 增加高手玩家上线广播
@@ -166,7 +194,7 @@
# @return None
def __CheckWorldNotifyOnLogin(curPlayer, tick):
# 跨服服务器不广播
- if GameWorld.IsMergeServer():
+ if GameWorld.IsCrossServer():
return
limitLV = IpyGameDataPY.GetFuncCfg("BillBoardPlayerLoginNotify", 2) # 最低等级限制
@@ -189,9 +217,6 @@
if checkMark not in ShareDefine.BillboardTypeList:
continue
- if checkMark in [ShareDefine.Def_BT_HighLadder]:
- continue
-
billboard = GameWorld.GetBillboard().FindBillboard(checkMark)
if not billboard:
continue
@@ -210,11 +235,7 @@
objBillboard = billboard.At(index)
if curPlayer.GetID() == objBillboard.GetID():
msgMark = notifyDict[order]
- break
-# # 竞技场
-# elif checkMark == "HighLadder":
-# highLadderOrder = HighLadder.GetPlayerOrder(curPlayer.GetID()) + 1
-# msgMark = notifyDict.get(highLadderOrder, "")
+ break
# 有可以广播的,马上广播,退出,不再检查
if msgMark:
@@ -240,44 +261,6 @@
diff_Time = loginTime - logoffTime
#天数 * 24小时 * 60 分钟 + 秒
return diff_Time.days * 24 * 60 * 60 + diff_Time.seconds
-
-## 统计客户端跨服赛激活时间
-# @param index 玩家索引
-# @return None
-def SendMergeWarOpen(curPlayer):
- # 发送跨服赛服务器信息
- mapConfig = GameConfig.GetConfig()
- mergeServerIP = mapConfig.get("MergeServerIP")
- mergeServerPort = mapConfig.get("MergeServerPort")
- if not mergeServerIP:
- return
- mergeServerInfo = ChPyNetSendPack.tagMergeServerInfo()
- mergeServerInfo.ServerIPLen = len(mergeServerIP)
- mergeServerInfo.ServerIP = mergeServerIP
- mergeServerInfo.Port = mergeServerPort
- mergeServerInfo.IsMergeServer = GameWorld.IsMergeServer()
- NetPackCommon.SendFakePack(curPlayer, mergeServerInfo)
- return
-
-## 跨服赛通知奖励
-# @param curPlayer: 玩家实例
-# @return: None
-def MSGetReward(curPlayer):
- #PlayerCanGetReward.SynClient_CanGetRewardList(curPlayer)
- return
-
-
-## 通知首次开服时间
-# @param curPlayer: 玩家实例
-# @return: None
-def Sync_InitOpenServerTime(curPlayer):
-# initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
-# packData = ChPyNetSendPack.tagInitOpenServerTime()
-# packData.Clear()
-# packData.Time = initOpenServerTime
-# NetPackCommon.SendFakePack(curPlayer, packData)
- return
-
## 运营登陆信息处理
# @param curPlayer
@@ -489,7 +472,16 @@
# @return None
# @remarks 函数详细说明.
def PlayerDisconnect(index, tick):
- GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick)
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ try:
+ __Func_PlayerDisconnect(curPlayer, tick)
+ except:
+ import traceback
+ GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家下线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ #调用底层下线
+ curPlayer.DoDisconnect()
return
## 玩家下线(封包参数)
@@ -497,11 +489,13 @@
# @param tick 当前时间
# @return None
# @remarks 函数详细说明.
-def __Func_PlayerDisconnect(index, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+def __Func_PlayerDisconnect(curPlayer, tick):
+ if GameWorld.IsCrossServer():
+ PlayerFB.OnPlayerDisconnectCrossServer(curPlayer)
+
#跨服匹配PK
- #GameWorldMergePK.OnLeaveServer(curPlayer)
+ CrossRealmPK.OnLeaveServer(curPlayer)
#组队玩家离线
PlayerTeam.DoPlayerLogOffTeamLogic(curPlayer, tick)
@@ -512,12 +506,10 @@
PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
# 设置家族成员离线时间
SetPlayerOfflineTime(curPlayer)
-
- #MergePlayer.OnPlayerLeaveGotoMergeServer(curPlayer, tick)
+ #拍卖行
+ AuctionHouse.OnPlayerLeaveServer(curPlayer)
#------------镖车逻辑
#TruckPlayerDisconnectProcess(curPlayer, tick)
- #调用底层下线
- curPlayer.DoDisconnect()
return
## 设置玩家离线时间
@@ -605,11 +597,6 @@
curPlayer.SetFightPower(packValue)
return
- if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10:
- #设置玩家跨服预赛排位
- PlayerControl.SetMergeWarRank(curPlayer, packValue)
- return
-
if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2:
#队伍相关相关审核开关状态
PlayerTeam.SetTeamCheckState(curPlayer, packValue)
@@ -620,11 +607,13 @@
elif packType == IPY_GameServer.CDBPlayerRefresh_LV:
curPlayer.SetLV(packValue)
PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
+ #玩家等级记录
+ playerID = curPlayer.GetID()
+ if playerID in PyGameData.g_todayPlayerLVDict:
+ PyGameData.g_todayPlayerLVDict[playerID] = packValue
elif packType == IPY_GameServer.CDBPlayerRefresh_Job:
curPlayer.SetJob(packValue)
- elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1:
- PlayerControl.SetJobRank(curPlayer, packValue)
# elif packType == IPY_GameServer.CDBPlayerRefresh_CurrentPlayerType:
# #这里应该通知组队那边刷新
@@ -646,8 +635,21 @@
elif packType == IPY_GameServer.CDBPlayerRefresh_VIPLv:
curPlayer.SetVIPLv(packValue);
# __RefreshTeamState(curPlayer)
+
+ elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr5:
+ PlayerControl.SetCrossMapID(curPlayer, packValue, False)
+
elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr9:
PlayerControl.SetVIPExpireTime(curPlayer, packValue)
+
+ elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10:
+ PlayerControl.SetChatBubbleBox(curPlayer, packValue)
+
+ elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr11:
+ PlayerControl.SetTodayXianyuanCoin(curPlayer, packValue)
+
+ elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr13:
+ PlayerControl.SetPlayerServerGroupID(curPlayer, packValue)
elif packType == IPY_GameServer.CDBPlayerRefresh_OperateInfo:
curPlayer.SetOperateInfo(packValue);
@@ -662,7 +664,8 @@
PlayerTeam.PlayerTeamMemberRefresh(curPlayer, packType, packValue, tick)
#家族刷新
PlayerFamily.PlayerRefresh(curPlayer, tick)
-
+ #副本助战
+ PlayerFBHelpBattle.UpdateCheckInPlayerInfoByRefresh(curPlayer, packType, packValue)
return
## 玩家切换地图的响应(参数 -> 当前玩家,当前时间)
@@ -679,6 +682,8 @@
GameWorld.Log("玩家 : %s,%s,FBID=%s 切换地图" % (curPlayer.GetName(), curPlayer.GetRealMapID(), curPlayer.GetFBID()) , curPlayer.GetPlayerID())
PlayerTeam.OnPlayerChangeMap(curPlayer, tick)
GameWorldBoss.OnPlayerChangeMap(curPlayer)
+ PlayerFamily.OnPlayerChangeMap(curPlayer, tick)
+ PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick)
return
## 玩家切换真实地图
@@ -756,7 +761,10 @@
#改到mapServer登录成功通知
#Sync_PyServerDataTimeToClient(curPlayer, tick)
- #PlayerTeam.OnPlayerReadMapOK(curPlayer, tick)
+ if GameWorld.IsCrossServer():
+ PlayerFB.PlayerLoginLoadCrossMapOK(curPlayer)
+
+ PlayerTeam.OnPlayerReadMapOK(curPlayer, tick)
#刷新人物日期状态
PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
@@ -769,7 +777,7 @@
#===============================================================================
#自己已经初始化成功
curPlayer.SetInitOK(True)
-
+ GMShell.OnPlayerLogin(curPlayer)
#发送请求至目标地图(任务需要登陆家族长触发事件)
__RefreshFamilyToMapServer(curPlayer)
return
@@ -869,17 +877,29 @@
#{
# tagHead Head;
# DWORD MapID;
-# BYTE FBLineID;
-# BYTE IsAllLine;
+# BYTE LineCount;
+# BYTE LineIDList[LineCount]; //个数为0时代表查全部
#};
def ClinetQueryFBLinePlayerCnt(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
queryMapID = clientData.MapID
- fbLineID = clientData.FBLineID
- isAllLine = clientData.IsAllLine
+ queryFBLineIDList = clientData.LineIDList
playerManager = GameWorld.GetPlayerManager()
- sendCMD = str([queryMapID, fbLineID, isAllLine])
+ if queryMapID in ChConfig.Def_CrossMapIDList:
+ fbLinePlayerInfoDict = PyGameData.g_crossFBFuncLinePlayerCountInfo.get(queryMapID, {})
+ if not queryFBLineIDList:
+ resultInfo = [queryMapID, fbLinePlayerInfoDict]
+ else:
+ defaultInfo = [0] # 与本服结构相同,默认0人
+ queryFBLineInfo = {}
+ for lineID in queryFBLineIDList:
+ queryFBLineInfo[lineID] = fbLinePlayerInfoDict.get(lineID, defaultInfo)
+ resultInfo = [queryMapID, queryFBLineInfo]
+ QueryFBLinePlayerCntResult(curPlayer, resultInfo)
+ return
+
+ sendCMD = str([queryMapID, queryFBLineIDList])
playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), 0, 0, queryMapID,
'FBLinePlayerCnt', sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
return
@@ -895,11 +915,13 @@
fblinePack = ChPyNetSendPack.tagGCFBLinePlayerCnt()
fblinePack.MapID = tagMapID
fblinePack.FBLineInfoList = []
- for lineID, playerCnt in fbLinePlayerCntDict.items():
+ for lineID, infoList in fbLinePlayerCntDict.items():
mapLineState = ChPyNetSendPack.tagGCFBLineInfo()
mapLineState.Clear()
mapLineState.FBLineID = lineID
- mapLineState.PlayerCnt = playerCnt
+ mapLineState.PlayerCnt = infoList[0] if infoList else 0
+ mapLineState.ExtraStr = infoList[1] if len(infoList) > 1 else ''
+ mapLineState.ExtraStrLen = len(mapLineState.ExtraStr)
fblinePack.FBLineInfoList.append(mapLineState)
fblinePack.Count = len(fblinePack.FBLineInfoList)
@@ -1114,5 +1136,52 @@
NetPackCommon.SendFakePack(curPlayer, serverDateTime)
return
+def UpdataPlayerLVInfo():
+ #Onday更新玩家等级信息
+ PyGameData.g_yesterdayPlayerLVDict = PyGameData.g_todayPlayerLVDict
+ PyGameData.g_todayPlayerLVDict = {}
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.GetActivePlayerCount()):
+ curPlayer = playerManager.GetActivePlayerAt(i)
+ if curPlayer == None or not curPlayer.GetInitOK():
+ continue
+ if PlayerControl.GetIsTJG(curPlayer):
+ continue
+ PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
+ return
+
+def LoadPlayerLVData():
+ #服务器开启时加载活跃玩家等级信息
+ universalRecMgr = GameWorld.GetUniversalRecMgr()
+
+ recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
+ allCnt = recDataList.Count()
+ for index in xrange(allCnt):
+ recData = recDataList.At(index)
+ PyGameData.g_todayPlayerLVDict[recData.GetValue1()] = recData.GetValue2()
-
\ No newline at end of file
+ recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
+ allCnt = recDataList.Count()
+ for index in xrange(allCnt):
+ recData = recDataList.At(index)
+ PyGameData.g_yesterdayPlayerLVDict[recData.GetValue1()] = recData.GetValue2()
+ GameWorld.DebugLog(' 服务器开启时加载活跃玩家等级信息g_todayPlayerLVDict=%s, g_yesterdayPlayerLVDict=%s'%(PyGameData.g_todayPlayerLVDict,PyGameData.g_yesterdayPlayerLVDict))
+ return
+
+def SavePlayerLVData():
+ #服务器关闭前时保存活跃玩家等级信息
+ GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
+ GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
+ universalRecMgr = GameWorld.GetUniversalRecMgr()
+ recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
+ for playerID, lv in PyGameData.g_todayPlayerLVDict.items():
+ recData = recDataList.AddRec()
+ recData.SetValue1(playerID)
+ recData.SetValue2(lv)
+
+ recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
+ for playerID, lv in PyGameData.g_yesterdayPlayerLVDict.items():
+ recData = recDataList.AddRec()
+ recData.SetValue1(playerID)
+ recData.SetValue2(lv)
+ return
\ No newline at end of file
--
Gitblit v1.8.0