From 47ac7f315d4495557d92116cb494af8085e6a60c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 25 二月 2025 11:12:46 +0800 Subject: [PATCH] 1111 【越南】【英语】【BT】【砍树】增加任务判断X阶装备强化是否全部满级(修复判断bug); --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py | 175 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 129 insertions(+), 46 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py index d8a56ce..28611ad 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py @@ -24,7 +24,7 @@ import PlayerControl import PyDataManager import time - +import json # VIP权限 Def_Onoff_VIPCount = 5 ( @@ -37,9 +37,18 @@ #非VIP权限 Def_GeTui_FMT = -2 # 封魔坛 +Def_GeTui_ZhuXianBoss = -3 # 诛仙BOSS # 新玩家还没有脱机时间 有利于挽回流失玩家 g_NewGuyNoTJGTime = {} # {playerID:[playername,getuiid, tick]} + +g_FMTGeTuiLimit = {} # 封魔坛推送限制 过于频繁控制下短时间通知 + +def ClearFMTGeTuiLimit(): + global g_FMTGeTuiLimit + g_FMTGeTuiLimit = {} + + def GetTimeLimit(timeStr): # 检查格式后转数字 @@ -77,21 +86,13 @@ # 检查是否可以个推,geTuiType小于0的代表默认可推,无VIP限制 def CheckCanGeTui(playerCache, geTuiType=-1): - if not playerCache.get("GeTuiClientID", ""): - return False - - # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID - if not playerCache.get("Time", 0): - return False - if time.time() - playerCache.get("Time", 0) > 24*60*60: - return False if not playerCache.get("VIPLV", 0): if geTuiType < 0: return True return False - if geTuiType == Def_GeTui_FMT: + if geTuiType in [Def_GeTui_FMT, Def_GeTui_ZhuXianBoss]: # 封魔坛受VIP的关注BOSS开关影响 geTuiType = Def_Onoff_Boss @@ -149,22 +150,19 @@ # 服务端群推暂不由游戏服务器推送,可从第三方个推网站推送 # 游戏服务器只推送具有变化性的内容 # 支持单推和多人推送 -# getuiIDList 玩家个推ID -# playerNameList 如果存在则必须与getuiIDList一一对应,若不存在则是多推,若存在则会一一单推 +# appIDDict 混服使用对应不同key {平台ID:[[玩家个推ID, 玩家名],[玩家个推ID2, 玩家名2]。。。]} +# 如果玩家名存在则必须与个推ID一一对应,若不存在则是多推,若存在则会一一单推 # 带名字会被组合成 格式如【玩家名】您关注的BOSSxx已复活 # EventReport_EventReport 向游戏服务器的个推小程序发送 webbottle -def GeTuiNotify(getuiIDList, playerNameList, notifyMsg): - if type(getuiIDList) != list: +def GeTuiNotify(appIDDict, notifyMsg): + if not appIDDict: return - osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName") + #osName = ReadChConfig.GetPyMongoConfig("GeTui", "OSName") 混服无法配置系统 geTuiUrl = ReadChConfig.GetPyMongoConfig("GeTui", "GeTuiUrl") - playerNames = "|".join(playerNameList) #组合成字符串发送 - getuiIDs = "|".join(getuiIDList) - + playerInfo = json.dumps(appIDDict, ensure_ascii=False) #含中文部分要urlencode - postInfo = urllib.urlencode({"PlayerName": playerNames, "NotifyMsg":notifyMsg, - "RegID":getuiIDs, "OSName":osName}) + postInfo = urllib.urlencode({"PlayerInfo": playerInfo, "NotifyMsg":notifyMsg}) GameWorld.GetGameWorld().EventReport_EventReport(postInfo, "", "", "", 1, geTuiUrl) return @@ -209,40 +207,114 @@ return + + +# 判断BOSS剩余次数, 避免通知频繁 +# 注意玩家次数用完第二天未上线则不会同步BOSS次数,则不推送 +def CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict): + global g_FMTGeTuiLimit + + if geTuiType == Def_GeTui_FMT: + if not cacheDict.get("CntMark_%s"%ChConfig.Def_FBMapID_SealDemon, 0): + return False + + # 封魔坛比较频繁默认1小时通知一次 + if playerID not in g_FMTGeTuiLimit: + g_FMTGeTuiLimit[playerID] = {} + + lastTime = g_FMTGeTuiLimit[playerID].get(bossID, 0) + if lastTime != 0 and time.time() - lastTime < 3600: + # 离上次通知还没超过1小时 + return False + + g_FMTGeTuiLimit[playerID][bossID] = int(time.time()) + elif geTuiType == Def_GeTui_ZhuXianBoss: + if not cacheDict.get("CntMark_%s"%ChConfig.Def_FBMapID_ZhuXianBoss, 0): + return False + + # 比较频繁默认1小时通知一次 + if playerID not in g_FMTGeTuiLimit: + g_FMTGeTuiLimit[playerID] = {} + + lastTime = g_FMTGeTuiLimit[playerID].get(bossID, 0) + if lastTime != 0 and time.time() - lastTime < 3600: + # 离上次通知还没超过1小时 + return False + + g_FMTGeTuiLimit[playerID][bossID] = int(time.time()) + + elif geTuiType == Def_Onoff_Boss: + #重生boss + killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 1, {}) + for bidlist, bkey in killBossCntLimitDict.items(): + if bossID not in bidlist: + continue + if not cacheDict.get("CntMark_%s"%bkey, 0): + return False + else: + return True + return True + +# 个推基础判定 +def CanGeTuiByCache(curCache): + if not curCache.GeTuiID: + return False + + # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID + if time.time() - curCache.OffTime > 24*60*60: + return False + return True + def BossAttentionGeTui(bossData, bossID): if bossData.GetMapID() == ChConfig.Def_FBMapID_SealDemon: # 非VIP玩家 封魔坛个推 geTuiType = Def_GeTui_FMT + elif bossData.GetMapID() == ChConfig.Def_FBMapID_ZhuXianBoss: + # 非VIP玩家 诛仙BOSS个推 + geTuiType = Def_GeTui_ZhuXianBoss else: geTuiType = Def_Onoff_Boss #找到关注这只BOSS的玩家 pdict = PyDataManager.GetBossAttentionManager().GetBossAttentionDict() - geTuiIDList = [] - playerNameList = [] - + appIDDict = {} # 混服需要推到不同的个推应用 for playerID, bossAttentionData in pdict.items(): curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer and not PlayerControl.GetIsTJG(curPlayer): continue - - recordDict = eval(bossAttentionData.RecordData) - if recordDict.get(bossID, 0) in [0, 9]: - continue - curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID) + + # 离线玩家 + curCache = PlayerViewCache.FindViewCache(playerID) if not curCache: continue - cacheDict = eval(curCache.GetPropData()) - if not CheckCanGeTui(cacheDict, geTuiType): - # 过滤个推 + + if not CanGeTuiByCache(curCache): + #无推送资格,减少检索和eval continue - geTuiIDList.append(cacheDict.get("GeTuiClientID", "")) - playerNameList.append(cacheDict.get("Name", "")) - + recordDict = eval(bossAttentionData.RecordData) + if recordDict.get(bossID, 0) in [0, 9]: + #0-默认未关注, 1-主动关注, 2-自动关注, 9-主动取消关注 + continue + + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + if not CheckCanGeTui(cacheDict, geTuiType): + # 个推逻辑检查 + continue + + if not CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict): + # 判断BOSS剩余次数, 避免通知频繁 + continue + + appID = cacheDict.get("AppID", "") + if appID not in appIDDict: + appIDDict[appID] = [] + + appIDDict[appID].append([curCache.GeTuiID, cacheDict.get("Name", "")]) + - if not geTuiIDList: + if not appIDDict: return npcName = GameWorld.GetNPCData(bossID).GetNPCName() @@ -250,25 +322,31 @@ if geTuiType == Def_GeTui_FMT: showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 1)%(npcName, npcLV)) # 文字信息 + elif geTuiType == Def_GeTui_ZhuXianBoss: + showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 5)%(npcName, npcLV)) # 文字信息 elif geTuiType == Def_Onoff_Boss: showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 2)%(bossData.GetSourceName(), npcName, npcLV)) # 文字信息 - GeTuiNotify(geTuiIDList, playerNameList, showStr) + GeTuiNotify(appIDDict, showStr) # 私聊 def ChatMiGeTui(playerID, playerName, tagPlayerName): - curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID) + curCache = PlayerViewCache.FindViewCache(playerID) if not curCache: return - cacheDict = eval(curCache.GetPropData()) + if not CanGeTuiByCache(curCache): + #无推送资格,基础判定 + return + + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) if not CheckCanGeTui(cacheDict, Def_Onoff_Chat): # 过滤个推 return showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 3))%(tagPlayerName) # 文字信息 - GeTuiNotify([cacheDict.get("GeTuiClientID", "")], [playerName], showStr) + GeTuiNotify({cacheDict.get("AppID", ""):[[curCache.GeTuiID, playerName]]}, showStr) return # 下线时,低级玩家没有离线时间的玩家提示, 上线清空 @@ -279,7 +357,8 @@ if curPlayer.GetLV() > 100: return playerID = curPlayer.GetID() - g_NewGuyNoTJGTime[playerID] = [curPlayer.GetName(), curPlayer.GetGeTuiClientID(), tick] # curPlayer.GetGeTuiClientID() + g_NewGuyNoTJGTime[playerID] = [curPlayer.GetName(), curPlayer.GetGeTuiClientID(), tick, + GameWorld.GetPlayerPlatform(curPlayer)] # curPlayer.GetGeTuiClientID() return # 上线清除 @@ -299,20 +378,24 @@ global g_NewGuyNoTJGTime playerIDList = [] - geTuiIDs = [] - playerNames = [] + appIDDict = {} + for playerID, getuiInfo in g_NewGuyNoTJGTime.items(): if tick - getuiInfo[2] < 300000: continue playerIDList.append(playerID) - geTuiIDs.append(getuiInfo[1]) - playerNames.append(getuiInfo[0]) + appID = getuiInfo[3] + if appID not in appIDDict: + appIDDict[appID] = [] + + appIDDict[appID].append([getuiInfo[1],getuiInfo[0]]) - if not geTuiIDs: + + if not appIDDict: return showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 4)) # 文字信息 - GeTuiNotify(geTuiIDs, playerNames, showStr) + GeTuiNotify(appIDDict, showStr) for playerID in playerIDList: CleanNewGuyCallBackGeTui(playerID) -- Gitblit v1.8.0