16 卡牌服务端(旧版由地图直接发送的邮件兼容到新版发送邮件;)
| | |
| | | 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))
|
| | |
|
| | |
| | | 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()])
|
| | |
|
| | |
| | | PlayerEventCounter.PlayerOnYear(curPlayer)
|
| | | Set_PlayerGameServerInitOK_OnYear(curPlayer, 0)
|
| | |
|
| | | #邮件
|
| | | PlayerControl.SendUnLoginOKPlayerMailCache(curPlayer)
|
| | | #刷新排行榜称号
|
| | | #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer)
|
| | |
|
| | |
| | | if entireMailItemList:
|
| | | getDays, limitLV, limitLVType = IpyGameDataPY.GetFuncEvalCfg("BossRebornServerBoss", 4)
|
| | | paramList = [npcID]
|
| | | PlayerControl.SendEntireMail("BossRebornActionBossAll", getDays, limitLV, limitLVType, entireMailItemList, paramList)
|
| | | #删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
|
| | |
|
| | | return
|
| | |
|
| | |
| | | import PlayerCharm
|
| | | import PlayerTask
|
| | | import PlayerFace
|
| | | import PlayerMail
|
| | | import ChPlayer
|
| | | import GMShell
|
| | | import GameObj
|
| | |
| | |
|
| | | #---------------------------------------------------------------------
|
| | | 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 信息参数列表
|
| | |
| | |
|
| | | 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: 是否需要审核,默认不需要
|
| | |
| | | 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
|
| | |
| | | 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-主动退出
|
| | |
|