Files
mir_server/server/LogicServer/base/TopTitleMgr.h

256 lines
7.1 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
using namespace FDOP;
using namespace wylib::stream;
/****************************************
*****************************************/
#define MAX_RANK_COUNT 4 //最大排行榜个数
#define MAX_TOP_TITLE_COUNT 3 //排行榜头衔数量
#define MAX_TOP_TITLE_MASTER 1 //法师
#define MAX_TOP_TITLE_WARRIOR 2 //战士
#define MAX_TOP_TITLE_WIZARD 3 //道士
#define MAX_TOP_TITLE_SKILL 8 //技高一筹
#define MAX_TOP_TITLE_EQUIP15 9 //兵甲初备
#define MAX_TOP_TITLE_EQUIP40 10 //兵强甲亮
#define MAX_TOP_TITLE_SKILL_2 20 //技惊四座
//第一法师 第一战士 第一道士
static const char* szTopTitleRand[MAX_TOP_TITLE_COUNT] = {_T("TopTitleFirstMaster"),_T("TopTitleFirstWarrior"), _T("TopTitleFirstWizard")};
static const char *szTopMaxLevel = "szTopMaxLevel"; //全服最大等级
//头衔排行榜信息结构
typedef struct tagTopTitleRankInfo
{
unsigned int m_nActorId; //角色ID
int m_nRankId; //排行榜ID
int m_nRank; //排名
int m_nValue; //值
int m_nParam; //保留参数
ACTORNAME m_sName; //名字
int m_nJob; //职业
int m_nSex; //性别
int n_yyVip;//yy超玩
ACTORNAME m_sGuildName; //名字
tagTopTitleRankInfo()
{
memset(this, 0, sizeof(*this));
}
}TOPTITLERANKINFO,*PTOPTITLERANKINFO;
//跨服排行榜结构
typedef struct tagRankData
{
unsigned int nActorId; //角色ID
char sName[32]; //角色名
unsigned int nSex; //玩家的性别
int nVocation; //职业
int nServerId; //服务器ID
unsigned int nValue; //排行指定值
tagRankData()
{
memset(this, 0, sizeof(*this));
}
}RANKDATA, *PRANKDATA;
//这里表示排行榜类型
enum RankType
{
// rtBattlePower = 0, //战力排行
// rtWarriorBp, //战士战力排行
// rtMagicianBp, //法师战力排行
// rtWizardBp, //道士战力排行
rtAllLevel = 0, //全职业等级排行
rtWarriorLevel, //战士等级排行
rtMagicianLevel, //法师等级排行
rtWizardLevel, //道士等级排行
// rtCoin, //金币排行
// rtGirlCharm, //女性魅力排行榜
// rtBoyCharm, //男性帅气排行榜
// rtHeroLevel, //英雄等级排行
// rtWarriorHeroLevel, //战士英雄等级排行
// rtMagicianHeroLevel, //法师英雄等级排行
// rtWizardHeroLevel, //道士英雄等级排行
// rtWarriorHeroBp, //战士英雄战力排行
// rtMagicianHeroBp, //法师英雄战力排行
// rtWizardHeroBp, //道士英雄战力排行
// rtMagicItemBp, //法宝战力排行
// rtBindCoin, //绑定金币排行
// rtSoldierSoul, //兵魂排行榜
// rtWing, //翅膀排行
};
typedef CVector<TOPTITLERANKINFO> RANKUSERLIST; //排行榜玩家的列表
class CTopTitleMgr:
public CComponent
{
public:
/*
* Comments:
* @Return void:
*/
bool Initialize();
/*
* Comments:
* Param TICKCOUNT nTickCount:
* @Return void:
* @Remark:
*/
void RunOne(TICKCOUNT nTickCount);
/*
* Comments:
* @Return void:
*/
//void Load();
/*
* Comments:
* @Return void:
*/
//void UpdateBaseRankData();
/*
* Comments:
* @Return void:
*/
//void UpdateRankData();
/*
* Comments: ,
* Param INT_PTR nCmd:
* Param char * data:
* Param SIZE_T size:
* @Return void:
*/
void OnDbReturnData(INT_PTR nCmd,char * data,SIZE_T size);
//void SendTopRankData(CActor * m_pEntity);
/*
* Comments:
* @Return RANKUSERLIST&:
*/
inline RANKUSERLIST* GetRankUserList()
{
return m_rankActorList;
}
/*
* Comments: 线
* @Return bool:
*/
bool SetOnlineActorHeadTitle();
//增加引用计数,函数返回增加后的引用计数
virtual int AddTopRankRef(){ m_nRefCount++; return m_nRefCount; }
//减少引用计数,函数返回减少后的引用计数
virtual int ReleaseTopRankRef() {
int nRet = --m_nRefCount;
// 计数少于等于0 读取头衔数据更新头衔
if (nRet <= 0)
// Load();
return nRet;
}
//重置玩家的离线玩家信息
void ResetOfflineUser();
//重置NPC外观属性
void ResetNpcStatue();
/*
* Comments: NPC雕像
* Param INT_PTR nType:
enum NpcStatueType
{
stNormal = 0,
stRsCastellan = 1, //本服沙巴克城主雕像
stCsCastellan = 2, //跨服沙巴克城主雕像
stRsVocation = 3, //本服职业雕像
stCsVocation = 4, //跨服职业雕像
};
* Param INT_PTR nActorId: actorid actorid==0
* Param LPCTSTR sName:
* Param INT_PTR nSex:
* Param INT_PTR nParam: nType = 34ID
* @Return bool:
*/
bool SetNpcStatue(INT_PTR nType, INT_PTR nActorId, LPCTSTR sName, INT_PTR nSex, INT_PTR nParam = 0);
//更新职业雕像
void UpdateVocNpcStatue(INT_PTR nType);
//SSDB返回数据
void OnSSDBReturnData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader);
//其他逻辑服转发的消息
//nServerId 其他服务器ID
void OnOtherLogicServerRetData(int nCmd, int nOtherServerId, CDataPacketReader &reader);
public:
//更新各个职业的排序
void UpdateRawRankList();
//发送到SS保存战力排行
void SaveCsRank();
//加载跨服战力排行数据
void LoadCsRank();
//清除跨服战力排行数据
void ClearCsRank(INT_PTR nServerId);
//广播所有逻辑服将雕像榜单数据发到session
void BroadLogicToSaveCsRank();
//广播所有逻辑服重新取下榜单
void BroadLogicToLoadCsRank();
//装载跨服玩家的离线消息
void LoadUserOfflineData(int nServerId, unsigned int nActorId);
//返回跨服玩家的离线下消息
void ReturnUserOfflineData(int nDestServerId, unsigned int nActorId);
//设置角色离线数据
void SetUserOfflineData(CDataPacketReader &reader);
//在m_CsRankList获取serverId
int GetServerIdByCsRank(unsigned int nActorId);
bool SetRankHeadTitle(CActor *pActor);
//获取排行榜的第几名的角色id
unsigned int GetActorIdByCsRank(INT_PTR nRankIndex,int nRank);
PTOPTITLERANKINFO GetActorInfoByCsRank(INT_PTR nRankIndex,int nRank);
void maintainTopTitle();
void SetTopMaxLevel(int nLevel);
int GetTopMaxLevel() const {return nMaxTopLevel;};
int GetTopLevel();
public:
const static int g_nRadius = 20; //可视更新半径
CTopTitleMgr();
~CTopTitleMgr();
int nMaxTopLevel = 1;//最大等级
private:
RANKUSERLIST m_rankActorList[MAX_RANK_COUNT]; // 排行榜列表
int m_nRefCount; // 引用计数,用于不同排行榜之间更新进行计数
TICKCOUNT m_nDelay; // 雕像延时更新时间
CVector<RANKDATA> m_RawRankList; // 本服职业战力排行
CVector<RANKDATA> m_CsRankList; // 跨服职业战力排行
int m_nUpdateTime = 0; // 更新时间
bool m_bInit = false; //更新状态
};