#pragma once //邮件保存分批保存 #define MAIL_DATA_SAVE_COUNT_EACH_TIME 30//每次保存的邮件数 #define MAIL_DATA_SEND_COUNT_EACH_TIME 40//每次下发的邮件数 //邮件保存类型 enum eMailSaveType { eMailSaveType_Mail=0, eMailSaveType_Attach =1 }; enum eMailSaveDelType { eMailSaveDelType_Normal=0, eMailSaveDelType_Del=1 }; #define MAILATTACHCOUNT 6 class CMailSystem: public CEntitySubSystem { public: //邮件附件 enum eMailState { eMailState_No =0, eMailState_Read =1,//已读 eMailState_Get=2//已领取 }; enum eMailSource { eMailSource_System=0,//游戏正常功能发送 eMailSource_BackStageWelFare=1,//后台福利发送 }; //分批下发到客户端 enum eMailBatchSendType { eMailBatchSendType_DelOld =0,//删除旧的并开始添加 eMailBatchSendType_Add =1//直接添加 }; //附件说明: //建议直接使用脚本函数发邮件,直接配置Award即可 //SendMail,SendMailByAward接口,设置item里的参数,然后giveaward生成奖励。 //SendMailFromUserItem接口,直接拷贝到item,发整个具体物品。 //当nType>0,nResourceCount用来存资源数量,保存时暂用(wDura+wDuraMax)来存。 //当nType == qatAddExp, 不使用nResourceCount 而用id 和count typedef struct tagMailAttach { byte nType; CUserItem item; //下面的不存数据库 int nResourceCount; WORD wQualityDataIndex; //用来标记发邮件前是否生成极品属性(0不生成); tagMailAttach & operator = (const tagMailAttach & oneAttrach) { memcpy(this, &oneAttrach, sizeof(*this)); } tagMailAttach() { memset(this, 0, sizeof(*this)); } }MAILATTACH, *PMAILATTACH; typedef struct tagMailInfo { // 暂时废弃这个id ---客户端跟服务器对不上 // CUserItem::ItemSeries nMailId; // uint64_t nMailId; //邮件id unsigned int nSrcId;//来源 char sTitle[200]; char sContent[600]; MAILATTACH mailAttach[MAILATTACHCOUNT]; unsigned int nCreateDt; byte nState; byte nBind; byte nIsDel;//是否删除了,1删除,0否(现在删除了存数据库供后台查询) //下面的不存数据库 byte nAttachCount;//未领取附件数量 bool isSendToClient;//是否已经发送到客户端 tagMailInfo() { memset(this, 0, sizeof(*this)); } }MAILINFO; enum enMailOpt { moReadFlag = 1, }; CMailSystem(); ~CMailSystem(); bool Initialize(void *data,SIZE_T size); void OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader ); void ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet ); void Save(PACTORDBDATA pData); void SaveMailToDb(std::vector& mailList, BYTE nDelType); void LoadMailDataFromDb(); void SendAllMail(); static void SetUseItemToMailAttach(CUserItem& userItem, MAILATTACH& mailAttach); static void SetMailAttachToUseItem(CUserItem& userItem, MAILATTACH& mailAttach); void AddOneMailToPacket(CDataPacket& pack, MAILINFO& oneMail); void AddAttachToItemParam(MAILATTACH& attach, CUserItemContainer::ItemOPParam& itemPara); /* * Comments:邮件操作 * Param CDataPacketReader & packet: * @Return void: */ void MailOpt(CDataPacketReader & packet ); bool isSameIdMail(MAILINFO& mailInfo); /* * Comments:发送邮件的静态函数 * Param unsigned int nActorId:发送的玩家IDtpSkillTrainCoinLimited * Param LPCSTR sTitle:邮件标题 * Param LPCSTR sContent:邮件内容 * Param MAILATTACH pAttach[MAILATTACHCOUNT]: 附件 * @Return bool: */ //发邮件,可以不带附件 static bool SendMail( unsigned int nActorId, LPCSTR sTitle, LPCSTR sContent ,MAILATTACH pAttach[MAILATTACHCOUNT] = NULL, int nSrcId = eMailSource_System); //发邮件,用奖励配置生成物品(资源用nResourceCount) static void SendMailByAward(unsigned int nActorId, LPCSTR sTitle, LPCSTR sContent,CVector& awardList, int nSrcId = eMailSource_System); //发邮件,直接发useritem,不重新生成物品,注意管理pUserItem内存 //暂没需求发多个CUserItem,有就自行在现有接口上扩充 static bool SendMailFromUserItem( unsigned int nActorId, LPCSTR sTitle, LPCSTR sContent, CUserItem* pUserItem); //添加附近 static void AddMailAttach(MAILATTACH& attach, int nType, int nId, int nQuality, int nStrong, bool bind, int smith[CUserItem::MaxSmithAttrCount]); /* * Comments:保存离线邮件 * Param MAILINFO & mail:邮件结构引用 * @Return void: */ static void SaveOfflineMail(unsigned int nActorId, MAILINFO & mail); //给客户端下发一封新的邮件 void SendNewMail(MAILINFO& oneMail); void DeleteMails(CDataPacketReader & packet); void DeleteMailsAll(); void DeleteSomeMails(CDataPacketReader & packet); /* * Comments:批量收取邮件中的附近 * Param CDataPacketReader & packet: * @Return void: */ void GetMailItems(CDataPacketReader & packet); void GetMailItemsAll(); /* * Comments:标记已读邮件 * Param INT64 nMailId: * @Return void: */ void SetMailReaded(INT64 nMailId); /* * Comments:删除邮件 * Param INT64 nMailId: * @Return bool: */ bool RemoveMail(INT64 nMailId); /* * Comments:通过邮件ID, 获取邮件数据 * Param INT64 nMailId: * @Return MAILINFO *: */ inline MAILINFO * GetMail(INT64 nMailId) { INT_PTR nCount = m_mailList.size(); for (INT_PTR i = 0; i < nCount; i++) { MAILINFO & mail = m_mailList[i]; if (mail.nMailId == nMailId) { return &mail; } } return NULL; } //加载邮件内容 void OnLoadMails(CDataPacketReader & packet); INT_PTR GetMailCount(){return m_mailList.size();} private: /* * Comments:发送到我角色的邮件 * Param MAILINFO & oneMail: * @Return bool: */ bool SendMail(MAILINFO & oneMail); //提取一封邮件的附件 void GetOneMailAttach(MAILINFO& oneMail); //日志记录获取附件 void LogGetMailAttach(MAILINFO& mailInfo); void LogDelMail(MAILINFO& mailInfo); private: std::vector m_mailList; std::vector m_mailDelList;//已删除邮件列表 uint32_t m_nMailIndex = 0; //邮件初始index bool nInitOnce = false; //跨服相关 public: //发邮件,用奖励配置生成物品(资源用nResourceCount) static void SendCrossServerMail(unsigned int nActorId, LPCSTR sTitle, LPCSTR sContent,std::vector& awardList, int nSrcId = eMailSource_System); };