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/Player/PlayerControl.py |  184 +--------------------------------------------
 1 files changed, 6 insertions(+), 178 deletions(-)

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 信息参数列表

--
Gitblit v1.8.0