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

112 lines
4.2 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
struct GlobalActivityData;
class CActivityComponent:
public CComponent
{
public:
CActivityComponent();
~CActivityComponent();
// 请求DBServer加载数据
VOID Load();
// 推送数据到DBServer进行存储
VOID Save();
// 处理DBServer返回数据
VOID OnDbReturnData(INT_PTR nCmd, char * data, SIZE_T size);
// 玩家登录时
VOID OnEnterScene(CActor* pActor);
// 帧处理
VOID RunOne(TICKCOUNT nTickCount);
public: //功能接口
// 获取活动
GlobalActivityData* GetActivity(int nAtvId) {
if(m_RunningActivity.find(nAtvId) != m_RunningActivity.end())
return &m_RunningActivity[nAtvId];
return NULL;
}
// 获取等待活动
GlobalActivityData* GetWaitingActivity(int nAtvId) {
if(m_WaitingActivity.find(nAtvId) != m_WaitingActivity.end())
return &m_WaitingActivity[nAtvId];
return NULL;
}
// 添加活动只加入等待列表待RunOne中处理
bool AddActivity(PGLOBALACTIVITY pActivity);
// 是否已从数据库加载数据
bool IsInited() { return m_IsInited; }
// 活动是否在进行中
bool IsRunning(int nAtvId) { return m_RunningActivity.find(nAtvId) != m_RunningActivity.end(); }
// 是否有在进行的该类型活动
bool IsTypeRunning(int nAtvType);
// 发送一个活动数据
void SendOneActivity(CActor *pActor,int nAtvId);
// 获取某活动的开启时间
unsigned int GetStartTime(int nAtvId);
// 获取某活动的结束时间
unsigned int GetEndTime(int nAtvId);
//結束活動
void CloseActivity(int nAtvId, bool nNextTime = false);
void UpdateActivityData(int nAtvId, CActor* pActor, int nParam1 = 0, int nParma2 = 0,int nParma3 = 0);
VOID OnUserLogin(CActor* pActor) ;
VOID CheckGPStartEnd(CActor* pActor,int atvId, unsigned int ScriptEndTime);
public: //继承接口
virtual bool Initialize(){return true;}
virtual VOID Destroy(){}
private: //数据
CTimer<1000> m_1sTimer;
CTimer<5000> m_5sTimer;
CTimer<3600000> m_1hTimer;
bool m_IsInited; // 是否已从数据库加载数据
CTimer<3000> m_2sSpecialTimer;//三秒刷跨服领主
struct RunningActivityCmpter
{
bool operator()(const GlobalActivityData* _x, const GlobalActivityData* _y) const
{ return (unsigned int)(_x->nEndTime) == (unsigned int)(_y->nEndTime)? _x < _y : (unsigned int)(_x->nEndTime) < (unsigned int)(_y->nEndTime); }
};
struct WaitingActivityCmpter
{
bool operator()(const GlobalActivityData* _x, const GlobalActivityData* _y) const
{ return (unsigned int)(_x->nStartTime) == (unsigned int)(_y->nStartTime)? _x < _y : (unsigned int)(_x->nStartTime) < (unsigned int)(_y->nStartTime); }
};
std::map<int, GlobalActivityData> m_RunningActivity; // <id,activity> 进行中的活动数据
std::map<int, GlobalActivityData> m_WaitingActivity; // <id,activity> 等待中的活动数据
std::set<GlobalActivityData*,RunningActivityCmpter> m_RunningSeq; // 排序以结束时间小的为优先
std::set<GlobalActivityData*,WaitingActivityCmpter> m_WaitingSeq; // 排序以开始时间小的为优先
std::map<int, GlobalActivityData*> m_CircleActivityMap; // <id,pActivity> 记录进行中的循环活动
typedef std::set<GlobalActivityData*,RunningActivityCmpter>::iterator RunIterator;
typedef std::set<GlobalActivityData*,WaitingActivityCmpter>::iterator WaitIterator;
struct RunningNoticeCmpter {
bool operator()(GLOBALNOTICE const* l, GLOBALNOTICE const* r) const noexcept
{
return (unsigned int)(l->nEndTime) == (unsigned int)(r->nEndTime)? l < r : (unsigned int)(l->nEndTime) < (unsigned int)(r->nEndTime);
}
};
std::set<GLOBALNOTICE*, RunningNoticeCmpter> m_RunningNotice;
struct WaittingNoticeCmpter {
bool operator()(GLOBALNOTICE const* l, GLOBALNOTICE const* r) const noexcept
{
return (unsigned int)(l->nStartTime) == (unsigned int)(r->nStartTime)? l < r : (unsigned int)(l->nStartTime) < (unsigned int)(r->nStartTime);;
}
};
std::set<GLOBALNOTICE*, WaittingNoticeCmpter> m_WaittingNotice;
};