Files
mir_server/server/LogicServer/entitysystem/ActivitySystem.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

142 lines
6.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
/************************************************************************/
/* 个人活动子系统
/*
/************************************************************************/
class CAnimal;
class CActivitySystem;
struct PersonActivtyData;
#include<map>
class PActivityAllocator: public std::allocator<std::pair<const int, PersonActivtyData> >
{
typedef PersonActivtyData* pointer;
pointer allocate(size_type _n, const void* = 0);
void deallocate(pointer _p, size_type);
void construct(pointer, const PersonActivtyData&) { }
void destroy(pointer) { }
};
class CActivitySystem :
public CEntitySubSystem<enActivityID,CBuffSystem,CAnimal>
{
public:
enum EnActivityEvent{
enOnLoad = 1, //活动加载 [活动id] 注意:若为个人活动,传入 '玩家指针'
enOnInit = 2, //活动初始化 [活动id, 玩家指针] 注意用于处理再次开启的全局活动同一活动id重置初始化旧数据
enOnStart = 3, //活动开始 [活动id] 注意:若为个人活动,传入 '玩家指针'
enOnEnd = 4, //活动结束 [活动id] 注意:若为个人活动,传入 '玩家指针'
enOnUpdate = 5, //活动帧更新 [活动id当前时间] 注意:若为个人活动,传入 '玩家指针'
enOnReqData = 6, //请求活动数据 [活动id, 玩家指针, outPackage]
enOnOperator = 7, //通用操作 [活动id玩家指针inPack]
enOnEnterArea = 8, //进入活动区域 [活动id, 玩家指针]
enOnExitArea = 9, //离开活动区域 [活动id, 玩家指针]
enOnEnterFuben = 10, //玩家进入活动副本 [活动id玩家指针副本指针, pOwner]
enOnExitFuben = 11, //玩家离开活动副本 [活动id玩家指针副本指针, pOwner]
enOnEntityDeath = 12, //副本实体死亡 [活动id, 被杀者指针,击杀者指针,副本指针, pOwner]
enOnEntityAttacked = 13, //活动副本实体受击 [活动id, 副本指针,受击者,攻击者, pOwner]
enOnFubenFinish = 14, //活动副本结束 [活动id, 副本指针,结果, pOwner] 1为完成0为失败nil则结果未知需要对应副本设置结果
enOnFubenAward = 15, //请求领取副本奖励 [活动id, 副本指针pActor, pOwner]
enOnGetRedPoint = 16, //请求红点数据 [活动id, 玩家指针]
enOnLoginGame = 17, //活动与登录有关 [活动id玩家指针] 个人活动登录签到
enUpdateActivityData= 18, //更新活动内部数据 [活动id玩家指针, ...]
enOnAtvAreaDeath = 19, //普通场景活动区域死亡 [活动id,死亡实体指针]
enOnCombineSrv = 20, //合服后首次登陆 [活动id合服后的开服天数差值,玩家指针] 个人活动
enOnGPStart = 21, //全局个人活动的玩家Start [活动id玩家指针] Global_Person_Activity
enOnGPEnd = 22, //全局个人活动的玩家End [活动id玩家指针] Global_Person_Activity
enOnAtvAreaAtk = 24, //普通场景活动区域实体受击 [活动id, 副本指针,受击者,攻击者, pOwner]
enOnAtvRank = 25, //副本排行榜刷新 [活动id, 当前时间]
};
typedef CEntitySubSystem<enActivityID,CBuffSystem,CAnimal> Inherited;
friend class PActivityAllocator;
public:
CActivitySystem();
~CActivitySystem();
public: // 继承接口
//初始化的回调接口
virtual bool Initialize(void *,SIZE_T);
//DB返回的回调接口
virtual VOID OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader );
//进入游戏
virtual VOID OnEnterGame();
//保存到db
virtual VOID Save(PACTORDBDATA pData);
//处理协议
virtual VOID ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet );
public: // 功能接口
VOID RunOne_5s(TICKCOUNT nCurrentTime);
VOID OnLevelUp();
VOID OnCircleUp();
VOID OnChargeYuanBao();
VOID OnNewDayArrive();
VOID OnEnterScene();//进入场景
VOID OnUserLogin(); //活动相关的登录事件
VOID OnCombineServer(int diffDay) ; //合服事件
//更新活动内部数据
void UpdateActivityData(int nAtvId, int nParam1 = 0 , int nParma2 = 0, int nParam3 = 0);
// 获取活动
PersonActivtyData* GetActivity(int nAtvId) {
if(m_RunningActivity.find(nAtvId) != m_RunningActivity.end())
return &m_RunningActivity[nAtvId];
return NULL;
}
// 活动是否进行中
bool IsActivityRunning(int nId)
{
return m_RunningActivity.find(nId) != m_RunningActivity.end();
}
// 活动是否已停止
bool IsActivityStop(int nId)
{
return m_StopActivity.find(nId) != m_StopActivity.end();
}
// 活动是否开过
bool IsActivityHasBeenOpened(int nId)
{
return IsActivityStop(nId) || IsActivityRunning(nId);
}
void CloseActivity(int nAtvId);
// 是否有在进行的该类型活动
bool IsTypeRunning(int nAtvType);
// 检查活动,若满足条件则开启
bool CheckActivityBegin();
// 发送一个活动数据
void SendOneActivity(int nAtvId);
//手动刷新运行中的活动数据
void FlushRunningAtvData();
private: // 数据
struct PActivityCmpter
{
bool operator()(const PersonActivtyData* _x, const PersonActivtyData* _y) const
{
return (unsigned int)(_x->nExpiredTime) < (unsigned int)(_y->nExpiredTime);
}
};
typedef std::set<PersonActivtyData*,PActivityCmpter>::iterator RunIterator;
typedef std::map<int, int>::iterator StopIterator;
static CBufferAllocator* m_pAllocator;
bool m_IsInited; // 是否已从数据库加载数据
std::map<int, PersonActivtyData,std::less<int>,PActivityAllocator> m_RunningActivity; // <id,activity> 进行中的活动数据
std::set<PersonActivtyData*,PActivityCmpter> m_RunningSeq; // 排序以结束时间小的为优先
std::map<int, int> m_StopActivity; //<id,type> 已停止的活动,用以活动开启判断
std::map<int, PersonActivtyData> m_Waitting; // 等待中的活动(只遍历这里面的)
};