From b746c6a7da1ade34085c20e2512dd67683564359 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 30 五月 2025 12:08:30 +0800
Subject: [PATCH] 16 卡牌服务端(旧版由地图直接发送的邮件兼容到新版发送邮件;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py      |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py                |   10 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py         |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                      |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py               |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py        |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py            |  184 +--------------------------------------------
 8 files changed, 11 insertions(+), 193 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py
index 1b427db..70b3220 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/BossHurtMng.py
@@ -306,7 +306,7 @@
                     order = prizeIndex + 1
                     mailContent = content % (bossID, order)
                     giveItemList = awardDict[prizeOrder]
-                    PlayerControl.SendMail(title, mailContent, getDays, [playerID], giveItemList)
+                    #删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
                     GameWorld.Log("    SendMail order=%s,playerID=%s,giveItemList=%s,isFB=%s" 
                                   % (order, playerID, str(giveItemList), isFB))
                     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
index ef70556..43a085b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -160,7 +160,7 @@
             GameWorld.Log("发送未拾取的物品给玩家: %s" % mailItemList, ownerID)
             if isCrossServer:
                 serverGroupID = playerServerGroupIDDict.get(ownerID, 0)
-                PlayerControl.SendCrossMail(serverGroupID, "ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
+                # 删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
             else:
                 PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
index 38d6d55..9834fa0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
@@ -110,8 +110,6 @@
         PlayerEventCounter.PlayerOnYear(curPlayer)
         Set_PlayerGameServerInitOK_OnYear(curPlayer, 0)
         
-    #邮件
-    PlayerControl.SendUnLoginOKPlayerMailCache(curPlayer)
     #刷新排行榜称号
     #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
index 0bef5fa..ab42ae1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
@@ -282,7 +282,7 @@
     if entireMailItemList:
         getDays, limitLV, limitLVType = IpyGameDataPY.GetFuncEvalCfg("BossRebornServerBoss", 4)
         paramList = [npcID]
-        PlayerControl.SendEntireMail("BossRebornActionBossAll", getDays, limitLV, limitLVType, entireMailItemList, paramList)
+        #删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
         
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index e1bc3fc..997db21 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -99,6 +99,7 @@
 import PlayerCharm
 import PlayerTask
 import PlayerFace
+import PlayerMail
 import ChPlayer
 import GMShell
 import GameObj
@@ -338,189 +339,16 @@
 
 #---------------------------------------------------------------------
 def SendMailBatch(mailTypeKey, batchPlayerIDList, batchAddItemList=[], batchParamList=[], batchGold=[], batchGoldPaper=[], batchSilver=[], batchDetail=[], moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
-    '''批量发送邮件, 用于瞬间需要发送多封(大量)邮件的,比如一些公共副本活动等结算时
-    @param mailTypeKey: 邮件模板key
-    @param batchPlayerIDList: [playerIDList, playerIDList, ...]
-    @param batchAddItemList: [addItemList, addItemList, ...]
-    @param batchParamList: [paramList, paramList, ...]
-    @param batchGold: [batchGold, batchGold, ...]
-    @param batchGoldPaper: [batchGoldPaper, batchGoldPaper, ...]
-    @param batchSilver: [batchSilver, batchSilver, ...]
-    @param batchDetail: [记录邮件流向用, ...]
-    @param moneySource: 货币来源
-    '''
-    
-    copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
-    for i, playerIDList in enumerate(batchPlayerIDList):
-        for playerID in playerIDList[::-1]:
-            curPlayer = copyMapPlayerManager.FindPlayerByID(playerID)
-            if curPlayer and not curPlayer.GetGameServerInitOK():
-                bAddItemList = [batchAddItemList[i]] if len(batchAddItemList) > i else []
-                bParamList = [batchParamList[i]] if len(batchParamList) > i else []
-                bGold = [batchGold[i]] if len(batchGold) > i else []
-                bGoldPaper = [batchGoldPaper[i]] if len(batchGoldPaper) > i else []
-                bSilver = [batchSilver[i]] if len(batchSilver) > i else []
-                bDetail = [batchDetail[i]] if len(batchDetail) > i else []
-                AddUnLoginOKPlayerMailCache(playerID, "ByMailTemplate", [mailTypeKey, bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail])
-                playerIDList.pop(playerIDList.index(playerID))
-                continue
-            
-    msgInfo = str([mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver, batchDetail, moneySource, crossMail])
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMailBatch", msgInfo, len(msgInfo))
-    GameWorld.Log("SendMailBatch %s, batchPlayerIDList=%s, batchAddItemList=%s, batchParamList=%s, batchGold=%s, batchGoldPaper=%s, batchSilver=%s" 
-                  % (mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver))
+    ## 删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
+    ## 批量发送邮件的一般是活动类型功能,一般都需要用到GameServer
+    ## 所以暂时不兼容使用新版本发送邮件,等相应功能有需要时再同步修改
     return
 
 def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
-    '''
-    @param detail: 记录邮件流向用
-    '''
-    if not mailTypeKey:
-        mailTypeKey = ShareDefine.DefaultLackSpaceMailType
-    
-    content = "<MailTemplate>%s</MailTemplate>%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
-    SendMail("", content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail)
-    return
-
-def SendCrossMail(serverGroupID, mailTypeKey, playerIDList, addItemList, paramList=[]):
-    ## 发送跨服邮件
-    if not serverGroupID:
-        return
-    dataMsg = {"MailTypeKey":mailTypeKey, "Player":playerIDList}
-    if addItemList:
-        dataMsg["Item"] = CombineMailItem(addItemList)
-    if paramList:
-        dataMsg["Param"] = paramList
-    GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_SendMail, dataMsg, [serverGroupID])
-    return
-
-def SendEntireMail(mailTypeKey, getDays, limitLV, limitLVType, addItemList=[], paramList=[], \
-                   gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail):
-    ''' 发送全服邮件
-    @param mailTypeKey: 邮件模板key
-    @param getDays: 有效天数
-    @param limitLV: 领取最低等级限制
-    @param limitLVType: 等级不足的升级后是否可领 0-不可,1-可以
-    '''
-    
-    # 有效天数限制
-    if not mailTypeKey or getDays <= 0:
-        return
-    
-    # 跨服服务器不允许发送邮件
-    if GameWorld.IsCrossServer():
-        return
-    
-    combineItemList = CombineMailItem(addItemList)
-    cmdList = [mailTypeKey, getDays, limitLV, limitLVType, combineItemList, paramList, gold, goldPaper, silver, detail, moneySource]
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendEntireMail", '%s' % (cmdList), len(str(cmdList)))
-    GameWorld.Log("发送全服邮件: %s,getDays=%s,limitLV=%s,limitLVType=%s,combineItemList=%s,paramList=%s,gold=%s,goldPaper=%s,silver=%s,detail=%s,moneySource=%s" % 
-                  (mailTypeKey, getDays, limitLV, limitLVType, combineItemList, paramList, gold, goldPaper, silver, detail, moneySource))
-    return
-
-## 功能发放物品补偿/奖励邮件
-#  @param addItemList [(itemID, itemCnt, 是否拍品), {或物品信息字典}, ...]
-#  @return
-def SendMail(title, content, getDays, playerIDList, addItemList, gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
-    if not playerIDList:
-        return
-    
-#    if not addItemList:
-#        return
-    
-    # 有效天数限制
-    if getDays <= 0:
-        return
-    
-    # 跨服服务器不允许发送邮件
-    if GameWorld.IsCrossServer() and not crossMail:
-        return
-    
-    sendPlayerIDList = []
-    copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
+    ## 函数先保留,之后功能直接使用 PlayerMail.SendMailByKey
     for playerID in playerIDList:
-        curPlayer = copyMapPlayerManager.FindPlayerByID(playerID)
-        if curPlayer and not curPlayer.GetGameServerInitOK():
-            AddUnLoginOKPlayerMailCache(playerID, "ByMailContent", [title, content, getDays, addItemList, gold, goldPaper, silver, detail, moneySource])
-            continue
-        sendPlayerIDList.append(playerID)
-        
-    combineItemList = CombineMailItem(addItemList)
-    cmdList = [title, content, getDays, sendPlayerIDList, combineItemList, gold, goldPaper, silver, detail, moneySource, crossMail]
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMail", '%s' % (cmdList), len(str(cmdList)))
-    return True
-
-def AddUnLoginOKPlayerMailCache(playerID, cacheType, mailInfo):
-    ''' 添加未登录成功的玩家个人邮件发送缓存
-    '''
-    if playerID not in PyGameData.g_unLoginOKPlayerMailInfo:
-        PyGameData.g_unLoginOKPlayerMailInfo[playerID] = []
-    mailList = PyGameData.g_unLoginOKPlayerMailInfo[playerID]
-    if [cacheType, mailInfo] in mailList:
-        GameWorld.Log("###重复添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 不添加! mailCount=%s, mailInfo=%s" 
-                      % (len(mailList), str(mailInfo)), playerID)
-        return
-    if len(mailList) >= 30: # 做个限制,防止出问题刷邮件
-        GameWorld.Log("###限制添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 超出最大可添加数,不添加! mailCount=%s, mailInfo=%s" 
-                      % (len(mailList), str(mailInfo)), playerID)
-        return
-    mailList.append([cacheType, mailInfo])
-    # curPlayer.GetGameServerInitOK()
-    GameWorld.Log("添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 等待发送! mailCount=%s, mailInfo=%s" 
-                  % (len(mailList), str(mailInfo)), playerID)
+        PlayerMail.SendMailByKey(mailTypeKey, playerID, addItemList, paramList)
     return
-
-def SendUnLoginOKPlayerMailCache(curPlayer):
-    ## 未登录成功的玩家个人邮件发送缓存  - 登录成功后处理
-    if not curPlayer.GetGameServerInitOK():
-        return
-    playerID = curPlayer.GetPlayerID()
-    if playerID not in PyGameData.g_unLoginOKPlayerMailInfo:
-        return
-    mailList = PyGameData.g_unLoginOKPlayerMailInfo.pop(playerID)
-    for cacheType, mailInfo in mailList:
-        playerIDList = [playerID]
-        GameWorld.Log("发送未登录成功时缓存的待发送邮件! cacheType=%s, mailInfo=%s" % (cacheType, str(mailInfo)), playerID)
-        if cacheType == "ByMailContent":
-            title, content, getDays, addItemList, gold, goldPaper, silver, detail, moneySource = mailInfo
-            SendMail(title, content, getDays, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource)
-        elif cacheType == "ByMailTemplate":
-            mailTypeKey, bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail = mailInfo
-            SendMailBatch(mailTypeKey, [playerIDList], bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail)
-    return
-
-def CombineMailItem(addItemList):
-    ## 合并邮件物品
-    itemCountDict = {}
-    combineItemList = [] # 合并后的物品列表
-    for mailItem in addItemList:
-        if isinstance(mailItem, dict):
-            combineItemList.append(mailItem)
-            continue
-        
-        if len(mailItem) != 3:
-            continue
-        
-        itemID, itemCnt, isAuctionItem = mailItem
-        
-        if ItemControler.GetAppointItemRealID(itemID):
-            # 定制物品转化为物品信息字典
-            appointItemObj = ItemControler.GetItemByData(ItemControler.GetAppointItemDictData(itemID, isAuctionItem))
-            if not appointItemObj:
-                GameWorld.ErrLog("邮件定制物品转化失败!itemID, itemCnt, isAuctionItem" % (itemID, itemCnt, isAuctionItem))
-                continue
-            combineItemList.append(ItemCommon.GetMailItemDict(appointItemObj))
-            appointItemObj.Clear()
-        elif isAuctionItem:
-            combineItemList.append((itemID, itemCnt, isAuctionItem))
-        else:
-            key = (itemID, isAuctionItem)
-            itemCountDict[key] = itemCountDict.get(key, 0) + itemCnt
-            
-    for key, itemCnt in itemCountDict.items():
-        itemID, isAuctionItem = key
-        combineItemList.append((itemID, itemCnt, isAuctionItem))
-    return combineItemList
 
 ## 构建系统提示参数列表
 #  @param msgParamList 信息参数列表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py
index 0d938da..c6118c8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py
@@ -171,6 +171,7 @@
 
 def SendSeverMail(guid, title, text, itemList=None, limitDays=7, mailType=0, limitLV=0, limitLVType=0, checkState=0):
     '''发送全服邮件
+    @param guid: 可传入空,则系统自动生成guid
     @param limitLV: 限制可领的最低等级
     @param limitLVType: 等级达到后是否可领,默认不可
     @param checkState: 是否需要审核,默认不需要
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
index 330aaad..c0cfcad 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
@@ -195,20 +195,12 @@
     for itemid, cnt, isBind in itemList:
         ItemControler.GivePlayerItem(curPlayer, int(itemid), int(cnt), 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere], 
                                      event=["BuyVIPGift", False, {"VIPLV":vipLV}])
-#    else:
-#        __AwardToPlayerByMail(curPlayer, itemList)
+        
     ItemControler.NotifyGiveAwardInfo(curPlayer, itemList, "BuyVIPGift")
     openuiid = IpyGameDataPY.GetFuncEvalCfg('VIPPanel', 1, {}).get(vipLV, 0)
     PlayerControl.WorldNotify(0, 'BuyVIPGift', [curPlayer.GetName(), vipLV, itemList[0][0], openuiid])
     Sycn_VIPAwardRecord(curPlayer)
     return
-
-#发邮件
-def __AwardToPlayerByMail(curPlayer, mailItemInfoList):
-    MailMessage = GetMailMessage()
-    content = ShareDefine.Def_MailFormat % (MailMessage[0], '')
-    getDays = MailMessage[1]
-    PlayerControl.SendMail('', content, getDays, [curPlayer.GetPlayerID()], mailItemInfoList) 
 
 ##VIP登录处理
 #  @param curPlayer
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 3682eb3..a4e7f38 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -57,7 +57,6 @@
 g_teamPlayerDict = {} # 地图队伍对应玩家ID列表,含离线玩家 {teamID:[playerID, ...], ...}
 g_teamPlayerInfoDict = {} # 地图队伍对应玩家ID信息 {teamID:{playerID:{k:v, ...}, ...}
 
-g_unLoginOKPlayerMailInfo = {} # GameServer 未登录成功前需要发送的邮件缓存,防止登录失败不存db导致重复发送邮件 {playerID:[[待发送邮件内容信息], ...], ...}
 g_disconnectPlayer = {} # 在本地图离线的玩家信息 {playerID:[tick, posX, posY], ...}
 g_lastExitFBType = {} # 最后一个离开副本信息 {fbIndex:[exitType, tick], ...} exitType: 1-掉线,2-主动退出
 

--
Gitblit v1.8.0