Files

342 lines
10 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#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:10
* 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; //要投放的聚宝盆物品
};