342 lines
10 KiB
C++
342 lines
10 KiB
C++
#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; //要投放的聚宝盆物品
|
||
};
|
||
|