92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
#pragma once
|
||
|
||
#include <map>
|
||
|
||
typedef struct BossReferInfo
|
||
{
|
||
int nBossId; // bossId
|
||
int nReferTime; // 刷新时间
|
||
int nDeath; //是否死亡
|
||
int nBossLv; //boss等级
|
||
int nReferX; //刷新的x坐标
|
||
int nReferY; //刷新的y坐标
|
||
int nReferRange; //刷新的范围
|
||
int nReferMapId;// 地图id
|
||
int nBuffAddValue;//属性加值百分比
|
||
bool bIsPush = false;//是否已推送
|
||
bool bNeedRefer = false;//是否需要刷新
|
||
uint32_t nBelongId; //归属id
|
||
BossReferInfo()
|
||
{
|
||
memset(this, 0, sizeof(*this));
|
||
}
|
||
}BOSSREFERINFO;
|
||
|
||
class CBossManager:public CComponent
|
||
{
|
||
public:
|
||
CBossManager();
|
||
~CBossManager();
|
||
//初始化所有boss信息
|
||
VOID Load();
|
||
//保存怪物数据
|
||
void Save();
|
||
//初始化
|
||
bool Initialize();
|
||
bool IsInited() { return m_IsInited; }
|
||
// 帧处理
|
||
VOID RunOne(TICKCOUNT nTickCount);
|
||
//处理boss数据返回
|
||
void OnDbReturnData(INT_PTR nCmd, char * data, SIZE_T size);
|
||
|
||
void SetReferBossBasicInfo(BOSSREFERINFO& boss);
|
||
|
||
public:
|
||
//获取当前boss信息
|
||
BOSSREFERINFO* GetBossInfo(int nBossId);
|
||
//刷boss
|
||
void CreateBossEntity(CScene* pScene);
|
||
void CreateBossEntity(BOSSREFERINFO& boss);
|
||
//bosss死亡
|
||
void BossDeath(int nBossId);
|
||
|
||
bool CheckCondition(int nOpenCircle, int nOpenDay);//判断条件
|
||
|
||
//依据bossid判断boss 是不是都已死亡
|
||
bool GetBossInfoIsDeath(int nBossId);
|
||
//依据bossid 返回已死亡的boss最近刷新时间
|
||
int GetBossMinReferTime(int nBossId);
|
||
|
||
std::map<int32_t, BOSSREFERINFO>& GetBossList()
|
||
{
|
||
return m_nBossReferList;
|
||
}
|
||
|
||
CEntity* CreateBossEntity(BOSSREFERINFO& boss, REFRESHCONFIG& referCfg, CScene* pScene, int Index);
|
||
virtual VOID Destroy(){}
|
||
|
||
//boss 触发;lua 脚本
|
||
void BossCallLuaScript(int nBossId, int nType, CActor* pActor = NULL, CDataPacket* data = NULL);
|
||
|
||
private:
|
||
struct RunningBossCmpter
|
||
{
|
||
bool operator()(const BOSSREFERINFO* _x, const BOSSREFERINFO* _y) const
|
||
{ return (unsigned int)(_x->nReferTime) <= (unsigned int)(_y->nReferTime); }
|
||
};
|
||
|
||
std::map<int32_t, BOSSREFERINFO> m_nBossReferList; //当前可刷新boss
|
||
std::map<int32_t, BOSSREFERINFO> m_nWaitBossReferList; //等待条件达成可刷新的boss
|
||
|
||
std::map<int32_t, std::vector<BOSSREFERINFO*> > m_nMapBossList;//地图刷怪数据
|
||
|
||
std::set<BOSSREFERINFO*,RunningBossCmpter> m_RunningReferList; // 排序以结束时间小的为优先
|
||
|
||
typedef std::map<int32_t, BOSSREFERINFO>::iterator BossIterator;
|
||
typedef std::map<int32_t, std::vector<BOSSREFERINFO*> >::iterator MapBossIter;
|
||
typedef std::set<BOSSREFERINFO*,RunningBossCmpter>::iterator RunBossIter;
|
||
|
||
CTimer<2000> m_2sTimer;
|
||
CTimer<1000> m_1sTimer;
|
||
bool m_IsInited;
|
||
}; |