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