From 77c10c032db0be7e93657c450d90c580b1175ca3 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 23 五月 2022 17:02:03 +0800 Subject: [PATCH] 9415 【BT】【后端】古神战场(增加可根据地图配置某些被动技能功能分类无效) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 222 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 182 insertions(+), 40 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py index eb5faa8..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): ## 地图同步的协助信息逻辑处理 @@ -389,6 +460,11 @@ __DoBossAssistOver(queryData) return + # 副本协助结束 + elif queryType == "OnFBAssistOver": + __DoFBAssistOver(queryData) + return + ## ------------------------------------------------------------------------------------------- # 请求协助组队副本 @@ -398,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) @@ -418,12 +505,12 @@ familyID = curPlayer.GetFamilyID() if not familyID: return - mapID, lineID, npcID, objID = queryData + mapID, lineID, npcID, objID, npcLV = queryData playerID = curPlayer.GetPlayerID() - assistObj = None - addNewAssist = True + reqAssistObj = None + addNewAssist = False assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerNoSaveDBAssistDict: playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID] @@ -433,19 +520,28 @@ 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") + + # 广播仙盟请求 + requestCount = 1 + if not addNewAssist: + requestCount = min(curPlayer.GetDictByKey("AssistBossRequestCount") + 1, 999) + curPlayer.SetDict("AssistBossRequestCount", requestCount) + notifyNum = (requestCount - 1) % 3 + PlayerControl.FamilyNotify(familyID, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID]) return def __DoRequestAssistTeamFB(curPlayer, queryData): @@ -458,7 +554,7 @@ playerID = curPlayer.GetPlayerID() - assistObj = None + reqAssistObj = None addNewAssist = False assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerNoSaveDBAssistDict: @@ -468,21 +564,28 @@ 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") + # 广播仙盟请求 + requestCount = 1 + if not addNewAssist: + requestCount = min(curPlayer.GetDictByKey("AssistFBRequestCount") + 1, 999) + curPlayer.SetDict("AssistFBRequestCount", requestCount) + notifyNum = (requestCount - 1) % 3 + PlayerControl.FamilyNotify(familyID, "AssistFBRequest%s" % notifyNum, [curPlayer.GetName(), mapID]) return def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0): @@ -531,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 @@ -586,8 +690,6 @@ if assistObj in playerAssistList: playerAssistList.remove(assistObj) - SyncFamilyClearAssist(familyID, assistGUID) - # 取消boss协助 if assistType == AssistType_Boss: @@ -608,6 +710,8 @@ # 暂不需要处理 pass + # 放最后 + SyncFamilyClearAssist(familyID, assistGUID) return def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True): @@ -643,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: @@ -678,7 +789,7 @@ OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False) break - if not assistAwardResult: + if not assistAwardItemID or not assistAwardResult: return # 新增感谢数据 @@ -688,6 +799,28 @@ if not curPlayer: continue AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID) + + return + +def __DoFBAssistOver(queryData): + ## 副本协助结束 + mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData + assistMgr = PyDataManager.GetPlayerAssistPyManager() + if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict: + return + playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID] + for assistObj in playerAssistList: + if assistObj.MapID == mapID and assistObj.LineID == lineID: + OnCancelPlayerRequestAssist(assistObj, "FBAssistOver", False) + break + + if not assistAwardItemID or not assistPlayerDict: + return + + # 新增感谢数据 + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(noAssistPlayerID) + if curPlayer: + AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict) return @@ -736,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 @@ -777,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