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

342 lines
10 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
/***************************************************************/
/*
/* 杂七杂八子系统
/* 处理游戏里的各种杂项需求
/* 防沉迷在这里
/*
/***************************************************************/
#define MAXGAMESETTING 16
#define GAME_SETTING_TYPE_BASE 1 //游戏设置-基本
#define GAME_SETTING_TYPE_BASE_AUTO_INVITETEAM 4//自动接受组队邀请和入队邀请
static LPCTSTR szDayHadExchangeExploitCount = "dayExchangeExploitCount"; //每日已兑换战绩次数
enum MembershipCommType //会员属性请求命令
{
eMembershipComm_NULL = 0,
eMembershipComm_White = 5, //百卡
eMembershipComm_Green = 6, //绿卡
eMembershipComm_Blue = 7, //蓝卡
eMembershipComm_Violet = 8, //紫卡
eMembershipComm_Orange = 9, //橙卡
eMembershipComm_OrangeStar = 12, //橙星卡
eMembershipComm_OrangeMoon = 13, //橙月卡
eMembershipComm_MAX,
};
enum MembershipLvType //会员等级属性
{
eMembershipLv_NULL = 0,
eMembershipLv_White = 3, //百卡
eMembershipLv_Green = 4, //绿卡
eMembershipLv_Blue = 5, //蓝卡
eMembershipLv_Violet = 6, //紫卡
eMembershipLv_Orange = 7, //橙卡
eMembershipLv_OrangeStar = 8, //橙星卡
eMembershipLv_OrangeMoon = 9, //橙月卡
eMembershipLv_MAX,
};
class CMiscSystem:
public CEntitySubSystem<enMiscSystemID,CMiscSystem,CActor>
{
public:
typedef CEntitySubSystem<enMiscSystemID,CMiscSystem,CActor> Inherid;
//属性排行榜
typedef struct tagRankItem
{
WORD nConfigIndex; //排行榜属性配置的配置索引
WORD nRankIndex; //排名索引
int nPoint; //分数
}RANKITEM, *PRANKITEM;
public:
CMiscSystem()
: bSignUpToday(false)
, m_fcmIsOpen(true)
, m_isAdult(true)
{
m_hasSendLoginTipmsg=false; //是否已经发送登陆的提示
m_hasSend1HourTipmsg=false; //是否已经发送1小时的提示
m_hasSend3HourTipmsg=false; //是否已经发送3小时的提示
m_hasSend5HourTipmsg=false; //是否已经发送5小时的提示
//m_isAdult =true; //是否是成年人
//m_fcmIsOpen =true; //反沉迷系统是否开启了
//bSignUpToday =false;
bNeedSaveGameSetData = false;
m_isLauncherLogic = false;
memset(m_nGameSetData,0,sizeof(m_nGameSetData));
ResetMiscData();
}
virtual ~CMiscSystem() {}
/*处理网络数据
* nCmd 消息号
* packet 网络包
*/
void ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet );
//重载初始化函数暂时的话所有的都是GM
bool Initialize(void *data,SIZE_T size);
//客户端发来平台防沉迷信息重新初始化
bool ReInitialFCM(BYTE FcmTag);
//销毁
virtual void Destroy();
void Save(PACTORDBDATA pActorData);
//Comments:玩家登出的时候触发
void OnActorLoginOut();
//定时检测
void OnTimeCheck(TICKCOUNT nTickCount);
//获取当前的防沉迷系统的经验和金钱的减半,没有纳入防沉迷是1否则过时间了会减
int GetFcmExpMoneyRate();
//攻击了一次别人,在这里计算连斩
//void OnAttackOther(CAnimal * pEntity,unsigned int nDurKillTime);
//角色各子系统初始化完毕,向客户端发送创建主角的数据包后,调用该接口
virtual void OnEnterGame();
// 购买月卡1.免费特权2.月卡3.大药月卡4.永久卡)
void OnBuyMonthCard(BYTE mtype);
// 领取月卡日常奖励1.免费特权2.月卡3.大药月卡4.永久卡)
void OnGetMonthCardAward(BYTE mtype);
bool IsHasFreePrivilege();//是否拥有免费特权
bool IsHasMonthCard();//是否拥有月卡
bool IsHasMedicineCard();//是否拥有大药月卡
bool IsHasForverCard();//是否拥有永久卡
bool IsHasShouChongCard();//是否是拥有首充会员卡
bool IsHasWhiteCard() ;//是否拥有白卡会员
bool IsHasGreenCard() ;//是否拥有绿卡会员
bool IsHasBlueCard(); //是否拥有蓝卡会员
bool IsHasPurpleCard(); //是否拥有紫卡会员
bool IsHasOrangeCard(); //是否拥有橙卡会员
//防沉迷
bool IsAdult(){return m_isAdult;};
//特权回收
int GetRecoverGetGold(int nType, int nId);
//处理回收特权
void DealRecover();
//获取色卡会员最高等级1白 2绿 3蓝 4紫 5
//非色卡会员返回0
int GetMaxColorCardLevel();
//获取色卡会员最大经验衰减百分数, 如70%则返回70 , 非色卡会员或者使用默认衰减的返回0
int GetMaxExpDampColorCard();
//获取首冲卡&&色卡会员的活动泡点经验加成百分数,活动,普通泡点地图, 普通打怪用的都是这个
int GetSuperRightAtvPaoDianPlus();
//获取寄售行最大售卖个数
int GetJiShouHangMaxCount();
//通过金钱的类型获取金钱的名字
static LPCSTR GetMoneyName(INT_PTR nMoneyType);
//通过奖励的类型获取奖励的名字
static LPCSTR GetAwardName(INT_PTR nType);
/*
* Comments:给客户端发送倒计时时间,客户端收到这个消息,显示一个倒计时的特效
* Param INT_PTR nTime:倒计时时间单位不超过10s
* Param BYTE bFlag : 0 有"开始"字, 1 没有文字
* @Return void:
*/
void SendCountdown(INT_PTR nTime,int nFlag = 0, int nType = 1);
// 设置杂项数据
inline void SetMiscData(enMiscDataType flagType, int nVal)
{
if ((flagType >= (enMiscDataType)0) && (flagType < enMiscDataMax))
{
m_nMiscData[flagType] = nVal;
}
}
// 获取杂项数据
inline int GetMiscData(enMiscDataType flagType)
{
if ((flagType >= (enMiscDataType)0) && (flagType < enMiscDataMax))
return m_nMiscData[flagType];
return 0;
}
//加载游戏设置的数据
void LoadGameSetData();
//读取游戏设置的数据
void LoadGameSetDataResult(CDataPacketReader &reader);
//玩家改名字
void OnChangeActorName(CDataPacketReader &packet);
//改名字结果
void OnChangeActorNameResult(INT_PTR nErrorCode,CDataPacketReader &reader);
/// 下发游戏设置的数据
void SendGameSetRsult();
/// 保存游戏设置
void SaveGameSetDataToDb();
/*
* Comments:处理数据服务器返回的内容
* Param INT_PTR nCmd:
* Param INT_PTR nErrorCode:
* Param CDataPacketReader & reader:
* @Return VOID:
*/
virtual VOID OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader );
//初始属性排行榜
void InitRankPropData();
//更新属性排行榜
void UpdateRankPropData(int nConfigIndex, int nRankIndex, int nPoint);
//计算属性排行榜属性
bool CalcRankPropProperty(CAttrCalc &calc);
//下发服务器的合区时间(用于后台设置开启某些系统用)
void SendTempCombineTime();
//跨天清理签到
void ClearCheckSignIn();
//改名字后的处理
void AfterChangeNameOp(const char* oldName);
//播放特效消息
void PlaySrcEffect(int nEffId, int nSec, bool boWorld = false, int nLevel = 0);
/*
* Comments:
* Param byte nType:
* Param int nParam:
* @Return void:
*/
void SendCustomEffect(byte nType, int nParam);
/*
* Comments:支持打开或关闭大图标
* Param byte nFlag:开关1打开0关闭
* Param WORD nIconId:图标id
* @Return void:
*/
void SendTurnOnOffIcon(byte nFlag, WORD nIconId);
//检查是否用登陆器登陆
void CheckLauncherLogin();
void SendTheLineActivity();
void SendWuYiGoldEggActivity();
//获取游戏设置值
int GetGameSetting(int nType, int nIdx);
void SendActorInfoByNameFuzzy(unsigned char nType, char* sName);
//登陆
void OnUserLogin();
//下发开服时间
void SendOpenServerDays();
//下发每转人数
void SendCircleCount();
/*
* Comments:触发一个事件
* Param INT_PTR nEventID: 事件的ID
* Param INT_PTR nSubEvent: 子事件的ID
* Param INT_PTR nParam1:参数1不需要就直接按默认参数为-1
* Param INT_PTR nParam2:参数2不需要就直接按默认参数为-1
* Param INT_PTR nParam3:参数3不需要就直接按默认参数为-1
* Param INT_PTR nParam4:参数4不需要就直接按默认参数为-1
* @Return void:
*/
void TriggerEvent(INT_PTR nEventID,INT_PTR nSubEvent,INT_PTR nParam1=-1,INT_PTR nParam2=-1,INT_PTR nParam3=-1,INT_PTR nParam4=-1);
//充值相关
/*
* Comments:下发每日充值
* Param unsigned int nLeftTime:
* @Return void:
*/
//void SendEveryDayPay(byte nType, unsigned int nLeftTime, unsigned int nMyPayCount = 0, byte nActId = 0);
private:
//查看玩家的信息
void OnViewActorInfo(CDataPacketReader &packet) ;
//保存游戏设置的数据
void SaveGameSetData(CDataPacketReader &packet);
//获取服务器的时间
void OnGetServerTime();
/*
* Comments:发送排行榜的数据
* Param LPCSTR sName:排行榜的名称
* @Return void:
*/
void SendRankingData(LPCSTR sName);
void OnGetYuanbaoPlant(); //获取元宝的种植的数据
// 重置杂项数据
inline void ResetMiscData()
{
ZeroMemory(m_nMiscData, sizeof(m_nMiscData));
}
//改名时更新排行中的名字
bool ChangeNameInRank(const char * sRankingName, int nRankSubIdx = 0);
//跨服相关
public:
void OnCrossInitData(GameUserDataOther &data);
void SendMsg2CrossServer(int nType);
private:
bool m_isAdult:1; ///< 是否是成年人
bool m_fcmIsOpen:1; //反沉迷是否开启
bool m_hasSendLoginTipmsg:1; //是否已经发送登陆的提示
bool m_hasSend1HourTipmsg:1; //是否已经发送1小时的提示
bool m_hasSend2HourTipmsg:1; //是否已经发送2小时的提示
bool m_hasSend2Hour55MinuteTipmsg:1; //是否已经发送2小时55分的提示
bool m_hasSend3HourTipmsg:1; //是否已经发送3小时的提示
bool m_hasSend5HourTipmsg:1; //是否已经发送5小时的提示
bool m_isLauncherLogic:1; //是否用登陆器登陆
unsigned int m_fcmStartTime; //该账户开始防沉迷的短时间
//YBDATA m_ybpPlans[3]; //玩家的元宝的种植的数据
int m_nMiscData[enMiscDataMax]; // 存放一些辅助数据,例如增加日常任务次数、日常副本任务等等。
int m_nGameSetData[MAXGAMESETTING]; //游戏设置保存数组
bool bNeedSaveGameSetData; //是否需要保存游戏设置的数据到数据库
bool bSignUpToday; //今天是否已经签到
CVector<RANKITEM> m_RankPropData; //属性排行榜保存的临时排行数据
CUserItem* m_pUserTreasureItem; //要投放的聚宝盆物品
};