#include "StdAfx.h" #include "../base/Container.hpp" using namespace jxInterSrvComm::DbServerProto; //数据服务器和逻辑服务器的命令码 CTopTitleMgr::CTopTitleMgr() { m_nDelay = 0; m_nRefCount = 0; m_nUpdateTime = 0; } CTopTitleMgr::~CTopTitleMgr() { for (int i=0; i < MAX_RANK_COUNT;i++ ) { RANKUSERLIST& list = m_rankActorList[i]; list.empty(); } m_RawRankList.empty(); m_CsRankList.empty(); } bool CTopTitleMgr::Initialize() { //LoadCsRank(); return true; } void CTopTitleMgr::RunOne(TICKCOUNT nCurrTickCount) { // int nNowTime = time(NULL); // if (nNowTime >= m_nUpdateTime) // { // //UpdateRawRankList(); // //UpdateVocNpcStatue(stRsVocation); // UpdateBaseRankData(); // Load(); // m_nUpdateTime = nNowTime + 60*10; // } } // void CTopTitleMgr::Load() // { // CDataClient* pDbClient = GetLogicServer()->GetDbClient(); // if (pDbClient->connected()) // { // CDataPacket& DataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadBaseRank); // int nServerId = GetLogicServer()->GetServerIndex(); // DataPacket << nServerId << nServerId; // GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket); // } // } // void CTopTitleMgr::UpdateBaseRankData() // { // // 增加头衔排行榜引用计数 // AddTopRankRef(); // CDataClient* pDbClient = GetLogicServer()->GetDbClient(); // if (pDbClient->connected()) // { // CDataPacket &DataPacket =pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveBaseRank); // int nServerId = GetLogicServer()->GetServerIndex(); // DataPacket << nServerId << nServerId; // GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket); // } // } void CTopTitleMgr::maintainTopTitle() { // const int FIRST_TOP = 1; //排行榜第一名 // int nRankIndex = 0; // int nTitle =0; // int nJobTipIndex = 0; // for (int i =0; i< MAX_TOP_TITLE_COUNT; i++) // { // if (i ==0) // { // nRankIndex = rtMagicianLevel;//第一法师 // nTitle = MAX_TOP_TITLE_MASTER; // nJobTipIndex = tpJobNameMagician; // } // else if (i == 1) // { // nRankIndex = rtWarriorLevel;//第一战士 // nTitle = MAX_TOP_TITLE_WARRIOR; // nJobTipIndex = tpJobNameWarrior; // } // else if (i == 2) // { // nRankIndex = rtWizardLevel;//第一道士 // nTitle = MAX_TOP_TITLE_WIZARD; // nJobTipIndex = tpJobNameWizard; // } // unsigned int nOldActorId = (unsigned int)GetGlobalLogicEngine()->GetMiscMgr().GetSystemStaticVarValue(szTopTitleRand[i],0); // PTOPTITLERANKINFO pRankInfo = GetActorInfoByCsRank(nRankIndex,FIRST_TOP); // unsigned int nActorId = pRankInfo != NULL ? pRankInfo->m_nActorId:0; // GetGlobalLogicEngine()->GetMiscMgr().SetSystemStaticVarValue(szTopTitleRand[i],nActorId); // if (nOldActorId > 0 && nActorId != nOldActorId) // { // CActor *oldActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nOldActorId); // if(oldActor != NULL) // { // oldActor->GetNewTitleSystem().delNewTitle(nTitle); // } // } // if (nActorId > 0 && nActorId != nOldActorId) // { // CActor *pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId); // if(pActor != NULL) // { // // pActor->GetNewTitleSystem().addNewTitle(nTitle); // pActor->GetNewTitleSystem().SetCurNewTitle(nTitle); // } // char msg[256]; // LPCTSTR pFormat = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpMaintainTopTitle); // LPCTSTR pJogName = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(nJobTipIndex); // sprintf(msg, pFormat, pRankInfo->m_sName, pJogName); // GetGlobalLogicEngine()->GetEntityMgr()->BroadcastTipmsg(msg,ttScreenCenter + ttChatWindow); // } // } } //获取排行榜的第几名的角色id unsigned int CTopTitleMgr::GetActorIdByCsRank(INT_PTR nRankIndex,int nRank) { PTOPTITLERANKINFO pRankInfo = GetActorInfoByCsRank(nRankIndex,nRank); if (pRankInfo) { return pRankInfo->m_nActorId; } return 0; } PTOPTITLERANKINFO CTopTitleMgr::GetActorInfoByCsRank(INT_PTR nRankIndex,int nRank) { if(MAX_RANK_COUNT <= nRankIndex) return NULL; RANKUSERLIST& list = m_rankActorList[nRankIndex]; if(list.count() < nRank) { return NULL; } for(INT_PTR j=0; j< list.count();j ++ ) { TOPTITLERANKINFO &data = list[j]; if(data.m_nRank == nRank) { return &data; } } return NULL; } void CTopTitleMgr::OnDbReturnData(INT_PTR nCmd,char * data,SIZE_T size) { // if (nCmd == jxInterSrvComm::DbServerProto::dcSaveBaseRank) // { // CDataPacketReader inPacket(data, size); // int nRawServerId = 0, nLoginServerId = 0; // BYTE nErrorCode; // inPacket >> nRawServerId >> nLoginServerId >> nErrorCode; // if (nErrorCode != jxInterSrvComm::DbServerProto::reSucc) // { // OutputMsg(rmError,_T("Save BaseRank Error!code=%d"),nErrorCode); // return; // } // // else // // { // // // 减少更新排行榜引用计数 // // ReleaseTopRankRef(); // // } // } // // 读取排行榜入内存 // if (nCmd == dcLoadBaseRank) // { // CDataPacketReader inPacket(data, size); // int nRawServerId = 0, nLoginServerId = 0; // BYTE nErrorCode; // inPacket >> nRawServerId >> nLoginServerId >> nErrorCode; // if (nErrorCode == jxInterSrvComm::DbServerProto::reSucc) // { // int nCount = 0; // inPacket >> nCount; // //初始化 // for (INT_PTR i = 0; i < MAX_RANK_COUNT; i++) // { // RANKUSERLIST& list = m_rankActorList[i]; // list.clear(); // } // for (INT_PTR i = 0; i < nCount; i ++) // { // TOPTITLERANKINFO info; // inPacket >> info.m_nActorId >> info.m_nRankId >> info.m_nRank >> info.m_nValue>> info.m_nParam; // inPacket.readString(info.m_sName,ArrayCount(info.m_sName)); // INT_PTR nRankIndex = (INT_PTR)(info.m_nRankId); // if ((nRankIndex < MAX_RANK_COUNT) && (nRankIndex >= 0) ) // { // RANKUSERLIST& list = m_rankActorList[nRankIndex]; // list.add(info); // } // } // m_bInit = true; // //更新在线玩家头衔 // //SetOnlineActorHeadTitle(); // //ResetOfflineUser(); // //标记更新雕像嘀嗒 // TICKCOUNT nCurrTime = GetGlobalLogicEngine()->getTickCount(); // //m_nDelay = nCurrTime + 30000; // m_nDelay = nCurrTime + 60*10; // int nMaxTopLevel = GetGlobalLogicEngine()->GetMiscMgr().GetSystemStaticVarValue(szTopMaxLevel); // int nToplevel = GetTopLevel(); // if(nToplevel > nMaxTopLevel) // SetTopMaxLevel(nToplevel); // } // else // { // OutputMsg(rmError,_T("Load TopTitleRank Error!code=%d"),nErrorCode); // return; // } // } } //依据type 发送rank // void CTopTitleMgr::SendTopRankData(CActor * m_pEntity) // { // // if(type > MAX_RANK_COUNT) // // return; // if(!m_bInit) // { // UpdateBaseRankData(); // Load(); // return; // } // int nDays = GetLogicServer()->GetDaysSinceOpenServer(); // if(nDays > 1) // { // if(m_pEntity == NULL) return; // CActorPacket AP; // CDataPacket& DataPacket = m_pEntity->AllocPacket(AP); // //CVector& List = GetGlobalLogicEngine()->GetRankingMgr().GetList(); // DataPacket << (BYTE)enMiscSystemID << (BYTE)sRankData; // DataPacket << (BYTE)MAX_RANK_COUNT; // // int rankNum = m_rankActorList.size(); // for(int i = 0; i < MAX_RANK_COUNT; i++) // { // DataPacket << (BYTE)i; // RANKUSERLIST& rank = m_rankActorList[i]; // int count = rank.count(); // DataPacket << (BYTE)count; // for(int j = 0; j < count; j++) // { // int k = j+1; // DataPacket << (BYTE)k; // unsigned int actorid = rank[j].m_nActorId; // DataPacket << (unsigned int)actorid; // DataPacket << (int )rank[j].m_nValue; // DataPacket << (int )rank[j].m_nParam; // DataPacket.writeString(rank[j].m_sName); // } // } // AP.flush(); // } // } //重置玩家的离线消息,将请求 void CTopTitleMgr::ResetOfflineUser() { // COfflineUserMgr & mgr = GetGlobalLogicEngine()->GetOfflineUserMgr(); // mgr.RemoveAllUser(); //先全部清除 // mgr.RemoveAllUserHero(); //清除全部英雄信息 // for (INT_PTR i = 0; i < MAX_RANK_COUNT; i++) // { // RANKUSERLIST& list = m_rankActorList[i]; // for(INT_PTR j=0; j< list.count();j ++ ) // { // TOPTITLERANKINFO &data = list[j]; // if (data.m_nActorId <= 0) // continue; // if (data.m_nRankId >= rtHeroLevel && data.m_nRankId <= rtWizardHeroBp) // { // if (data.m_nParam <= 0) // continue; // mgr.LoadUserHero(data.m_nActorId, data.m_nParam); // } // else if (data.m_nRankId == rtMagicItemBp) // { // //mgr.LoadMagicData(data.m_nActorId); // } // else // { // mgr.LoadUser(data.m_nActorId); // } // } // } } bool CTopTitleMgr::SetOnlineActorHeadTitle() { bool bSet = false; CVector pEntityList; pEntityList.clear(); GetGlobalLogicEngine()->GetEntityMgr()->GetOnlineAcotrPtrList(pEntityList); INT_PTR nCount = pEntityList.count(); for (INT_PTR i = 0; i < nCount; i++) { CActor *pActor = (CActor *)pEntityList[i]; if (pActor && pActor->GetType() == enActor) { // if (pActor->OnGetIsTestSimulator() // || pActor->OnGetIsSimulator() ) // { // continue;   // }   bSet = SetRankHeadTitle(pActor); } } return bSet; } // void CTopTitleMgr::UpdateRankData() // { // // 清空引用计数 // m_nRefCount = 0; // this->UpdateBaseRankData(); // //GetGlobalLogicEngine()->GetCampComponent().UpdateWorldCampContrRankEveryDay(); // } void CTopTitleMgr::ResetNpcStatue() { // CMiscProvider &provider = GetLogicServer()->GetDataProvider()->GetMiscConfig(); // CVector *pNpcStatueList = provider.GetNpcStatueList(); // for (int i = 0; i < pNpcStatueList->count(); i++) // { // NPCSTATUE npc = pNpcStatueList->get(i); // CNpc *pNpc = CNpc::GetNpcPtr(npc.sSceneName, npc.sNpcName); // if (pNpc) // { // //pNpc->ChangeShowName(g_nRadius, npc.sNpcName); // //pNpc->SetProperty(PROP_ENTITY_ID, 0); // // 设置属性 // //pNpc->SetModelId(0); // //pNpc->SetWeaponAppearId(0); // //pNpc->SetTitle(npc.sTitle); // } // } } bool CTopTitleMgr::SetNpcStatue(INT_PTR nType, INT_PTR nActorId, LPCTSTR sName, INT_PTR nSex, INT_PTR nParam) { // CMiscProvider &provider = GetLogicServer()->GetDataProvider()->GetMiscConfig(); // PNPCSTATUE pStatue = provider.GetNpcStatue(nType, nParam); // if (pStatue == NULL) return false; // CNpc *pNpc = CNpc::GetNpcPtr(pStatue->sSceneName, pStatue->sNpcName); // if (pNpc == NULL) // { // OutputMsg(rmError, "set npc statue error, npc can not be found!npcName=%s", pStatue->sNpcName); // return false; // } // if (nActorId == 0) // { // pNpc->ChangeShowName(g_nRadius, (LPCTSTR)pStatue->sNpcName); // } // else // { // pNpc->ChangeShowName(g_nRadius, sName); // } // pNpc->SetProperty(PROP_ENTITY_ID, (unsigned int)nActorId); // INT_PTR nModelId = pStatue->nMaleModelId; // if (nSex == 1) // nModelId = pStatue->nFemaleModelId; // pNpc->ChangeModel(g_nRadius, (int)nModelId); return true; } void CTopTitleMgr::UpdateRawRankList() { // INT_PTR nServerId = GetLogicServer()->GetServerIndex(); // COfflineUserMgr &mgr = GetGlobalLogicEngine()->GetOfflineUserMgr(); // m_RawRankList.clear(); // for (INT_PTR i = rtWarriorBp; i <= rtWizardBp; ++ i) // { // if (m_rankActorList[i].count() == 0) // continue; // TOPTITLERANKINFO &info = m_rankActorList[i][0]; // COfflineUser *pUser = mgr.GetUserByActorId(info.m_nActorId, true); // INT_PTR nVocation = pUser->nVocation; // if (nVocation <= enVocNone || nVocation >= enMaxVocCount) // continue; // RANKDATA tmpData; // tmpData.nActorId = info.m_nActorId; // strcpy(tmpData.sName, pUser->name); // tmpData.sName[sizeof(tmpData.sName)-1] = 0; // tmpData.nSex = pUser->nSex; // tmpData.nVocation = pUser->nVocation; // tmpData.nServerId = (int)nServerId; // tmpData.nValue = pUser->nBattlePower; // m_RawRankList.add(tmpData); // } // m_nDelay = 0; } void CTopTitleMgr::UpdateVocNpcStatue(INT_PTR nType) { if (nType != stRsVocation && nType != stCsVocation) return; COfflineUserMgr &offMgr = GetGlobalLogicEngine()->GetOfflineUserMgr(); CVector *pNpcList = GetLogicServer()->GetDataProvider()->GetMiscConfig().GetNpcStatueList(); for (INT_PTR i = 0; i < pNpcList->count(); ++ i) { NPCSTATUE npc = pNpcList->get(i); if ((INT_PTR)npc.btType != nType) continue; bool bSet = false; if (nType == stRsVocation) { for (INT_PTR j = 0; j < m_RawRankList.count(); ++ j) { PRANKDATA pData = &m_RawRankList[j]; if (pData->nVocation == (unsigned int)npc.btParam) { SetNpcStatue(nType, pData->nActorId, pData->sName, pData->nSex, pData->nVocation); bSet = true; break; } } } else { for (INT_PTR j = 0; j < m_CsRankList.count(); ++ j) { PRANKDATA pData = &m_CsRankList[j]; if (pData->nVocation == (unsigned int)npc.btParam) { SetNpcStatue(nType, pData->nActorId, pData->sName, pData->nSex, pData->nVocation); bSet = true; break; } } } if (!bSet) { SetNpcStatue(nType, 0, npc.sNpcName, 0, npc.btParam); } } } void CTopTitleMgr::SaveCsRank() { CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); CDataPacket &packet = pSSClient->allocProtoPacket(jxInterSrvComm::SessionServerProto::cSaveCsRank); INT_PTR nCount = m_RawRankList.count(); packet << (WORD)nCount; for (INT_PTR i = 0; i < nCount; i++) { RANKDATA data = m_RawRankList[i]; packet.writeBuf(&data, sizeof(RANKDATA)); } pSSClient->flushProtoPacket(packet); OutputMsg(rmTip, _T("发消息给Session保存跨服排行榜!")); } void CTopTitleMgr::LoadCsRank() { CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); CDataPacket &packet = pSSClient->allocProtoPacket(jxInterSrvComm::SessionServerProto::cLoadCsRank); pSSClient->flushProtoPacket(packet); OutputMsg(rmTip, _T("发消息给Session获取跨服排行榜!")); } void CTopTitleMgr::ClearCsRank(INT_PTR nServerId) { CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); CDataPacket &packet = pSSClient->allocProtoPacket(jxInterSrvComm::SessionServerProto::cClearCsRank); packet << (int)nServerId; pSSClient->flushProtoPacket(packet); OutputMsg(rmTip, _T("发消息给Session清除跨服排行榜!ServerId=%d"), nServerId); } void CTopTitleMgr::BroadLogicToSaveCsRank() { char buff[256] = {0}; CDataPacket packet(buff, sizeof(buff)); WORD nCmd = (WORD)jxInterSrvComm::SessionServerProto::lcBroadToSaveCsRank; CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); pSSClient->BroadMsgToLogicClient(nCmd, packet.getMemoryPtr(), packet.getLength()); } void CTopTitleMgr::BroadLogicToLoadCsRank() { char buff[256] = {0}; CDataPacket packet(buff, sizeof(buff)); WORD nCmd = (WORD)jxInterSrvComm::SessionServerProto::lcBroadToLoadCsRank; CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); pSSClient->BroadMsgToLogicClient(nCmd, packet.getMemoryPtr(), packet.getLength()); } void CTopTitleMgr::OnSSDBReturnData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader) { if (jxInterSrvComm::SessionServerProto::sLoadCsRank == nCmd) { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { OutputMsg(rmError, "LoadCsRank Error! Code=%d", nErrorCode); return; } int nCount = 0; m_CsRankList.clear(); reader >> nCount; for (INT_PTR i = 0; i < nCount; i++) { RANKDATA data; reader.readBuf(&data, sizeof(RANKDATA)); m_CsRankList.add(data); } //更新NPC雕像 UpdateVocNpcStatue(stCsVocation); } } void CTopTitleMgr::OnOtherLogicServerRetData(int nCmd, int nOtherServerId, CDataPacketReader &reader) { switch (nCmd) { case jxInterSrvComm::SessionServerProto::lcSaveOfflineData: { SetUserOfflineData(reader); } break; case jxInterSrvComm::SessionServerProto::lcLoadOfflineData: { unsigned int nActorId = 0; reader >> nActorId; ReturnUserOfflineData(nOtherServerId, nActorId); } break; case jxInterSrvComm::SessionServerProto::lcBroadToSaveCsRank: { SaveCsRank(); } break; case jxInterSrvComm::SessionServerProto::lcBroadToLoadCsRank: { LoadCsRank(); } break; /* case jxInterSrvComm::SessionServerProto::lcClearHundredServerCsRank: { GetGlobalLogicEngine()->GetMiscMgr().ClearHundredCrossRank(); break; } case jxInterSrvComm::SessionServerProto::lcBroadTreasureAuctionCsRank: { //GetGlobalLogicEngine()->GetMiscMgr().OtherWuYiAuctionRankToLocal(reader); break; } */ } } void CTopTitleMgr::SetUserOfflineData(CDataPacketReader &reader) { // unsigned int nActorId = 0; // reader >> nActorId; // if (nActorId <= 0) // return; // bool isExit; // COfflineUserMgr &mgr = GetGlobalLogicEngine()->GetOfflineUserMgr(); // COfflineUser *pUser = mgr.AddOffLineUser(nActorId, isExit); // if (!isExit && pUser) // { // mgr.OnLoadActorBasic(nActorId, reader); // mgr.OnLoadActorOther(nActorId, reader); // } } void CTopTitleMgr::LoadUserOfflineData(int nDestServerId, unsigned int nActorId) { // if (nActorId <= 0 || nDestServerId <= 0) // return; // //本服的不需要跨服请求 // if (GetLogicServer()->GetServerIndex() == nDestServerId) // { // COfflineUser *pUser = GetGlobalLogicEngine()->GetOfflineUserMgr().GetUserByActorId(nActorId, true); // return; // } // //有数据不需要请求 // if (GetGlobalLogicEngine()->GetOfflineUserMgr().GetUserByActorId(nActorId)) // { // return; // } // char buff[256] = {0}; // CDataPacket packet(buff, sizeof(buff)); // WORD nCmd = (WORD)jxInterSrvComm::SessionServerProto::lcLoadOfflineData; // packet << (unsigned int)nActorId; // CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); // pSSClient->SendMsgToDestLogicClient(nCmd, nDestServerId, packet.getMemoryPtr(), packet.getLength()); } void CTopTitleMgr::ReturnUserOfflineData(int nDestServerId, unsigned int nActorId) { // if (nActorId <= 0) // return; // int nRawServerId = GetLogicServer()->GetServerIndex(); // if (nDestServerId == nRawServerId) // return; // COfflineUser *pUser = GetGlobalLogicEngine()->GetOfflineUserMgr().GetUserByActorId(nActorId, true); // if (pUser == NULL || pUser->name[0] == '\0') // return; // CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); // CDataPacket &packet = pSSClient->allocProtoPacket(jxInterSrvComm::SessionServerProto::cBroadcastOr1SrvMessage); // packet << (int)nDestServerId << (int)nRawServerId; // packet << (WORD)jxInterSrvComm::SessionServerProto::lcSaveOfflineData; // packet << nActorId; // packet.writeBuf(pUser, sizeof(ActorOfflineMsg)); // //packet << pUser->gemData; // INT_PTR nPos = packet.getPosition(); // packet << (int)0; // int nCount = 0; // for(INT_PTR i = 0; i < CEquipVessel::EquipmentCount; i++) // { // CUserItem *pUserItem = pUser->equips.m_Items[i]; // if (pUserItem) // { // ((CUserItem)*pUserItem) >> packet; // // packet.writeBuf(pUserItem, sizeof(CUserItem)); // nCount++; // } // } // int *pCount = (int *)packet.getPositionPtr(nPos); // *pCount = (int)nCount; // pSSClient->flushProtoPacket(packet); } int CTopTitleMgr::GetServerIdByCsRank(unsigned int nActorId) { if (nActorId <= 0) return 0; for (INT_PTR i = 0; i < m_CsRankList.count(); i++) { RANKDATA &data = m_CsRankList[i]; if (data.nActorId == nActorId) { return data.nServerId; } } return 0; } bool CTopTitleMgr::SetRankHeadTitle(CActor *pActor) { if (pActor == NULL) return false; unsigned int nActorId = pActor->GetId(); CVector &tTitleList = GetLogicServer()->GetDataProvider()->GetAchieveConfig().GetTopTitleList(); INT_PTR nConfigCount = tTitleList.count(); if (nConfigCount <= 0) return false; for (INT_PTR i = 0; i < nConfigCount; ++i) { TOPTITLECONFIG &tTitleConfig = tTitleList[i]; INT_PTR nRankIndex = (INT_PTR)(tTitleConfig.nRankId); if (nRankIndex < 0 || nRankIndex >= MAX_RANK_COUNT) continue; RANKUSERLIST &data = m_rankActorList[nRankIndex]; INT_PTR nRankCount = data.count(); INT_PTR nMinRank = __min(tTitleConfig.nMinRank, tTitleConfig.nMaxRank); INT_PTR nMaxRank = __max(tTitleConfig.nMinRank, tTitleConfig.nMaxRank); bool bSetFlag = false; for (INT_PTR j = 0; j < nRankCount; ++j) { TOPTITLERANKINFO& info = data[j]; if (info.m_nActorId == nActorId && info.m_nRank >= nMinRank && info.m_nRank <= nMaxRank) { bSetFlag = true; pActor->SetHeadTitle(tTitleConfig.nTitleId, true); break; } } if (!bSetFlag) pActor->SetHeadTitle(tTitleConfig.nTitleId, false); } return true; } void CTopTitleMgr::SetTopMaxLevel(int nLevel) { if(nLevel > nMaxTopLevel) { nMaxTopLevel = nLevel; GetGlobalLogicEngine()->GetMiscMgr().SetSystemStaticVarValue(szTopMaxLevel,nMaxTopLevel); } } int CTopTitleMgr::GetTopLevel() { RANKUSERLIST& list = m_rankActorList[rtAllLevel]; if(list.count() <= 0 ) { return 1; } return list[0].m_nValue; }