737 lines
21 KiB
C++
737 lines
21 KiB
C++
|
|
#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<CRanking*>& 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<void*> 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<NPCSTATUE> *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<UINT>(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<unsigned int>(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<NPCSTATUE> *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<TOPTITLECONFIG> &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;
|
|||
|
|
}
|