142 lines
6.8 KiB
C++
142 lines
6.8 KiB
C++
#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; // 等待中的活动(只遍历这里面的)
|
||
};
|