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

144 lines
5.6 KiB
C++

#pragma once
#include<map>
#define STATIC_TYPE_ITEM_INDEX_MAX 3000 //物品自定义计数器容量--程序内部使用
/*
玩家计数器
用于统计 计数的数据
*/
enum StaticType
{
//参见道具配置表计数器说明
eSTATIC_TYPE_DAILY_TIME = 0, //每日记录的时间
nDailyStaticStart = 1, //每日计数器起点
nDailyStaticBasicExp = 301, //每日基础经验统计
nDailyStaticEnd = 401, //每日计数器结点
eSTATIC_TYPE_WEEK_TIME = 450, //每周记录的时间
nWeekStaticStart = 451, //每周计数器起点
nWeekStaticEnd = 600, //每周计数器结点
NLEFT_GUILDTIME = 610, //离开行会时间
nLastCombineSrvMinTime = 611, //上次合服的绝对时间
nContinueLoginMaxTimes = 612, //连续登陆最大天数
nMedalLevel = 613, //勋章等级 --我是不需要清理的
nSZBOSS_STATICTYPE = 614, // 神装boss 次数
nSZBOSS_STATICDAY = 615, // 神装boss 记录的开服时间
nPERSONALBOSS_STATICTYPE = 616, // 个人boss 次数
nPERSONALBOSS_STATICDAY = 617, // 个人boss 记录的开服时间
nSTRENGTHRN_NUM_1 = 620, //强化顺序
nOrderWard_StaticType = 622, //战令积分
nOrderWardId_StaticType = 623, //战令活动
eSTATIC_TYPE_ORDERWARD_MONEY = 624, //战令币
nRechargTime_StaticType = 625, //充值时间
eSTATIC_TYPE_DIMENSIONAL_KEY = 626, //次元钥匙
nDimensionalKey_STATICDAY = 627, //次元钥匙 记录的开服时间
eSTATIC_TYPE_MONTH_TIME = 650, //每月记录的时间
nMonthStaticStart = 651, //每月计数器起点
nMonthStaticEnd = 750, //每月计数器结点
nForerverStaticStart = 755, //商城永久购买
nForerverStaticEnd = 1000, //商城永久购买
nPC_AWARD_STATE = 10005,//微端奖励
nMAIL_COMBINE_TIME = 10006,//全服邮件
nACTOR_MAIL_COMBINETIME = 10007,//合服补偿邮件
//程序内部使用的属性
//物品使用
eSTATIC_TYPE_INNER_ITEM_DAILY_START = 30001, //每日计数器起点--物品
eSTATIC_TYPE_INNER_ITEM_DAILY_END = 33000, //每日计数器结点--物品
eSTATIC_TYPE_INNER_ITEM_WEEK_START = 33001, //每周计数器起点--物品
eSTATIC_TYPE_INNER_ITEM_WEEK_END = 36000, //每周计数器结点--物品
eSTATIC_TYPE_INNER_ITEM_MONTH_START = 36001, //每月计数器起点--物品
eSTATIC_TYPE_INNER_ITEM_MONTH_END = 39000, //每月计数器结点--物品
//其他
};
typedef struct StaticCount
{
int nStaticType; //对应的计数器
LONGLONG nCount; //次数---后续如果需要int64 在修改
};
/*
玩家计数器系统 统计次数等计数器
*/
class CStaticCountSystem :public CEntitySubSystem<enStaticCountSystemID, CStaticCountSystem, CActor>
{
public:
//初始化
virtual bool Initialize(void* data, size_t size);
void OnEnterGame();
//处理db 数据返回
virtual void OnDbRetData(INT_PTR nCmd, INT_PTR nErrorCode, CDataPacketReader& packet);
virtual void SaveToDb();
//基础方法
void DailyRefresh();//定时刷新
LONGLONG GetStaticCount(INT_PTR nStaticType);//获得计数器value
void SetStaticCount(INT_PTR nStaticType, INT_PTR nValue);
void AddStaticCount(INT_PTR nStaticType, INT_PTR nValue);
//处理消息逻辑
void ProcessNetData(INT_PTR cmd, CDataPacketReader& packet);
void SendCircleExchangeCount();//发送兑换次数
//转生升级
void UpCircle();
//兑换修为
void ExchangeCircleSoul(CDataPacketReader& packet);
void UpMeridiansLv();
/*****************************战令相关*************************************/
void OnAddOrderWardMoney(INT_PTR nValue);
/*****************************次元钥匙相关*************************************/
void OnAddDimensionalKey(INT_PTR nValue);//eSTATIC_TYPE_DIMENSIONAL_KEY nDimensionalKey_StaticType
/*****************************物品相关*************************************/
//物品处理函数 重置状态为0 计数状态为大于等于1
int UpItemInnerIndexDaily(int ItemIndex);//获得物品处理过的内部ID
int UpItemInnerIndexWeek(int ItemIndex);//获得物品处理过的内部ID
int UpItemInnerIndexMonth(int ItemIndex);//获得物品处理过的内部ID
//改变
void OnReduceItemInnerStaticCountDaily(INT_PTR nStaticType, INT_PTR nValue);
void OnReduceItemInnerStaticCountWeek(INT_PTR nStaticType, INT_PTR nValue);
void OnReduceItemInnerStaticCountMonth(INT_PTR nStaticType, INT_PTR nValue);
//获得是否是重置后的值
bool OnGetItemInnerIndexDailyInit(int ItemIndex);//获得是否是初始状态
bool OnGetItemInnerIndexWeekInit(int ItemIndex);
bool OnGetItemInnerIndexMonthInit(int ItemIndex);
//获得
LONGLONG OnGetItemInnerIndexDaily(int ItemIndex);//获得是否是初始状态
LONGLONG OnGetItemInnerIndexWeek(int ItemIndex);
LONGLONG OnGetItemInnerIndexMonth(int ItemIndex);
protected:
void ClearDailyStaticCount();//重置每日计数器
void ClearWeekStaticCount();//重置每周计数器
void ClearMonthStaticCount();//重置每月计数器
private:
std::map<int, LONGLONG> m_StaticCounts;
bool isInitData = false;
bool isDataModify = false;
};