Files
mir_server/server/LogicServer/base/EntitySubSystem.h

186 lines
5.0 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/***************************************************************/
/*
/* 实体的子系统基类
/* 实体的功能模块,比如组队子系统,技能子系统,继承这个基类
/* 实体的子系统实现一个特定的功能,并有网络消息的分发功能
/* 游戏中的技能,buff任务等特定的功能都可以搞一个子系统给实体挂一个
/***************************************************************/
class CEntity;
/*
SUBSYSTEMID ID
SonClass
EntityClass
*/
template<int SUBSYSTEMID,class SonClass, class EntityClass>
class CEntitySubSystem
{
public:
typedef void (SonClass::*OnHandleSockPacket)(CDataPacketReader &packet); //网络消息处理函数,为子类定义的
public:
CEntitySubSystem()
{
m_pEntity =NULL;
m_hasDbInitData = false;
m_hasDataModify = false;
m_hasRequestData =false;
}
/*
*
*lpEntity
*data NULL
*size 0
*/
inline bool Create(EntityClass *lpEntity,void *data,SIZE_T size)
{
m_pEntity = lpEntity;
return Initialize(data,size);
}
//子系统初始化,如果是玩家需要输入玩家的存盘数据
virtual bool Initialize(void *data,SIZE_T size){return true;}
/*
* Comments:
* Param INT_PTR nCmd:
typedef enum tagDBRecvCmd
{
dcQuery=1, //查询数据
dcSave, //保存数据
dcLoadActor = 3, //加载用户认证信息
dcLoadQuest, //装置任务数据
dcSaveQuest, //保存用户的任务数据
dcLoadSkill, //装置技能数据
dcSaveSkill, //保持技能数据
};
* Param INT_PTR nErrorCode:
typedef enum tagResultError
{
reSucc = 0,
reDbErr, //数据库内部错误
reNoActor, //没有该角色的属性信息
reSaveErr, //保存属性失败
reNoLoad, //还没有读入数据
};
* Param CDataPacketReader reader &:
* @Return VOID:
*/
virtual VOID OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader ){}
/* Param CDataPacketReader reader &: 读写器
* @Return VOID:
*/
virtual VOID OnCrossInitData(CDataPacketReader &reader ){}
/*
*,
*data
*/
virtual void Save(PACTORDBDATA pData){ }
//清空内存
virtual void Destroy(){} ;
//获取子系统的ID
inline INT_PTR GetSystemID() const {return SUBSYSTEMID;}
/*
*
*nCmd 0
*packet
*/
virtual void ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet ){};
//获取自身的实体句柄handle
inline EntityHandle GetHandle() const
{
if (m_pEntity)
{
return m_pEntity->GetHandle(); //返回实体的句柄
}
else
{
return INVALID_ENTITY_HANDLE; //返回0
}
}
//定时处理
virtual VOID OnTimeCheck(TICKCOUNT nTickCount){};
//角色各子系统初始化完毕,向客户端发送创建主角的数据包后,调用该接口
virtual void OnEnterGame(){};
//DB初始化子系统的数据完成
inline void OnDbInitData()
{
m_hasDbInitData =true;
}
//DB的数据是否初始化完毕
inline bool HasDbDataInit()
{
return m_hasDbInitData;
}
//当前子系统发送数据到跨服逻辑
/*
byte cmd
int nsrvid; srvid
unsigned int :nActorId ID
*/
virtual void SendMsg2CrossServer(int nType) {}
/*
* Comments:db没有初始化数据
* Param bool flag:true,false
* @Return void:
*/
inline void SetDataModifyFlag(bool flag)
{
if(!m_hasDbInitData) return ;
if(m_hasDataModify !=flag)
{
m_hasDataModify =flag;
}
}
//数据是否修改过,在存盘的时候调用,用于优化存盘,如果没有修改,则不需要存盘
inline bool HasDataModified()
{
return m_hasDataModify;
}
//是否向DB请求过数据
inline bool HasRequestData()
{
return m_hasRequestData;
}
//当向DB请求数据的时候调用
inline void OnRequestData()
{
m_hasRequestData =true;
}
//CDataPacket& AllocPacket(CActorPacket &pack, BYTE nMsgId){
// CDataPacket& dp = m_pEntity->AllocPacket(pack);
// dp << SUBSYSTEMID << nMsgId;
// return dp;
//}
protected:
EntityClass* m_pEntity ; //这个子系统是属于那个实体的,保持的是实体的指针
protected:
static const OnHandleSockPacket Handlers[]; //网络数据包处理函数列表
bool m_hasDbInitData; //DB是否初始化了改子系统的数据
bool m_hasDataModify; //数据是否修改过,如果修改过,存盘的时候需要存盘,存盘完了调用一下
bool m_hasRequestData; //是否向DB请求过数据
//DECLARE_OBJECT_COUNTER(CEntitySubSystem)
};