From 495f9eed41e29b54672a767817c9cb11419dfa4c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 31 七月 2023 16:36:46 +0800
Subject: [PATCH] 9788 【BT9】【后端】成就系统(增加成就积分) hygame2
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 293 ++++++++++++++++++++++++++++++++++------------------------
1 files changed, 173 insertions(+), 120 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 011f3d4..384e068 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -31,6 +31,7 @@
import ChConfig
import uuid
+import time
# 协助类型
(
@@ -95,91 +96,93 @@
% (doCount, maxDoCount, removeCountTotal, delNoThanksCount, delUnGetThanksCount, len(assistThanksMgr.allAssistThanksList)))
return
-
-def OnPlayerLogin(curPlayer, isTJ=False):
+def OnPlayerLoginCrossServer(curPlayer):
+ # 跨服登录处理
+
+ playerID = curPlayer.GetPlayerID()
+ tagPlayerID = PlayerControl.GetAssistTagPlayerID(curPlayer)
+ if tagPlayerID and not GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID):
+ serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
+ sendMsg = {"queryType":"ResetPlayerAssist", "queryData":[playerID, tagPlayerID]}
+ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID])
+
+ return
+
+def OnPlayerLogin(curPlayer):
## 玩家上线
- # @param isTJ: 是否脱机上线
SyncCanGetAssistThanksGiftCount(curPlayer)
familyID = curPlayer.GetFamilyID()
playerID = curPlayer.GetPlayerID()
- if not familyID:
- return
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerNoSaveList = assistMgr.playerNoSaveDBAssistDict[playerID]
+
+ # 将自己发布的重新激活并通知其他玩家
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
- # 非脱机上线
- if not isTJ:
- GameWorld.DebugLog("玩家上线,恢复协助发布到仙盟列表!", playerID)
- if familyID not in assistMgr.familyAssistDict:
- assistMgr.familyAssistDict[familyID] = []
- recoverList = []
- familyAssistList = assistMgr.familyAssistDict[familyID]
- for assistObj in playerNoSaveList:
+ serverAssistList, familyAssistList = [], []
+ for assistObj in playerAssistList:
+ assistObj.OffLineTime = 0 # 设置为非离线
+ if not assistObj.FamilyID:
+ serverAssistList.append(assistObj)
+ elif familyID and familyID == assistObj.FamilyID:
familyAssistList.append(assistObj)
- recoverList.append(assistObj)
- GameWorld.DebugLog(" 恢复: %s" % assistObj.GUID)
- if recoverList:
- # 通知本盟其他玩家
- PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack(recoverList), [playerID])
-
- # 脱机上线
- else:
- GameWorld.DebugLog("玩家脱机上线,强制取消发布的非存库协助!", playerID)
- for assistObj in playerNoSaveList:
- OnCancelPlayerRequestAssist(assistObj, "TJGLogin", True)
-
- if not isTJ:
- SyncFamilyAssist(curPlayer)
+ if familyAssistList:
+ PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack(familyAssistList), [playerID])
+ if serverAssistList:
+ SyncServerAssist(serverAssistList)
+
+ # 全服服务器协助、仙盟协助 通知自己
+ syncAssistList = []
+ for assistObj in assistMgr.allAssistDict.values():
+ if assistObj.OffLineTime:
+ continue
+ if assistObj.FamilyID and assistObj.FamilyID != familyID:
+ continue
+ syncAssistList.append(assistObj)
+ if syncAssistList:
+ NetPackCommon.SendFakePack(curPlayer, GetAssistInfoListPack(syncAssistList))
# 没有协助中的信息
if playerID in assistMgr.playerAssistingDict:
assistObj = assistMgr.playerAssistingDict[playerID]
- if not isTJ:
- tagPlayerID = assistObj.PlayerID
- GameWorld.DebugLog("非脱机上线,继续协助!tagPlayerID=%s" % tagPlayerID, playerID)
-
- PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
- assistPack = ChPyNetSendPack.tagGCAssistingInfo()
- assistPack.AssistGUID = assistObj.GUID
- NetPackCommon.SendFakePack(curPlayer, assistPack)
-
- # 脱机上线
- else:
- OnCancelPlayerAssist(curPlayer, playerID, assistObj, "TJGLogin", True)
-
+ tagPlayerID = assistObj.PlayerID
+
+ GameWorld.DebugLog("非脱机上线,继续协助!tagPlayerID=%s" % tagPlayerID, playerID)
+
+ PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
+ assistPack = ChPyNetSendPack.tagGCAssistingInfo()
+ assistPack.AssistGUID = assistObj.GUID
+ NetPackCommon.SendFakePack(curPlayer, assistPack)
+
return
def OnLeaveServer(curPlayer):
## 玩家离线
familyID = curPlayer.GetFamilyID()
- if not familyID:
- return
if PlayerControl.GetAssistTagPlayerID(curPlayer):
PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if familyID not in assistMgr.familyAssistDict:
- return
-
playerID = curPlayer.GetPlayerID()
- if playerID not in assistMgr.playerNoSaveDBAssistDict:
+ if playerID not in assistMgr.playerAssistDict:
#GameWorld.DebugLog("玩家没有发布过协助,离线不处理!", playerID)
return
- playerNoSaveList = assistMgr.playerNoSaveDBAssistDict[playerID]
- familyAssistList = assistMgr.familyAssistDict[familyID]
+ playerAssistList = assistMgr.playerAssistDict[playerID]
# 暂时移除离线玩家发布的不存库协助信息,不再让其他盟友继续前往协助,已经在协助的不影响
- for assistObj in playerNoSaveList:
- if assistObj not in familyAssistList:
+ for assistObj in playerAssistList:
+ if assistObj.IsSaveDB:
continue
- familyAssistList.remove(assistObj)
- SyncFamilyClearAssist(familyID, assistObj.GUID)
- GameWorld.DebugLog("玩家下线,暂时从仙盟协助列表移除玩家发布的协助: %s" % assistObj.GUID)
+ assistObj.OffLineTime = int(time.time())
+ if not assistObj.FamilyID:
+ SyncServerClearAssist(assistObj.GUID)
+ elif familyID and familyID == assistObj.FamilyID:
+ SyncFamilyClearAssist(familyID, assistObj.GUID)
+ GameWorld.DebugLog("玩家下线,暂时从协助列表移除玩家发布的协助: %s" % assistObj.GUID)
return
@@ -190,8 +193,8 @@
assistMgr = PyDataManager.GetPlayerAssistPyManager()
# 玩家发布的
- if leavePlayerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[leavePlayerID]
+ if leavePlayerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[leavePlayerID]
for assistObj in playerAssistList[::-1]:
if assistObj.FamilyID:
OnCancelPlayerRequestAssist(assistObj, "LeaveFamily", True)
@@ -212,9 +215,9 @@
playerID = curPlayer.GetPlayerID()
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID not in assistMgr.playerNoSaveDBAssistDict:
+ if playerID not in assistMgr.playerAssistDict:
return
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ playerAssistList = assistMgr.playerAssistDict[playerID]
for assistObj in playerAssistList[::-1]:
gameMap = GameWorld.GetMap(assistObj.MapID)
@@ -228,6 +231,7 @@
setattr(dbData, "IsSaveDB", isSaveDB) # 是否保存数据库,离线可协助的需要存库,如挖矿类
setattr(dbData, "ObjID", 0) # NPC实例ID
setattr(dbData, "ServerGroupID", serverGroupID)
+ setattr(dbData, "OffLineTime", 0) # 发布玩家离线时间戳
assistType = AssistType_Unknown
if dbData.NPCID:
@@ -524,9 +528,24 @@
if not assistPlayer:
return
+ assistMgr = PyDataManager.GetPlayerAssistPyManager()
+ if assistGUID not in assistMgr.allAssistDict:
+ GameWorld.DebugLog("不存在该协助!assistGUID=%s" % assistGUID)
+ return
+ assistObj = assistMgr.allAssistDict[assistGUID]
+
# 设置协助
PlayerControl.SetAssistTagPlayerID(assistPlayer, tagPlayerID)
+ if assistPlayerID in assistMgr.playerAssistingDict:
+ assistingObj = assistMgr.playerAssistingDict[assistPlayerID]
+ if assistGUID != assistingObj.GUID:
+ OnCancelPlayerAssist(assistPlayer, assistPlayerID, assistingObj, "StartNewAssistBoss", True)
+ assistMgr.playerAssistingDict[assistPlayerID] = assistObj
+
+ if assistPlayerID not in assistObj.AssistPlayerIDList:
+ assistObj.AssistPlayerIDList.append(assistPlayerID)
+
assistPack = ChPyNetSendPack.tagGCAssistingInfo()
assistPack.AssistGUID = assistGUID
NetPackCommon.SendFakePack(assistPlayer, assistPack)
@@ -556,8 +575,8 @@
elif queryType == "OnCancelBossRequestAssist":
mapID, lineID, npcID, objID, reason = queryData
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
for assistObj in playerAssistList:
if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
OnCancelPlayerRequestAssist(assistObj, reason, False)
@@ -632,8 +651,8 @@
reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
for assistObj in playerAssistList:
if assistObj.AssistType != AssistType_Boss:
continue
@@ -682,8 +701,8 @@
reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
for assistObj in playerAssistList:
if assistObj.AssistType != AssistType_Boss:
continue
@@ -703,19 +722,8 @@
return
# 通知本服玩家
- funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
- clientPack = GetAssistInfoListPack([reqAssistObj])
- playerManager = GameWorld.GetPlayerManager()
- for i in xrange(playerManager.GetActivePlayerCount()):
- player = playerManager.GetActivePlayerAt(i)
- if player == None:
- continue
- if player.GetLV() < funcLimitLV:
- continue
- if PlayerControl.GetIsTJG(player):
- continue
- NetPackCommon.SendFakePack(player, clientPack)
-
+ SyncServerAssist([reqAssistObj])
+
# 广播请求
PlayerControl.WorldNotify(0, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID])
return
@@ -751,6 +759,11 @@
CrossServerMsg_BossAssistOver(queryType, queryData)
return
+ # 重置玩家协助
+ if queryType == "ResetPlayerAssist":
+ CrossServerMsg_ResetPlayerAssist(queryType, queryData)
+ return
+
return
def ClientServerMsg_CrossAssist(serverGroupID, msgData, tick):
@@ -779,8 +792,8 @@
reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
for assistObj in playerAssistList:
if assistObj.AssistType != AssistType_TeamFB:
continue
@@ -837,18 +850,12 @@
#assistMgr = PyDataManager.GetPlayerAssistPyManager()
assistMgr.allAssistDict[assistGUID] = assistObj
- if familyID:
- if familyID not in assistMgr.familyAssistDict:
- assistMgr.familyAssistDict[familyID] = []
- familyAssistList = assistMgr.familyAssistDict[familyID]
- familyAssistList.append(assistObj)
- if not isSaveDB:
- if playerID not in assistMgr.playerNoSaveDBAssistDict:
- assistMgr.playerNoSaveDBAssistDict[playerID] = []
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
- playerAssistList.append(assistObj)
-
+ if playerID not in assistMgr.playerAssistDict:
+ assistMgr.playerAssistDict[playerID] = []
+ playerAssistList = assistMgr.playerAssistDict[playerID]
+ playerAssistList.append(assistObj)
+
GameWorld.DebugLog(" 增加新协助请求: familyID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s,exData=%s,assistGUID=%s"
% (familyID, mapID, lineID, npcID, objID, exData, assistGUID), playerID)
return assistObj
@@ -906,13 +913,8 @@
return
assistMgr.allAssistDict.pop(assistGUID)
- if familyID in assistMgr.familyAssistDict:
- familyAssistList = assistMgr.familyAssistDict[familyID]
- if assistObj in familyAssistList:
- familyAssistList.remove(assistObj)
-
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
if assistObj in playerAssistList:
playerAssistList.remove(assistObj)
@@ -956,29 +958,28 @@
return
assistObj = assistMgr.allAssistDict.pop(assistGUID)
playerID = assistObj.PlayerID
+ assistType = assistObj.AssistType
GameWorld.Log("收到跨服取消协助boss请求: %s assistGUID=%s,reason=%s,isGameServer=%s" % (queryType, assistGUID, reason, isGameServer), playerID)
- if playerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ if playerID in assistMgr.playerAssistDict:
+ playerAssistList = assistMgr.playerAssistDict[playerID]
if assistObj in playerAssistList:
playerAssistList.remove(assistObj)
- # 通知本服玩家
- clearPack = ChPyNetSendPack.tagGCClearAssist()
- clearPack.AssistGUID = assistGUID
- funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
- playerManager = GameWorld.GetPlayerManager()
- for i in xrange(playerManager.GetActivePlayerCount()):
- player = playerManager.GetActivePlayerAt(i)
- if player == None:
- continue
- if player.GetLV() < funcLimitLV:
- continue
- if PlayerControl.GetIsTJG(player):
- continue
- NetPackCommon.SendFakePack(player, clearPack)
-
+ # 取消boss协助
+ if assistType == AssistType_Boss:
+ # 强制取消正在协助中的玩家
+ playerMgr = GameWorld.GetPlayerManager()
+ for assPlayerID in assistObj.AssistPlayerIDList[::-1]:
+ assistObj.AssistPlayerIDList.remove(assPlayerID)
+ if assPlayerID in assistMgr.playerAssistingDict:
+ assistingObj = assistMgr.playerAssistingDict[assPlayerID]
+ if assistingObj.GUID == assistGUID:
+ assPlayer = playerMgr.FindPlayerByID(assPlayerID)
+ OnCancelPlayerAssist(assPlayer, assPlayerID, assistObj, reason, isGameServer, isNotify=False)
+
+ SyncServerClearAssist(assistGUID)
return
def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -1066,15 +1067,29 @@
PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0)
return
+def CrossServerMsg_ResetPlayerAssist(queryType, queryData):
+ ## 收到跨服服务器 - 重置玩家协助
+ ##
+
+ playerID, tagPlayerID = queryData
+
+ GameWorld.Log("收到跨服重置玩家协助: playerID=%s,tagPlayerID=%s" % (playerID, tagPlayerID), playerID)
+
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+ if not curPlayer:
+ return
+ PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
+ return
+
def __DoBossAssistOver(queryData):
## boss协助结束,一般是boss被击杀 或 被系统
mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData
isCrossServer = GameWorld.IsCrossServer()
assistMgr = PyDataManager.GetPlayerAssistPyManager()
for noAssistPlayerID in noAssistPlayerIDList:
- if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
+ if noAssistPlayerID not in assistMgr.playerAssistDict:
continue
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
+ playerAssistList = assistMgr.playerAssistDict[noAssistPlayerID]
for assistObj in playerAssistList:
if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False)
@@ -1142,9 +1157,9 @@
## 副本协助结束
mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
+ if noAssistPlayerID not in assistMgr.playerAssistDict:
return
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
+ playerAssistList = assistMgr.playerAssistDict[noAssistPlayerID]
for assistObj in playerAssistList:
if assistObj.MapID == mapID and assistObj.LineID == lineID:
OnCancelPlayerRequestAssist(assistObj, "FBAssistOver", False)
@@ -1393,7 +1408,11 @@
if not familyID:
return
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- familyAssistList = assistMgr.familyAssistDict.get(familyID, [])
+ familyAssistList = []
+ for assistObj in assistMgr.allAssistDict.values():
+ if not assistObj.FamilyID or familyID != assistObj.FamilyID or assistObj.OffLineTime:
+ continue
+ familyAssistList.append(assistObj)
if not familyAssistList:
return
NetPackCommon.SendFakePack(curPlayer, GetAssistInfoListPack(familyAssistList))
@@ -1406,3 +1425,37 @@
PlayerFamily.SendFamilyFakePack(familyID, clearPack)
return
+def SyncServerAssist(assistList):
+ # 通知本服玩家协助请求信息
+ funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
+ clientPack = GetAssistInfoListPack(assistList)
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.GetActivePlayerCount()):
+ player = playerManager.GetActivePlayerAt(i)
+ if player == None:
+ continue
+ if player.GetLV() < funcLimitLV:
+ continue
+ if PlayerControl.GetIsTJG(player):
+ continue
+ NetPackCommon.SendFakePack(player, clientPack)
+ return
+
+def SyncServerClearAssist(assistGUID):
+ # 通知本服玩家清除协助
+ clearPack = ChPyNetSendPack.tagGCClearAssist()
+ clearPack.AssistGUID = assistGUID
+ funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss)
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.GetActivePlayerCount()):
+ player = playerManager.GetActivePlayerAt(i)
+ if player == None:
+ continue
+ if player.GetLV() < funcLimitLV:
+ continue
+ if PlayerControl.GetIsTJG(player):
+ continue
+ NetPackCommon.SendFakePack(player, clearPack)
+ return
+
+
--
Gitblit v1.8.0