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