Jump to content
Sign in to follow this  
Graf

Рейтинг над головой персонажа

Recommended Posts

Рейтинг над головой персонажа

image.png.ce27754b752b4511816da230151cfd1b.png

Чтобы добавить рейтинг, нужно в исходном коде клиента открыть файл UIHeadSay.cpp, найти:

#ifdef _LOG_NAME_                     //и§’и‰ІеђЌз§°
    if( CCharacter::IsShowLogName )
    {
		CChaStateMgr* pState = _pOwn->GetStateMgr();
		int nCount = pState->GetSkillStateNum();
		for( int i=0; i<nCount; i++ )
		{
			y -= 20;
			CGuiFont::s_Font.Render( pState->GetSkillState(i)->szName, x, y, COLOR_WHITE );
		}
    }
#endif

и ниже вписать:

// Вывод рейтинга
	if (_pOwn->IsPlayer()) {
	
		if (_IsShowName) {
			if (_pOwn->getGuildID())
				y -= 14;
			char RenderTextRating[32] = {0};
			sprintf(RenderTextRating, "- [%d] -", CalculateRating(_pOwn->getGameAttr()));
			int RatingLength =  CGuiFont::s_Font.GetWidth(RenderTextRating);
			CGuiFont::s_Font.Render(RenderTextRating, x - (RatingLength / 2), y - 28, 0xFF000000 );
			CGuiFont::s_Font.Render(RenderTextRating, x - (RatingLength / 2) - 1, y - 28 - 1, 0xFF00FFFF );	
		}
	
	}

 

Найти функцию:

void CHeadSay::SetName( const char* name )
{
    _nChaNameOffX = 0 - CGuiFont::s_Font.GetWidth( name )/2;
}

И ниже вставить:

// Подсчет рейтинга
inline int CalculateRating(SGameAttr* attrArr) {
	int result = 0;
	result += attrArr->get(ATTR_HP);
	return result;
}

 

В данном примере рейтинг выводит количество ATTR_HP (ХП персонажа).

Вы можете настроить свои формулы, к примеру сумму основных характеристик персонажа.

 

Edited by Graf
  • Thanks 1

Share this post


Link to post
Share on other sites
// Вывод рейтинга
if (_IsShowName && _pOwn->IsPlayer())
{
	if (_pOwn->getGuildID())
		y -= 14;
	
	static char szTextRating[32u] = { 0 };
	sprintf(szTextRating, "- [%d] -", CalculateRating(_pOwn));
	
	static const DWORD COLOR_TEXT_RATING = 0xFF00FFFF;
	const int nDrawX =  x - (CGuiFont::s_Font.GetWidth(szTextRating) / 2);
	const int nDrawY =  y - 28;
	
	CGuiFont::s_Font.BRender(szTextRating, nDrawX, nDrawY, COLOR_TEXT_RATING, COLOR_BLACK);	
}

 

// Подсчет рейтинга
inline int CalculateRating(const CCharacter* pCha) 
{
	const SGameAttr* pGameAttr = pCha->getGameAttr();
	
	int nPowerCounter = 0;
	nPowerCounter += pGameAttr->get(ATTR_HP);
	
	return nPowerCounter;
}

 

Функцию CalculateRating() хорошо было бы сделать членом какого-нибудь класса, например class CHeadSay или class CCharacter.

 

Вопрос: будет ли это работать для персонажей других игроков? Так как есть сомнения, что сервер присылает (синхронизирует) характеристики других персонажей нашему клиенту, и для других игроков рейтинг будет отображаться некорректно. Если код задумывался для отображения рейтинга только нашего персонажа, то можно заменить:

if (_IsShowName && _pOwn->IsPlayer())

на:

if (_IsShowName && _pOwn->IsMainCha())

 

Стоит учесть, что в некоторых случаях рейтинг персонажа может уйти в минус. Если говорить про ATTR_HP, то лучше взять ATTR_MXHP, и так далее.

 

 

P.S. Не тестил код выше.

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...