Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

221 lines
6.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<enMailSystemID, CMailSystem, CActor>
{
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>0nResourceCount用来存资源数量,保存时暂用(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<MAILINFO>& 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<ACTORAWARD>& 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<MAILINFO> m_mailList;
std::vector<MAILINFO> 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<ACTORAWARD>& awardList, int nSrcId = eMailSource_System);
};