mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 22:48:18 +00:00
- new browser icon - fixed overlay - colorizing ping
This commit is contained in:
parent
e1152c25e5
commit
8e09a80e22
|
@ -46,6 +46,8 @@ CServerBrowser::CServerBrowser()
|
|||
m_NumServers = 0;
|
||||
m_NumServerCapacity = 0;
|
||||
|
||||
m_NumPlayers = 0;
|
||||
|
||||
// the token is to keep server refresh separated from each other
|
||||
m_CurrentToken = 1;
|
||||
|
||||
|
@ -64,6 +66,7 @@ int CServerBrowser::AddFilter(int SortHash, int Ping, int Country, const char* p
|
|||
Filter.m_pSortedServerlist = 0;
|
||||
Filter.m_NumSortedServers = 0;
|
||||
Filter.m_NumSortedServersCapacity = 0;
|
||||
Filter.m_NumPlayers = 0;
|
||||
Filter.m_pServerBrowser = this;
|
||||
m_lFilters.add(Filter);
|
||||
|
||||
|
@ -101,7 +104,7 @@ const void *CServerBrowser::GetID(int FilterIndex, int Index) const
|
|||
|
||||
CServerBrowser::CServerFilter::~CServerFilter()
|
||||
{
|
||||
mem_free(m_pSortedServerlist);;
|
||||
mem_free(m_pSortedServerlist);
|
||||
}
|
||||
|
||||
bool CServerBrowser::CServerFilter::SortCompareName(int Index1, int Index2) const
|
||||
|
@ -154,6 +157,7 @@ void CServerBrowser::CServerFilter::Filter()
|
|||
int i = 0, p = 0;
|
||||
int NumServers = m_pServerBrowser->m_NumServers;
|
||||
m_NumSortedServers = 0;
|
||||
m_NumPlayers = 0;
|
||||
|
||||
// allocate the sorted list
|
||||
if(m_NumSortedServersCapacity < NumServers)
|
||||
|
@ -257,7 +261,10 @@ void CServerBrowser::CServerFilter::Filter()
|
|||
}
|
||||
|
||||
if(!(m_SortHash&FILTER_FRIENDS) || m_pServerBrowser->m_ppServerlist[i]->m_Info.m_FriendState != IFriends::FRIEND_NO)
|
||||
{
|
||||
m_pSortedServerlist[m_NumSortedServers++] = i;
|
||||
m_NumPlayers += m_pServerBrowser->m_ppServerlist[i]->m_Info.m_NumPlayers;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -369,6 +376,9 @@ void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info)
|
|||
pEntry->m_Info.m_Flags |= FLAG_PUREMAP;
|
||||
pEntry->m_Info.m_Favorite = Fav;
|
||||
pEntry->m_Info.m_NetAddr = pEntry->m_Addr;
|
||||
|
||||
m_NumPlayers += pEntry->m_Info.m_NumPlayers;
|
||||
|
||||
pEntry->m_GotInfo = 1;
|
||||
}
|
||||
|
||||
|
@ -472,8 +482,12 @@ void CServerBrowser::Refresh(int Type)
|
|||
// clear out everything
|
||||
m_ServerlistHeap.Reset();
|
||||
m_NumServers = 0;
|
||||
m_NumPlayers = 0;
|
||||
for(int i = 0; i < m_lFilters.size(); i++)
|
||||
{
|
||||
m_lFilters[i].m_NumSortedServers = 0;
|
||||
m_lFilters[i].m_NumPlayers = 0;
|
||||
}
|
||||
mem_zero(m_aServerlistIp, sizeof(m_aServerlistIp));
|
||||
m_pFirstReqServer = 0;
|
||||
m_pLastReqServer = 0;
|
||||
|
@ -679,6 +693,14 @@ void CServerBrowser::AddFavorite(const NETADDR &Addr)
|
|||
str_format(aBuf, sizeof(aBuf), "added fav, %s", aAddrStr);
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf);
|
||||
}
|
||||
|
||||
// refresh servers in all filters where favorites are filtered
|
||||
for(int i = 0; i < m_lFilters.size(); i++)
|
||||
{
|
||||
CServerFilter *pFilter = &m_lFilters[i];
|
||||
if(pFilter->m_SortHash&FILTER_FAVORITE)
|
||||
pFilter->Sort();
|
||||
}
|
||||
}
|
||||
|
||||
void CServerBrowser::RemoveFavorite(const NETADDR &Addr)
|
||||
|
@ -697,9 +719,17 @@ void CServerBrowser::RemoveFavorite(const NETADDR &Addr)
|
|||
if(pEntry)
|
||||
pEntry->m_Info.m_Favorite = 0;
|
||||
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// refresh servers in all filters where favorites are filtered
|
||||
for(int i = 0; i < m_lFilters.size(); i++)
|
||||
{
|
||||
CServerFilter *pFilter = &m_lFilters[i];
|
||||
if(pFilter->m_SortHash&FILTER_FAVORITE)
|
||||
pFilter->Sort();
|
||||
}
|
||||
}
|
||||
|
||||
bool CServerBrowser::IsRefreshing() const
|
||||
|
|
|
@ -42,6 +42,8 @@ public:
|
|||
int m_NumSortedServers;
|
||||
int m_NumSortedServersCapacity;
|
||||
|
||||
int m_NumPlayers;
|
||||
|
||||
int *m_pSortedServerlist;
|
||||
|
||||
~CServerFilter();
|
||||
|
@ -73,8 +75,10 @@ public:
|
|||
int LoadingProgression() const;
|
||||
|
||||
int NumServers() const { return m_NumServers; }
|
||||
int NumPlayers() const { return m_NumPlayers; }
|
||||
|
||||
int NumSortedServers(int Index) const { return m_lFilters[Index].m_NumSortedServers; }
|
||||
int NumSortedPlayers(int Index) const { return m_lFilters[Index].m_NumPlayers; }
|
||||
const CServerInfo *SortedGet(int FilterIndex, int Index) const;
|
||||
const void *GetID(int FilterIndex, int Index) const;
|
||||
|
||||
|
@ -114,6 +118,8 @@ private:
|
|||
int m_NumServers;
|
||||
int m_NumServerCapacity;
|
||||
|
||||
int m_NumPlayers;
|
||||
|
||||
// the token is to keep server refresh separated from each other
|
||||
int m_CurrentToken;
|
||||
|
||||
|
|
|
@ -105,8 +105,10 @@ public:
|
|||
virtual int LoadingProgression() const = 0;
|
||||
|
||||
virtual int NumServers() const = 0;
|
||||
virtual int NumPlayers() const = 0;
|
||||
|
||||
virtual int NumSortedServers(int Index) const = 0;
|
||||
virtual int NumSortedPlayers(int Index) const = 0;
|
||||
virtual const CServerInfo *SortedGet(int FilterIndex, int Index) const = 0;
|
||||
virtual const void *GetID(int FilterIndex, int Index) const = 0;
|
||||
|
||||
|
|
|
@ -279,6 +279,21 @@ int CMenus::DoButton_SpriteClean(int ImageID, int SpriteID, const CUIRect *pRect
|
|||
return ReturnValue;
|
||||
}
|
||||
|
||||
int CMenus::DoButton_MouseOver(int ImageID, int SpriteID, const CUIRect *pRect)
|
||||
{
|
||||
int Inside = UI()->MouseInside(pRect);
|
||||
|
||||
Graphics()->TextureSet(g_pData->m_aImages[ImageID].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, Inside ? 1.0f : 0.6f);
|
||||
RenderTools()->SelectSprite(SpriteID);
|
||||
IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
return Inside;
|
||||
}
|
||||
|
||||
int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden, int Corners)
|
||||
{
|
||||
int Inside = UI()->MouseInside(pRect);
|
||||
|
|
|
@ -52,6 +52,8 @@ class CMenus : public CComponent
|
|||
int DoButton_CheckBox(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
|
||||
int DoButton_CheckBox_Number(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
|
||||
|
||||
int DoButton_MouseOver(int ImageID, int SpriteID, const CUIRect *pRect);
|
||||
|
||||
/*static void ui_draw_menu_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
|
||||
static void ui_draw_keyselect_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
|
||||
static void ui_draw_menu_tab_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
|
||||
|
@ -269,7 +271,7 @@ class CMenus : public CComponent
|
|||
enum
|
||||
{
|
||||
FILTER_CUSTOM=0,
|
||||
FILTER_ALL=0,
|
||||
FILTER_ALL,
|
||||
FILTER_STANDARD,
|
||||
FILTER_FAVORITES,
|
||||
};
|
||||
|
@ -287,6 +289,7 @@ class CMenus : public CComponent
|
|||
void SetFilter(int Num);
|
||||
|
||||
int NumSortedServers() const;
|
||||
int NumPlayers() const;
|
||||
const CServerInfo *SortedGet(int Index) const;
|
||||
const void *ID(int Index) const;
|
||||
};
|
||||
|
@ -296,8 +299,27 @@ class CMenus : public CComponent
|
|||
void RemoveFilter(int FilterIndex);
|
||||
void Move(bool Up, int Filter);
|
||||
|
||||
struct CServerEntry
|
||||
class CInfoOverlay
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
OVERLAY_SERVERINFO=0,
|
||||
OVERLAY_HEADERINFO,
|
||||
};
|
||||
|
||||
int m_Type;
|
||||
const void *m_pData;
|
||||
float m_X;
|
||||
float m_Y;
|
||||
};
|
||||
|
||||
CInfoOverlay m_InfoOverlay;
|
||||
bool m_InfoOverlayActive;
|
||||
|
||||
class CServerEntry
|
||||
{
|
||||
public:
|
||||
int m_Filter;
|
||||
int m_Index;
|
||||
};
|
||||
|
@ -309,17 +331,16 @@ class CMenus : public CComponent
|
|||
FIXED=1,
|
||||
SPACER=2,
|
||||
|
||||
COL_FLAG_LOCK=0,
|
||||
COL_FLAG_PURE,
|
||||
COL_FLAG_FAV,
|
||||
COL_FLAG=0,
|
||||
COL_NAME,
|
||||
COL_GAMETYPE,
|
||||
COL_MAP,
|
||||
COL_PLAYERS,
|
||||
COL_PING,
|
||||
COL_VERSION,
|
||||
COL_FAVORITE,
|
||||
COL_INFO,
|
||||
|
||||
NUM_COLS=10,
|
||||
NUM_COLS=9,
|
||||
};
|
||||
|
||||
struct CColumn
|
||||
|
@ -362,14 +383,16 @@ class CMenus : public CComponent
|
|||
// found in menus_browser.cpp
|
||||
int m_ScrollOffset;
|
||||
void RenderServerbrowserServerList(CUIRect View);
|
||||
void RenderServerbrowserServerDetail(CUIRect View);
|
||||
void RenderServerbrowserServerDetail(CUIRect View, const CServerInfo *pInfo);
|
||||
void RenderServerbrowserFilters(CUIRect View);
|
||||
void RenderServerbrowserFriends(CUIRect View);
|
||||
void RenderServerbrowserOverlay();
|
||||
bool RenderFilterHeader(CUIRect View, int FilterIndex);
|
||||
int DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *pEntry);
|
||||
void RenderServerbrowser(CUIRect MainView);
|
||||
static void ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainServerbrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
void SetOverlay(int Type, float x, float y, const void *pData);
|
||||
|
||||
// found in menus_settings.cpp
|
||||
void RenderLanguageSelection(CUIRect MainView);
|
||||
|
|
|
@ -19,16 +19,15 @@
|
|||
#include "menus.h"
|
||||
|
||||
CMenus::CColumn CMenus::ms_aCols[] = {
|
||||
{-1, -1, " ", -1, 2.0f, 0, {0}, {0}},
|
||||
{COL_FLAG_LOCK, -1, " ", -1, 14.0f, 0, {0}, {0}},
|
||||
{COL_FLAG_PURE, -1, " ", -1, 14.0f, 0, {0}, {0}},
|
||||
{COL_FLAG_FAV, -1, " ", -1, 14.0f, 0, {0}, {0}},
|
||||
{COL_NAME, IServerBrowser::SORT_NAME, "Name", 0, 300.0f, 0, {0}, {0}}, // Localize - these strings are localized within CLocConstString
|
||||
{-1, -1, " ", -1, 2.0f, 0, {0}, {0}}, // Localize - these strings are localized within CLocConstString
|
||||
{COL_FLAG, -1, " ", -1, 42.0f, 0, {0}, {0}},
|
||||
{COL_NAME, IServerBrowser::SORT_NAME, "Name", 0, 300.0f, 0, {0}, {0}},
|
||||
{COL_GAMETYPE, IServerBrowser::SORT_GAMETYPE, "Type", 1, 50.0f, 0, {0}, {0}},
|
||||
{COL_MAP, IServerBrowser::SORT_MAP, "Map", 1, 100.0f, 0, {0}, {0}},
|
||||
{COL_PLAYERS, IServerBrowser::SORT_NUMPLAYERS, "Players", 1, 60.0f, 0, {0}, {0}},
|
||||
{-1, -1, " ", 1, 10.0f, 0, {0}, {0}},
|
||||
{COL_PING, IServerBrowser::SORT_PING, "Ping", 1, 40.0f, FIXED, {0}, {0}},
|
||||
{COL_PING, IServerBrowser::SORT_PING, "Ping", 1, 40.0f, 0, {0}, {0}},
|
||||
{COL_FAVORITE, -1, " ", 1, 14.0f, 0, {0}, {0}},
|
||||
{COL_INFO, -1, " ", 1, 14.0f, 0, {0}, {0}},
|
||||
};
|
||||
|
||||
|
||||
|
@ -80,6 +79,11 @@ int CMenus::CBrowserFilter::NumSortedServers() const
|
|||
return m_pServerBrowser->NumSortedServers(m_Filter);
|
||||
}
|
||||
|
||||
int CMenus::CBrowserFilter::NumPlayers() const
|
||||
{
|
||||
return m_pServerBrowser->NumSortedPlayers(m_Filter);
|
||||
}
|
||||
|
||||
const CServerInfo *CMenus::CBrowserFilter::SortedGet(int Index) const
|
||||
{
|
||||
return m_pServerBrowser->SortedGet(m_Filter, Index);
|
||||
|
@ -127,6 +131,15 @@ void CMenus::Move(bool Up, int Filter)
|
|||
}
|
||||
}
|
||||
|
||||
void CMenus::SetOverlay(int Type, float x, float y, const void *pData)
|
||||
{
|
||||
m_InfoOverlayActive = true;
|
||||
m_InfoOverlay.m_Type = Type;
|
||||
m_InfoOverlay.m_X = x;
|
||||
m_InfoOverlay.m_Y = y;
|
||||
m_InfoOverlay.m_pData = pData;
|
||||
}
|
||||
|
||||
int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *pEntry)
|
||||
{
|
||||
// logic
|
||||
|
@ -178,6 +191,7 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
}
|
||||
}
|
||||
|
||||
float TextAplpha = (pEntry->m_NumPlayers == pEntry->m_MaxPlayers || pEntry->m_NumClients == pEntry->m_MaxClients) ? 0.5f : 1.0f;
|
||||
for(int c = 0; c < NUM_COLS; c++)
|
||||
{
|
||||
CUIRect Button;
|
||||
|
@ -189,20 +203,30 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
|
||||
int ID = ms_aCols[c].m_ID;
|
||||
|
||||
if(ID == COL_FLAG_LOCK)
|
||||
if(ID == COL_FLAG)
|
||||
{
|
||||
CUIRect Icon = Button;
|
||||
Button.HMargin(1.5f, &Button);
|
||||
|
||||
if(pEntry->m_Flags&IServerBrowser::FLAG_PURE)
|
||||
{
|
||||
Button.VSplitRight(14.0f, &Button, &Icon);
|
||||
DoButton_Icon(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_TEE, &Icon);
|
||||
Button.VSplitRight(1.0f, &Button, 0);
|
||||
}
|
||||
|
||||
if(pEntry->m_Flags&IServerBrowser::FLAG_PASSWORD)
|
||||
DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_LOCK, &Button);
|
||||
}
|
||||
else if(ID == COL_FLAG_PURE)
|
||||
{
|
||||
if(!(pEntry->m_Flags&IServerBrowser::FLAG_PURE))
|
||||
DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_UNPURE, &Button);
|
||||
Button.VSplitRight(14.0f, &Button, &Icon);
|
||||
DoButton_Icon(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_LOCK, &Icon);
|
||||
Button.VSplitRight(1.0f, &Button, 0);
|
||||
}
|
||||
else if(ID == COL_FLAG_FAV)
|
||||
|
||||
if(pEntry->m_FriendState != IFriends::FRIEND_NO)
|
||||
{
|
||||
if(pEntry->m_Favorite)
|
||||
DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Button);
|
||||
Button.VSplitRight(14.0f, &Button, &Icon);
|
||||
DoButton_Icon(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_HEART_ACTIVE, &Icon);
|
||||
}
|
||||
}
|
||||
else if(ID == COL_NAME)
|
||||
{
|
||||
|
@ -210,6 +234,8 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f * UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Button.w;
|
||||
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
|
||||
if(g_Config.m_BrFilterString[0] && (pEntry->m_QuickSearchHit&IServerBrowser::QUICK_SERVERNAME))
|
||||
{
|
||||
// highlight the parts that matches
|
||||
|
@ -217,9 +243,9 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
if(pStr)
|
||||
{
|
||||
TextRender()->TextEx(&Cursor, pEntry->m_aName, (int)(pStr-pEntry->m_aName));
|
||||
TextRender()->TextColor(0.4f,0.4f,1.0f,1);
|
||||
TextRender()->TextColor(0.4f, 0.4f, 1.0f, TextAplpha);
|
||||
TextRender()->TextEx(&Cursor, pStr, str_length(g_Config.m_BrFilterString));
|
||||
TextRender()->TextColor(1,1,1,1);
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
TextRender()->TextEx(&Cursor, pStr+str_length(g_Config.m_BrFilterString), -1);
|
||||
}
|
||||
else
|
||||
|
@ -234,6 +260,8 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f * UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Button.w;
|
||||
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
|
||||
if(g_Config.m_BrFilterString[0] && (pEntry->m_QuickSearchHit&IServerBrowser::QUICK_MAPNAME))
|
||||
{
|
||||
// highlight the parts that matches
|
||||
|
@ -241,9 +269,9 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
if(pStr)
|
||||
{
|
||||
TextRender()->TextEx(&Cursor, pEntry->m_aMap, (int)(pStr-pEntry->m_aMap));
|
||||
TextRender()->TextColor(0.4f,0.4f,1.0f,1);
|
||||
TextRender()->TextColor(0.4f, 0.4f, 1.0f, TextAplpha);
|
||||
TextRender()->TextEx(&Cursor, pStr, str_length(g_Config.m_BrFilterString));
|
||||
TextRender()->TextColor(1,1,1,1);
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
TextRender()->TextEx(&Cursor, pStr+str_length(g_Config.m_BrFilterString), -1);
|
||||
}
|
||||
else
|
||||
|
@ -254,42 +282,70 @@ int CMenus::DoBrowserEntry(const void *pID, CUIRect *pRect, const CServerInfo *p
|
|||
}
|
||||
else if(ID == COL_PLAYERS)
|
||||
{
|
||||
CUIRect Icon;
|
||||
Button.VMargin(4.0f, &Button);
|
||||
if(pEntry->m_FriendState != IFriends::FRIEND_NO)
|
||||
{
|
||||
Button.VSplitLeft(Button.h, &Icon, &Button);
|
||||
Icon.Margin(2.0f, &Icon);
|
||||
DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Icon);
|
||||
}
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
|
||||
if(g_Config.m_BrFilterSpectators)
|
||||
str_format(aTemp, sizeof(aTemp), "%i/%i", pEntry->m_NumPlayers, pEntry->m_MaxPlayers);
|
||||
str_format(aTemp, sizeof(aTemp), "%d/%d", pEntry->m_NumPlayers, pEntry->m_MaxPlayers);
|
||||
else
|
||||
str_format(aTemp, sizeof(aTemp), "%i/%i", pEntry->m_NumClients, pEntry->m_MaxClients);
|
||||
str_format(aTemp, sizeof(aTemp), "%d/%d", pEntry->m_NumClients, pEntry->m_MaxClients);
|
||||
if(g_Config.m_BrFilterString[0] && (pEntry->m_QuickSearchHit&IServerBrowser::QUICK_PLAYER))
|
||||
TextRender()->TextColor(0.4f,0.4f,1.0f,1);
|
||||
TextRender()->TextColor(0.4f, 0.4f, 1.0f, TextAplpha);
|
||||
UI()->DoLabelScaled(&Button, aTemp, 12.0f, 1);
|
||||
TextRender()->TextColor(1,1,1,1);
|
||||
}
|
||||
else if(ID == COL_PING)
|
||||
{
|
||||
str_format(aTemp, sizeof(aTemp), "%i", pEntry->m_Latency);
|
||||
UI()->DoLabelScaled(&Button, aTemp, 12.0f, 1);
|
||||
}
|
||||
else if(ID == COL_VERSION)
|
||||
int Ping = pEntry->m_Latency;
|
||||
|
||||
vec4 StartColor;
|
||||
vec4 EndColor;
|
||||
float MixVal;
|
||||
if(Ping <= 125)
|
||||
{
|
||||
const char *pVersion = pEntry->m_aVersion;
|
||||
UI()->DoLabelScaled(&Button, pVersion, 12.0f, 1);
|
||||
StartColor = vec4(0.0f, 1.0f, 0.0f, TextAplpha);
|
||||
EndColor = vec4(1.0f, 1.0f, 0.0f, TextAplpha);
|
||||
|
||||
MixVal = (Ping-50.0f)/75.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartColor = vec4(1.0f, 1.0f, 0.0f, TextAplpha);
|
||||
EndColor = vec4(1.0f, 0.0f, 0.0f, TextAplpha);
|
||||
|
||||
MixVal = (Ping-125.0f)/75.0f;
|
||||
}
|
||||
vec4 Color = mix(StartColor, EndColor, MixVal);
|
||||
str_format(aTemp, sizeof(aTemp), "%d", pEntry->m_Latency);
|
||||
TextRender()->TextColor(Color.r, Color.g, Color.b, Color.a);
|
||||
UI()->DoLabelScaled(&Button, aTemp, 12.0f, 1);
|
||||
}
|
||||
else if(ID == COL_GAMETYPE)
|
||||
{
|
||||
CTextCursor Cursor;
|
||||
TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f*UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Button.w;
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, TextAplpha);
|
||||
TextRender()->TextEx(&Cursor, pEntry->m_aGameType, -1);
|
||||
}
|
||||
else if(ID == COL_FAVORITE)
|
||||
{
|
||||
Button.HMargin(1.5f, &Button);
|
||||
if(DoButton_SpriteClean(IMAGE_BROWSERICONS, pEntry->m_Favorite ? SPRITE_BROWSERICON_STAR_ACTIVE : SPRITE_BROWSERICON_STAR_INACTIVE, &Button))
|
||||
{
|
||||
if(!pEntry->m_Favorite)
|
||||
ServerBrowser()->AddFavorite(pEntry->m_NetAddr);
|
||||
else
|
||||
ServerBrowser()->RemoveFavorite(pEntry->m_NetAddr);
|
||||
}
|
||||
}
|
||||
else if(ID == COL_INFO)
|
||||
{
|
||||
Button.HMargin(1.5f, &Button);
|
||||
if(DoButton_MouseOver(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_INFO, &Button))
|
||||
SetOverlay(CInfoOverlay::OVERLAY_SERVERINFO, Button.x, Button.y, pEntry);
|
||||
}
|
||||
}
|
||||
|
||||
TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
return ReturnValue;
|
||||
}
|
||||
|
@ -311,38 +367,39 @@ bool CMenus::RenderFilterHeader(CUIRect View, int FilterIndex)
|
|||
View.VSplitLeft(50.0f, 0, &Label);
|
||||
Label.HMargin(2.0f, &Label);
|
||||
char aBuf[256];
|
||||
if(!pFilter->Custom())
|
||||
{
|
||||
str_format(aBuf, sizeof(aBuf), "(%d) %s", pFilter->NumSortedServers(), pFilter->Name());
|
||||
UI()->DoLabel(&Label, aBuf, 12.0f, -1);
|
||||
}
|
||||
if(pFilter->Custom() <= CBrowserFilter::FILTER_ALL)
|
||||
UI()->DoLabel(&Label, pFilter->Name(), 12.0f, -1);
|
||||
else
|
||||
{
|
||||
str_format(aBuf, sizeof(aBuf), "(%d)", pFilter->NumSortedServers());
|
||||
UI()->DoLabel(&Label, aBuf, 12.0f, -1);
|
||||
float tw = TextRender()->TextWidth(0, 12.0f, aBuf, -1);
|
||||
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_BROWSERICONS].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
if(pFilter->Custom() == CBrowserFilter::FILTER_STANDARD)
|
||||
RenderTools()->SelectSprite(SPRITE_BROWSERICON_TEE);
|
||||
else if(pFilter->Custom() == CBrowserFilter::FILTER_FAVORITES)
|
||||
RenderTools()->SelectSprite(SPRITE_BROWSERICON_STAR_ACTIVE);
|
||||
IGraphics::CQuadItem QuadItem(Label.x+tw+5.0f, View.y, 18.0f, 18.0f);
|
||||
IGraphics::CQuadItem QuadItem(Label.x, View.y, 18.0f, 18.0f);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
Label.VSplitLeft(tw+25.0f, 0, &Label);
|
||||
Label.VSplitLeft(25.0f, 0, &Label);
|
||||
UI()->DoLabel(&Label, pFilter->Name(), 12.0f, -1);
|
||||
}
|
||||
|
||||
View.VSplitRight(20.0f, &Button, 0);
|
||||
Button.VSplitRight(18.0f, &View, &Button);
|
||||
if(pFilter->Custom() == CBrowserFilter::FILTER_CUSTOM)
|
||||
{
|
||||
if(DoButton_SpriteClean(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_CLOSE, &Button))
|
||||
{
|
||||
RemoveFilter(FilterIndex);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
View.VSplitRight(2.0f, &Button, 0);
|
||||
Button.VSplitRight(18.0f, &View, &Button);
|
||||
if(DoButton_MouseOver(IMAGE_BROWSERICONS, SPRITE_BROWSERICON_INFO, &Button))
|
||||
SetOverlay(CInfoOverlay::OVERLAY_HEADERINFO, Button.x, Button.y, pFilter);
|
||||
|
||||
View.VSplitRight(2.0f, &Button, 0);
|
||||
Button.VSplitRight(18.0f, &View, &Button);
|
||||
|
@ -364,6 +421,52 @@ bool CMenus::RenderFilterHeader(CUIRect View, int FilterIndex)
|
|||
return false;
|
||||
}
|
||||
|
||||
void CMenus::RenderServerbrowserOverlay()
|
||||
{
|
||||
if(!m_InfoOverlayActive)
|
||||
return;
|
||||
|
||||
int Type = m_InfoOverlay.m_Type;
|
||||
|
||||
if(Type == CInfoOverlay::OVERLAY_HEADERINFO)
|
||||
{
|
||||
CBrowserFilter *pFilter = (CBrowserFilter*)m_InfoOverlay.m_pData;
|
||||
|
||||
// get position
|
||||
CUIRect View = { m_InfoOverlay.m_X-100.0f, m_InfoOverlay.m_Y, 100.0f, 30.0f };
|
||||
|
||||
// render background
|
||||
RenderTools()->DrawUIRect(&View, vec4(0.25f, 0.25f, 0.25f, 1.0f), CUI::CORNER_ALL, 6.0f);
|
||||
|
||||
View.Margin(2.0f, &View);
|
||||
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Servers"), pFilter->NumSortedServers());
|
||||
UI()->DoLabel(&View, aBuf, 12.0f, 0);
|
||||
|
||||
View.HSplitMid(0, &View);
|
||||
str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Players"), pFilter->NumPlayers());
|
||||
UI()->DoLabel(&View, aBuf, 12.0f, 0);
|
||||
}
|
||||
else if(Type == CInfoOverlay::OVERLAY_SERVERINFO)
|
||||
{
|
||||
const CServerInfo *pInfo = (CServerInfo*)m_InfoOverlay.m_pData;
|
||||
|
||||
// get position
|
||||
CUIRect View = { m_InfoOverlay.m_X-210.0f, m_InfoOverlay.m_Y, 210.0f, pInfo->m_NumClients ? 98.0f + pInfo->m_NumClients*25.0f : 72.0f };
|
||||
if(View.y+View.h >= 590.0f)
|
||||
View.y -= View.y+View.h - 590.0f;
|
||||
|
||||
// render background
|
||||
RenderTools()->DrawUIRect(&View, vec4(0.25f, 0.25f, 0.25f, 1.0f), CUI::CORNER_ALL, 6.0f);
|
||||
|
||||
RenderServerbrowserServerDetail(View, pInfo);
|
||||
}
|
||||
|
||||
// deactivate it
|
||||
m_InfoOverlayActive = false;
|
||||
}
|
||||
|
||||
void CMenus::RenderServerbrowserServerList(CUIRect View)
|
||||
{
|
||||
CUIRect Headers;
|
||||
|
@ -570,7 +673,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View)
|
|||
CUIRect OriginalView = View;
|
||||
View.y -= s_ScrollValue*ScrollNum*ms_aCols[0].m_Rect.h;
|
||||
|
||||
int NumPlayers = 0;
|
||||
int NumPlayers = ServerBrowser()->NumPlayers();
|
||||
|
||||
// reset friend counter
|
||||
for(int i = 0; i < m_lFriends.size(); m_lFriends[i++].m_NumFound = 0);
|
||||
|
@ -595,7 +698,6 @@ void CMenus::RenderServerbrowserServerList(CUIRect View)
|
|||
{
|
||||
int ItemIndex = i;
|
||||
const CServerInfo *pItem = pFilter->SortedGet(ItemIndex);
|
||||
NumPlayers += g_Config.m_BrFilterSpectators ? pItem->m_NumPlayers : pItem->m_NumClients;
|
||||
|
||||
CUIRect SelectHitBox;
|
||||
|
||||
|
@ -689,7 +791,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View)
|
|||
if(ServerBrowser()->IsRefreshing())
|
||||
str_format(aBuf, sizeof(aBuf), Localize("%d%% loaded"), ServerBrowser()->LoadingProgression());
|
||||
else
|
||||
str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers, %d players"), NumServers, ServerBrowser()->NumServers(), NumPlayers);
|
||||
str_format(aBuf, sizeof(aBuf), Localize("%d servers, %d players"), ServerBrowser()->NumServers(), NumPlayers);
|
||||
Status.VSplitRight(TextRender()->TextWidth(0, 14.0f, aBuf, -1), 0, &Status);
|
||||
UI()->DoLabelScaled(&Status, aBuf, 14.0f, -1);
|
||||
}
|
||||
|
@ -834,15 +936,15 @@ void CMenus::RenderServerbrowserFilters(CUIRect View)
|
|||
}
|
||||
}
|
||||
|
||||
void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
||||
void CMenus::RenderServerbrowserServerDetail(CUIRect View, const CServerInfo *pInfo)
|
||||
{
|
||||
View.Margin(2.0f, &View);
|
||||
|
||||
CUIRect ServerDetails = View;
|
||||
CUIRect ServerScoreBoard, ServerHeader;
|
||||
|
||||
const CServerInfo *pSelectedServer = (m_SelectedServer.m_Filter > -1 && m_SelectedServer.m_Filter < m_lFilters.size()) ? m_lFilters[m_SelectedServer.m_Filter].SortedGet(m_SelectedServer.m_Index) : 0;
|
||||
|
||||
// split off a piece to use for scoreboard
|
||||
ServerDetails.HSplitTop(90.0f, &ServerDetails, &ServerScoreBoard);
|
||||
ServerDetails.HSplitTop(70.0f, &ServerDetails, &ServerScoreBoard);
|
||||
ServerDetails.HSplitBottom(2.5f, &ServerDetails, 0x0);
|
||||
|
||||
// server details
|
||||
|
@ -853,7 +955,7 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
RenderTools()->DrawUIRect(&ServerDetails, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f);
|
||||
UI()->DoLabelScaled(&ServerHeader, Localize("Server details"), FontSize+2.0f, 0);
|
||||
|
||||
if (pSelectedServer)
|
||||
if(pInfo)
|
||||
{
|
||||
ServerDetails.VSplitLeft(5.0f, 0, &ServerDetails);
|
||||
ServerDetails.Margin(3.0f, &ServerDetails);
|
||||
|
@ -867,21 +969,6 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
CUIRect LeftColumn;
|
||||
CUIRect RightColumn;
|
||||
|
||||
//
|
||||
{
|
||||
CUIRect Button;
|
||||
ServerDetails.HSplitBottom(20.0f, &ServerDetails, &Button);
|
||||
Button.VSplitLeft(5.0f, 0, &Button);
|
||||
static int s_AddFavButton = 0;
|
||||
if(DoButton_CheckBox(&s_AddFavButton, Localize("Favorite"), pSelectedServer->m_Favorite, &Button))
|
||||
{
|
||||
if(pSelectedServer->m_Favorite)
|
||||
ServerBrowser()->RemoveFavorite(pSelectedServer->m_NetAddr);
|
||||
else
|
||||
ServerBrowser()->AddFavorite(pSelectedServer->m_NetAddr);
|
||||
}
|
||||
}
|
||||
|
||||
ServerDetails.VSplitLeft(5.0f, 0x0, &ServerDetails);
|
||||
ServerDetails.VSplitLeft(80.0f, &LeftColumn, &RightColumn);
|
||||
|
||||
|
@ -894,15 +981,15 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
RightColumn.HSplitTop(15.0f, &Row, &RightColumn);
|
||||
TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Row.w;
|
||||
TextRender()->TextEx(&Cursor, pSelectedServer->m_aVersion, -1);
|
||||
TextRender()->TextEx(&Cursor, pInfo->m_aVersion, -1);
|
||||
|
||||
RightColumn.HSplitTop(15.0f, &Row, &RightColumn);
|
||||
TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Row.w;
|
||||
TextRender()->TextEx(&Cursor, pSelectedServer->m_aGameType, -1);
|
||||
TextRender()->TextEx(&Cursor, pInfo->m_aGameType, -1);
|
||||
|
||||
char aTemp[16];
|
||||
str_format(aTemp, sizeof(aTemp), "%d", pSelectedServer->m_Latency);
|
||||
str_format(aTemp, sizeof(aTemp), "%d", pInfo->m_Latency);
|
||||
RightColumn.HSplitTop(15.0f, &Row, &RightColumn);
|
||||
TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Row.w;
|
||||
|
@ -910,31 +997,30 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
|
||||
}
|
||||
|
||||
if(pInfo && pInfo->m_NumClients)
|
||||
{
|
||||
// server scoreboard
|
||||
ServerScoreBoard.HSplitBottom(20.0f, &ServerScoreBoard, 0x0);
|
||||
ServerScoreBoard.HSplitTop(ms_ListheaderHeight, &ServerHeader, &ServerScoreBoard);
|
||||
RenderTools()->DrawUIRect(&ServerHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f);
|
||||
RenderTools()->DrawUIRect(&ServerScoreBoard, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f);
|
||||
UI()->DoLabelScaled(&ServerHeader, Localize("Scoreboard"), FontSize+2.0f, 0);
|
||||
|
||||
if(pSelectedServer)
|
||||
{
|
||||
ServerScoreBoard.Margin(3.0f, &ServerScoreBoard);
|
||||
for (int i = 0; i < pSelectedServer->m_NumClients; i++)
|
||||
for (int i = 0; i < pInfo->m_NumClients; i++)
|
||||
{
|
||||
CUIRect Name, Clan, Score, Flag;
|
||||
ServerScoreBoard.HSplitTop(25.0f, &Name, &ServerScoreBoard);
|
||||
if(UI()->DoButtonLogic(&pSelectedServer->m_aClients[i], "", 0, &Name))
|
||||
if(UI()->DoButtonLogic(&pInfo->m_aClients[i], "", 0, &Name))
|
||||
{
|
||||
if(pSelectedServer->m_aClients[i].m_FriendState == IFriends::FRIEND_PLAYER)
|
||||
m_pClient->Friends()->RemoveFriend(pSelectedServer->m_aClients[i].m_aName, pSelectedServer->m_aClients[i].m_aClan);
|
||||
if(pInfo->m_aClients[i].m_FriendState == IFriends::FRIEND_PLAYER)
|
||||
m_pClient->Friends()->RemoveFriend(pInfo->m_aClients[i].m_aName, pInfo->m_aClients[i].m_aClan);
|
||||
else
|
||||
m_pClient->Friends()->AddFriend(pSelectedServer->m_aClients[i].m_aName, pSelectedServer->m_aClients[i].m_aClan);
|
||||
m_pClient->Friends()->AddFriend(pInfo->m_aClients[i].m_aName, pInfo->m_aClients[i].m_aClan);
|
||||
FriendlistOnUpdate();
|
||||
Client()->ServerBrowserUpdate();
|
||||
}
|
||||
|
||||
vec4 Colour = pSelectedServer->m_aClients[i].m_FriendState == IFriends::FRIEND_NO ? vec4(1.0f, 1.0f, 1.0f, (i%2+1)*0.05f) :
|
||||
vec4 Colour = pInfo->m_aClients[i].m_FriendState == IFriends::FRIEND_NO ? vec4(1.0f, 1.0f, 1.0f, (i%2+1)*0.05f) :
|
||||
vec4(0.5f, 1.0f, 0.5f, 0.15f+(i%2+1)*0.05f);
|
||||
RenderTools()->DrawUIRect(&Name, Colour, CUI::CORNER_ALL, 4.0f);
|
||||
Name.VSplitLeft(5.0f, 0, &Name);
|
||||
|
@ -944,10 +1030,10 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
Name.HSplitTop(11.0f, &Name, &Clan);
|
||||
|
||||
// score
|
||||
if(pSelectedServer->m_aClients[i].m_Player)
|
||||
if(pInfo->m_aClients[i].m_Player)
|
||||
{
|
||||
char aTemp[16];
|
||||
str_format(aTemp, sizeof(aTemp), "%d", pSelectedServer->m_aClients[i].m_Score);
|
||||
str_format(aTemp, sizeof(aTemp), "%d", pInfo->m_aClients[i].m_Score);
|
||||
TextRender()->SetCursor(&Cursor, Score.x, Score.y+(Score.h-FontSize)/4.0f, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Score.w;
|
||||
TextRender()->TextEx(&Cursor, aTemp, -1);
|
||||
|
@ -956,7 +1042,7 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
// name
|
||||
TextRender()->SetCursor(&Cursor, Name.x, Name.y, FontSize-2, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Name.w;
|
||||
const char *pName = pSelectedServer->m_aClients[i].m_aName;
|
||||
const char *pName = pInfo->m_aClients[i].m_aName;
|
||||
if(g_Config.m_BrFilterString[0])
|
||||
{
|
||||
// highlight the parts that matches
|
||||
|
@ -978,7 +1064,7 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
// clan
|
||||
TextRender()->SetCursor(&Cursor, Clan.x, Clan.y, FontSize-2, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
Cursor.m_LineWidth = Clan.w;
|
||||
const char *pClan = pSelectedServer->m_aClients[i].m_aClan;
|
||||
const char *pClan = pInfo->m_aClients[i].m_aClan;
|
||||
if(g_Config.m_BrFilterString[0])
|
||||
{
|
||||
// highlight the parts that matches
|
||||
|
@ -999,7 +1085,7 @@ void CMenus::RenderServerbrowserServerDetail(CUIRect View)
|
|||
|
||||
// flag
|
||||
vec4 Color(1.0f, 1.0f, 1.0f, 0.5f);
|
||||
m_pClient->m_pCountryFlags->Render(pSelectedServer->m_aClients[i].m_Country, &Color, Flag.x, Flag.y, Flag.w, Flag.h);
|
||||
m_pClient->m_pCountryFlags->Render(pInfo->m_aClients[i].m_Country, &Color, Flag.x, Flag.y, Flag.w, Flag.h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1221,8 +1307,8 @@ void CMenus::RenderServerbrowser(CUIRect MainView)
|
|||
|
||||
if(ToolboxPage == 0)
|
||||
RenderServerbrowserFilters(ToolBox);
|
||||
else if(ToolboxPage == 1)
|
||||
RenderServerbrowserServerDetail(ToolBox);
|
||||
//else if(ToolboxPage == 1)
|
||||
// RenderServerbrowserServerDetail(ToolBox);
|
||||
else if(ToolboxPage == 2)
|
||||
RenderServerbrowserFriends(ToolBox);
|
||||
}
|
||||
|
@ -1280,6 +1366,9 @@ void CMenus::RenderServerbrowser(CUIRect MainView)
|
|||
static float Offset = 0.0f;
|
||||
DoEditBox(&g_Config.m_UiServerAddress, &Button, g_Config.m_UiServerAddress, sizeof(g_Config.m_UiServerAddress), 14.0f, &Offset);
|
||||
}
|
||||
|
||||
// render overlay if there is any
|
||||
RenderServerbrowserOverlay();
|
||||
}
|
||||
|
||||
void CMenus::ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
|
||||
|
|
Loading…
Reference in a new issue