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