From 2b86c7b9ca3a719dc0f25ce3df11296b87795ef2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 23 五月 2022 17:00:20 +0800
Subject: [PATCH] 9415 【BT】【后端】古神战场(采集阵营buff时每个在线阵营玩家增加个人开奖贡献)
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 138 insertions(+), 38 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 1c4a5e3..2348d7e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -38,6 +38,62 @@
AssistType_TeamFB, # 组队副本
) = range(3)
+def RemoveOutofdateAssistThanks():
+ ## 移除过期的未完结感谢数据
+
+ timeoutDate = GameWorld.GetDatetimeByDiffDays(-7)
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ maxDoCount = len(assistThanksMgr.allAssistThanksList)
+ syncPlayerIDList = []
+ removeCountTotal, delNoThanksCount, delUnGetThanksCount = 0, 0, 0
+ doCount = 0
+ while doCount < maxDoCount and assistThanksMgr.allAssistThanksList:
+ doCount += 1
+ thanks = assistThanksMgr.allAssistThanksList[0]
+ thanksDate = GameWorld.ChangeStrToDatetime(thanks.TimeStr)
+ if thanksDate > timeoutDate:
+ break
+
+ removeCountTotal += 1
+ # 移除过期的感谢数据
+ popThanks = assistThanksMgr.allAssistThanksList.pop(0)
+ playerID = popThanks.PlayerID
+ GUID = popThanks.GUID
+ assistPlayerIDList = popThanks.AssistPlayerDict.keys()
+
+ if playerID in assistThanksMgr.playerThanksDict:
+ playerThanksList = assistThanksMgr.playerThanksDict[playerID]
+ for i, thanks in enumerate(playerThanksList):
+ if GUID == thanks.GUID:
+ delNoThanksCount += 1
+ playerThanksList.pop(i)
+ #GameWorld.DebugLog(" 移除未感谢的数据: i=%s,GUID=%s,len=%s" % (i, thanks.GUID, len(playerThanksList)))
+ break
+
+ for assistPlayerID in assistPlayerIDList:
+ if assistPlayerID not in assistThanksMgr.assistPlayerThanksDict:
+ continue
+ assistThanksList = assistThanksMgr.assistPlayerThanksDict[assistPlayerID]
+ for i, thanks in enumerate(assistThanksList):
+ if GUID == thanks.GUID:
+ delUnGetThanksCount += 1
+ assistThanksList.pop(i)
+ #GameWorld.DebugLog(" 移除未接受感谢的数据: i=%s,GUID=%s,assistPlayerID=%s,len=%s" % (i, thanks.GUID, assistPlayerID, len(assistThanksList)))
+ if assistPlayerID not in syncPlayerIDList:
+ syncPlayerIDList.append(assistPlayerID)
+ break
+
+ playerMgr = GameWorld.GetPlayerManager()
+ for playerID in syncPlayerIDList:
+ assistPlayer = playerMgr.FindPlayerByID(playerID)
+ if assistPlayer:
+ SyncCanGetAssistThanksGiftCount(assistPlayer, isForce=True)
+
+ if removeCountTotal:
+ GameWorld.DebugLog("移除过期的未完结感谢数据: doCount=%s,maxDoCount=%s,removeCountTotal=%s,delNoThanksCount=%s,delUnGetThanksCount=%s,remainCount=%s"
+ % (doCount, maxDoCount, removeCountTotal, delNoThanksCount, delUnGetThanksCount, len(assistThanksMgr.allAssistThanksList)))
+ return
+
def OnPlayerLogin(curPlayer, isTJ=False):
## 玩家上线
@@ -145,6 +201,25 @@
return
+def OnPlayerTeamChange(curPlayer):
+ ## 玩家队伍变更
+
+ if curPlayer.GetTeamID():
+ return
+ playerID = curPlayer.GetPlayerID()
+
+ assistMgr = PyDataManager.GetPlayerAssistPyManager()
+ if playerID not in assistMgr.playerNoSaveDBAssistDict:
+ return
+ playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+
+ for assistObj in playerAssistList[::-1]:
+ gameMap = GameWorld.GetMap(assistObj.MapID)
+ if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam:
+ OnCancelPlayerRequestAssist(assistObj, "LeaveTeam", True)
+
+ return
+
def OnInitAssistData(dbData, isSaveDB):
## 加载协助数据额外处理
setattr(dbData, "IsSaveDB", isSaveDB) # 是否保存数据库,离线可协助的需要存库,如挖矿类
@@ -229,7 +304,10 @@
if not playerMap:
return
if playerMap.GetMapFBType() != ChConfig.fbtNull:
- playerLineID = curPlayer.GetFBID()
+ if mapID == ChConfig.Def_FBMapID_SealDemon:
+ playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
+ else:
+ playerLineID = curPlayer.GetFBID()
if playerMapID != mapID or playerLineID != lineID:
#副本中无法协助
PlayerControl.NotifyCode(curPlayer, "AssistFBLimit")
@@ -335,13 +413,6 @@
NetPackCommon.SendFakePack(assistPlayer, assistPack)
return
-def SetPlayerStartAssistTeamFB(curPlayer, queryData):
- ## 开始协助组队副本 - 玩家进入副本后才真正进入协助状态
-
- #mapID, lineID, tagPlayerID = queryData
-
- return
-
def MapServer_PlayerAssistLogic(curPlayer, msgList, tick):
## 地图同步的协助信息逻辑处理
@@ -403,7 +474,18 @@
# 开始协助组队副本
elif queryType == "OnStartAssistTeamFB":
- SetPlayerStartAssistTeamFB(curPlayer, queryData)
+ mapID, lineID, tagPlayerID = queryData
+ GameWorld.DebugLog(" 开始协助副本: mapID=%s,lineID=%s,tagPlayerID=%s" % (mapID, lineID, tagPlayerID), playerID)
+ # 副本协助暂时只处理设置协助目标ID
+ PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
+ return
+
+ # 取消协助组队副本
+ elif queryType == "OnCancelAssistTeamFB":
+ mapID, lineID, reason = queryData
+ GameWorld.DebugLog(" 开始协助副本: mapID=%s,lineID=%s,reason=%s" % (mapID, lineID, reason), playerID)
+ # 副本协助暂时只处理设置协助目标ID
+ PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
return
#QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result)
@@ -427,8 +509,8 @@
playerID = curPlayer.GetPlayerID()
- assistObj = None
- addNewAssist = True
+ reqAssistObj = None
+ addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
if playerID in assistMgr.playerNoSaveDBAssistDict:
playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
@@ -438,17 +520,18 @@
if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID:
OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True)
else:
- addNewAssist = False
+ reqAssistObj = assistObj
break
- if addNewAssist:
- assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
+ if not reqAssistObj:
+ addNewAssist = True
+ reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
- if not assistObj:
+ if not reqAssistObj:
return
# 通知本仙盟玩家
- PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
+ PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
# 求助信息已发送,请等待盟友支援
PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
@@ -471,7 +554,7 @@
playerID = curPlayer.GetPlayerID()
- assistObj = None
+ reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
if playerID in assistMgr.playerNoSaveDBAssistDict:
@@ -481,19 +564,19 @@
continue
if mapID != assistObj.MapID or lineID != assistObj.LineID:
OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistTeamFB", True)
- addNewAssist = True
- break
- else:
+ else:
+ reqAssistObj = assistObj
+ break
+
+ if not reqAssistObj:
addNewAssist = True
+ reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
- if addNewAssist:
- assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
-
- if not assistObj:
+ if not reqAssistObj:
return
# 通知本仙盟玩家
- PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
+ PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
# 求助信息已发送,请等待盟友支援
PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
# 广播仙盟请求
@@ -551,6 +634,7 @@
for assistObj in familyAssistList:
assistInfo = ChPyNetSendPack.tagGCAssistInfo()
assistInfo.AssistGUID = assistObj.GUID
+ assistInfo.PlayerID = assistObj.PlayerID
assistInfo.PlayerName = assistObj.PlayerName
assistInfo.Job = assistObj.Job
assistInfo.LV = assistObj.LV
@@ -606,8 +690,6 @@
if assistObj in playerAssistList:
playerAssistList.remove(assistObj)
- SyncFamilyClearAssist(familyID, assistGUID)
-
# 取消boss协助
if assistType == AssistType_Boss:
@@ -628,6 +710,8 @@
# 暂不需要处理
pass
+ # 放最后
+ SyncFamilyClearAssist(familyID, assistGUID)
return
def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -663,7 +747,14 @@
assistObj.AssistPlayerIDList.remove(cancelPlayerID)
if cancelPlayer:
+ isTagPlayerReason = reason.startswith("RequestPlayerCancel_")
PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0)
+ overPack = ChPyNetSendPack.tagGCAssistOver()
+ overPack.IsTagPlayerReason = isTagPlayerReason
+ overPack.Reason = reason[len("RequestPlayerCancel_"):] if isTagPlayerReason else reason
+ overPack.ReasonLen = len(overPack.Reason)
+ overPack.AssistGUID = assistGUID
+ NetPackCommon.SendFakePack(cancelPlayer, overPack)
# 取消boss协助
if assistObj.AssistType == AssistType_Boss:
@@ -778,23 +869,29 @@
playerID = curPlayer.GetPlayerID()
assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ useThanks = None
if playerID not in assistThanksMgr.playerThanksDict:
GameWorld.ErrLog("玩家没有可使用的协助感谢礼盒!", playerID)
- return
- useThanks = None
- playerThanksList = assistThanksMgr.playerThanksDict[playerID]
- for thanks in playerThanksList:
- if itemID == thanks.ItemID:
- useThanks = thanks
- break
+ else:
+ playerThanksList = assistThanksMgr.playerThanksDict[playerID]
+ for thanks in playerThanksList:
+ if itemID == thanks.ItemID:
+ useThanks = thanks
+ break
if not useThanks:
GameWorld.ErrLog("玩家没有该协助感谢礼盒!itemID=%s" % (itemID), playerID)
- return
+ #20210226 优化为找不到协助信息也可以使用,防止地图扣除物品失败导致协助礼盒一直留着而无法使用
+ #return
GameWorld.DebugLog("玩家使用协助感谢礼盒!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID)
# 预览
if isPreview:
previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview()
+ if not useThanks:
+ previewPack.ItemID = itemID
+ previewPack.MapID = 31140 # 暂随意给一个可协助的地图ID
+ NetPackCommon.SendFakePack(curPlayer, previewPack)
+ return
previewPack.ItemID = useThanks.ItemID
previewPack.MapID = useThanks.MapID
previewPack.LineID = useThanks.LineID
@@ -819,12 +916,15 @@
ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
if not ipyData:
return
-
- useThanks.ThanksState = 1 # 设置为已感谢
- playerThanksList.remove(useThanks) # 移除已感谢
+
queryData = [itemID]
QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData)
+ if not useThanks:
+ return
+ useThanks.ThanksState = 1 # 设置为已感谢
+ playerThanksList.remove(useThanks) # 移除已感谢
+
# 通知协助玩家可接收的感谢个数
playerMgr = GameWorld.GetPlayerManager()
for assistPlayerID in useThanks.AssistPlayerDict.keys():
--
Gitblit v1.8.0