From 033d6bd1a503105552a0064a83bf2ebdf8dc51f5 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 25 十一月 2023 18:33:14 +0800 Subject: [PATCH] 10016 【主干】【港台】【砍树】领取邮件物品后服务端不主动删除邮件 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py | 90 +++++++++++++++++++++++++++++++++------------ 1 files changed, 66 insertions(+), 24 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py index 0a823ba..a7b31dd 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCompensation.py @@ -43,13 +43,14 @@ import math import json #领取状态 个位数标识 (可领取即已通知过玩家该封邮件,需要在邮件发生时和上线时设置状态 -#0 未通知,1 不可领取, 2 可领取, 3 已领取 +#0 未通知,1 不可领取, 2 可领取, 3 已领取,4 已删除 ( Unknown_State, Disable_State, Enable_State, -Yet_State -) = range(4) +Yet_State, +Del_State +) = range(5) CheckState_OK = 0 # 已审核 CheckState_No = 1 # 未审核 @@ -956,6 +957,11 @@ def SetPrizeState(curPlayerID, GUID, prizeState, readState): state = readState*10 + prizeState GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, state) + return + +def GetPrizeGetState(curPlayerID, GUID): + ## 获取领取状态 + return GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) % 10 ##查找玩家可领取的补偿列表 # @param curPlayer @@ -992,9 +998,9 @@ states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, curRequire.GUID) readState = states/10 # 可读 curState = states%10 # 领取状态 - if curState in (Disable_State, Yet_State): + if curState in (Disable_State, Del_State): #不可领 或 已领 - + #GameWorld.DebugLog("该玩家当前全服邮件状态不下发: curState=%s,GUID=%s" % (curState, curRequire.GUID), curPlayerID) continue limitTime = datetime.datetime.strptime(curRequire.LimitTime, ChConfig.TYPE_Time_Format) @@ -1026,7 +1032,7 @@ continue #可以用的奖励 - if Enable_State != curState: + if Enable_State != curState and curState != Yet_State: SetPrizeState(curPlayerID, curRequire.GUID, Enable_State, readState) allList.append((curRequire.GUID, curRequire.Text, curRequire.CreateTime, curRequire.Gold, curRequire.GoldPaper, curRequire.Silver)) @@ -1049,7 +1055,11 @@ subPack.Gold = gold subPack.GoldPaper = goldPaper subPack.Silver = silver - subPack.IsRead = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayer.GetPlayerID(), GUID)/10 + resState = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayer.GetPlayerID(), GUID) + if resState % 10 == Yet_State: + subPack.IsRead = Yet_State # 已领取 + else: + subPack.IsRead = resState / 10 # 是否已读 for index in xrange(curGUIDItemCount): curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, index) subPackItem = ChPyNetSendPack.tagGCCompensationItem() @@ -1063,6 +1073,24 @@ sendPack.PackList.append(subPack) sendPack.Count = len(sendPack.PackList) NetPackCommon.SendFakePack(curPlayer, sendPack) + return + +def SyncQueryCompensationResultByGUID(curPlayer, notifyGUIDList): + curPlayerID = curPlayer.GetPlayerID() + notifyList = [] + compensationMgr = GameWorld.GetCompensationMgr() + for GUID in notifyGUIDList: + findCompensation = compensationMgr.FindPersonalCompensation(curPlayerID, GUID) + if findCompensation.PlayerID != curPlayerID: + findCompensation = compensationMgr.FindEntireCompensation(GUID) + if findCompensation.GUID != GUID: + # 找不到邮件 + continue + notifyList.append((findCompensation.GUID, findCompensation.Text, findCompensation.CreateTime, + findCompensation.Gold, findCompensation.GoldPaper, findCompensation.Silver)) + if not notifyList: + return + SyncQueryCompensationResult(curPlayer, notifyList) return ##03 03 玩家请求领取补偿#tagMGRequestCompensation @@ -1085,7 +1113,7 @@ GameWorld.DebugLog("Compensation### OnMGRequestCompensation myPlayerID %s GUID %s"%(myPlayerID, GUID)) compensationType, curEntireRequire = CheckRequestCompensation(curPlayer, GUID) - if compensationType == Unknow_CompensationType: + if compensationType == Unknow_CompensationType or not curEntireRequire: #领取失败 curPlayer.SetDict(Def_RequestState, 0)#解锁 GameWorld.DebugLog("Compensation### OnMGRequestCompensation no found") @@ -1108,6 +1136,15 @@ def CheckRequestCompensation(curPlayer, GUID, isPersonnal = True): curPlayerID = curPlayer.GetID() + states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) + readState = states/10 # 可读 + curState = states%10 # 领取状态 + + if curState in (Disable_State, Yet_State, Del_State): + #不可领 或 已领 + #GameWorld.DebugLog("当前邮件不可领取或已领: states=%s,curState=%s,GUID=%s" % (states, curState, GUID), curPlayerID) + return Unknow_CompensationType, None + if isPersonnal: #在个人补偿中 curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID) @@ -1117,13 +1154,6 @@ #--------- #在全服补偿中 - states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) - readState = states/10 # 可读 - curState = states%10 # 领取状态 - - if curState in (Disable_State, Yet_State): - #不可领 或 已领 - return Unknow_CompensationType, None curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID != GUID: #不再全服补偿中,删除记录 @@ -1230,15 +1260,20 @@ ##玩家领取补偿物品发放成功 # @param curPlayer, GUID # @return None -def GiveCompensationSuccess(curPlayer, GUID, CompensationType): +def GiveCompensationSuccess(curPlayer, GUID, CompensationType, isDel=False): curPlayerID = curPlayer.GetID() - NotifyCompensationResult(curPlayer, GUID, 1) - + SetPrizeState(curPlayerID, GUID, Yet_State, Read_State_Yes) # 设置为已领取 #流向记录 DataRecordPack.DR_GiveCompensationSuccess(curPlayerID, GUID) + if not isDel: + SyncQueryCompensationResultByGUID(curPlayer, [GUID]) + return + + NotifyCompensationResult(curPlayer, GUID, 1) + #全服奖励领取记录变更为已领取 if CompensationType == Entire_CompensationType: - GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, 10 + Yet_State) + SetPrizeState(curPlayerID, GUID, Del_State, Read_State_Yes) return #个人奖励领取条目执行删除 if CompensationType == Personal_CompensationType: @@ -1289,7 +1324,7 @@ mailText = curMail.Text # 通知类模板邮件,过天可直接删除 - if tempSign in mailText and tempSignEnd in mailText and CheckCanDelCompensation(curMail, curMail.GUID): + if tempSign in mailText and tempSignEnd in mailText and CheckCanDelCompensation(curMail, curMail.GUID, curMail.PlayerID): tempKey = mailText[mailText.index(tempSign) + len(tempSign):mailText.index(tempSignEnd)] notClearMailKeyList = IpyGameDataPY.GetFuncEvalCfg("MailSet", 1) if tempKey not in notClearMailKeyList: @@ -1373,8 +1408,9 @@ #在个人补偿中 curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID) if curPersonalCompensation.PlayerID == curPlayerID: - if not CheckCanDelCompensation(curPersonalCompensation, GUID): + if not CheckCanDelCompensation(curPersonalCompensation, GUID, curPlayerID): #有附件不可删除 + GameWorld.DebugLog("该个人邮件不可删除: %s" % GUID, curPlayerID) NotifyCompensationResult(curPlayer, GUID, 0) return @@ -1393,12 +1429,13 @@ #全服邮件 curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID == GUID: - if not CheckCanDelCompensation(curEntireRequire, GUID): + if not CheckCanDelCompensation(curEntireRequire, GUID, curPlayerID): #有附件不可删除 + GameWorld.DebugLog("该全服邮件不可删除: %s" % GUID, curPlayerID) NotifyCompensationResult(curPlayer, GUID, 0) return - SetPrizeState(curPlayerID, GUID, Disable_State, GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)/10) + SetPrizeState(curPlayerID, GUID, Del_State, GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)/10) NotifyCompensationResult(curPlayer, GUID, 1) #GameWorld.DebugLog("全服邮件OnDelCompensation:%s"%GUID) return @@ -1406,7 +1443,12 @@ NotifyCompensationResult(curPlayer, GUID, 0) # 有附件的情况玩家不可主动删除邮件,避免误操作;系统可删除不用调用此接口 -def CheckCanDelCompensation(mailObj, GUID): +def CheckCanDelCompensation(mailObj, GUID, playerID=0): + if playerID: + if GetPrizeGetState(playerID, GUID) == Yet_State: + #GameWorld.DebugLog("已领取的邮件可删除: %s" % GUID, playerID) + return True + if mailObj.Gold or mailObj.GoldPaper or mailObj.Silver: # 有附加货币不可删除 return False -- Gitblit v1.8.0