186 lines
5.0 KiB
C
186 lines
5.0 KiB
C
|
|
#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)
|
|||
|
|
};
|