Files
mir_server/server/LogicServer/entitysystem/MailSystem.h

221 lines
6.2 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00

#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);
};