about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-03-18 19:03:13 +0100
committeroy <Tom_Adams@web.de>2011-03-18 19:03:13 +0100
commita8bf857c6877679ff943ad9dbfba5aac1870ccae (patch)
treed6ec05d43c840242e8036af662c2d38cf189670a
parenta3c9ec889f487c2de307f41904454e85b0efa21c (diff)
downloadzcatch-a8bf857c6877679ff943ad9dbfba5aac1870ccae.tar.gz
zcatch-a8bf857c6877679ff943ad9dbfba5aac1870ccae.zip
improved server browser list resorting and made search work on IP addresses. Closes #482
-rw-r--r--data/languages/bosnian.txt6
-rw-r--r--data/languages/czech.txt6
-rw-r--r--data/languages/dutch.txt6
-rw-r--r--data/languages/finnish.txt6
-rw-r--r--data/languages/french.txt6
-rw-r--r--data/languages/german.txt6
-rw-r--r--data/languages/italian.txt6
-rw-r--r--data/languages/polish.txt6
-rw-r--r--data/languages/portuguese.txt6
-rw-r--r--data/languages/romanian.txt6
-rw-r--r--data/languages/russian.txt6
-rw-r--r--data/languages/serbian.txt6
-rw-r--r--data/languages/spanish.txt6
-rw-r--r--data/languages/swedish.txt6
-rw-r--r--data/languages/ukrainian.txt6
-rw-r--r--src/engine/client.h1
-rw-r--r--src/engine/client/client.cpp21
-rw-r--r--src/engine/client/client.h4
-rw-r--r--src/engine/client/srvbrowse.cpp65
-rw-r--r--src/engine/client/srvbrowse.h2
-rw-r--r--src/engine/shared/config_variables.h2
-rw-r--r--src/game/client/components/menus_browser.cpp19
22 files changed, 162 insertions, 42 deletions
diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt
index d48731cb..075442ec 100644
--- a/data/languages/bosnian.txt
+++ b/data/languages/bosnian.txt
@@ -927,6 +927,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/czech.txt b/data/languages/czech.txt
index 3af70fa0..91f90da2 100644
--- a/data/languages/czech.txt
+++ b/data/languages/czech.txt
@@ -915,6 +915,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt
index 094d4785..c77ecbd9 100644
--- a/data/languages/dutch.txt
+++ b/data/languages/dutch.txt
@@ -1035,6 +1035,12 @@ Rename
 Rename demo
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Size:
 == 
 
diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt
index 100736ec..a83d57f6 100644
--- a/data/languages/finnish.txt
+++ b/data/languages/finnish.txt
@@ -924,6 +924,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/french.txt b/data/languages/french.txt
index b4089c8c..112f53dc 100644
--- a/data/languages/french.txt
+++ b/data/languages/french.txt
@@ -966,6 +966,12 @@ Resizes the current Quad based on the aspect ratio of the image
 Rotation of the brush in degrees. Use left mouse button to drag and change the value. Hold shift to be more precise.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/german.txt b/data/languages/german.txt
index a96ec894..e2f58d21 100644
--- a/data/languages/german.txt
+++ b/data/languages/german.txt
@@ -1035,6 +1035,12 @@ Rename
 Rename demo
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Size:
 == 
 
diff --git a/data/languages/italian.txt b/data/languages/italian.txt
index c28ae501..115e66aa 100644
--- a/data/languages/italian.txt
+++ b/data/languages/italian.txt
@@ -1023,6 +1023,12 @@ Rename
 Rename demo
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/polish.txt b/data/languages/polish.txt
index 04882203..d8e42cfe 100644
--- a/data/languages/polish.txt
+++ b/data/languages/polish.txt
@@ -990,6 +990,12 @@ Rotation of the brush in degrees. Use left mouse button to drag and change the v
 Rotation of the envelope
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt
index c885ce92..5b2dcf32 100644
--- a/data/languages/portuguese.txt
+++ b/data/languages/portuguese.txt
@@ -924,6 +924,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt
index 998e992b..4a5555d3 100644
--- a/data/languages/romanian.txt
+++ b/data/languages/romanian.txt
@@ -1035,6 +1035,12 @@ Rename
 Rename demo
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Size:
 == 
 
diff --git a/data/languages/russian.txt b/data/languages/russian.txt
index 17f15b0d..672fe891 100644
--- a/data/languages/russian.txt
+++ b/data/languages/russian.txt
@@ -990,6 +990,12 @@ Rotation of the brush in degrees. Use left mouse button to drag and change the v
 Rotation of the envelope
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt
index d6e331c2..95f16295 100644
--- a/data/languages/serbian.txt
+++ b/data/languages/serbian.txt
@@ -924,6 +924,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt
index 60ee2e81..8e9bf816 100644
--- a/data/languages/spanish.txt
+++ b/data/languages/spanish.txt
@@ -1035,6 +1035,12 @@ Rename
 Rename demo
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Size:
 == 
 
diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt
index 9be69390..6627337b 100644
--- a/data/languages/swedish.txt
+++ b/data/languages/swedish.txt
@@ -912,6 +912,12 @@ Select image
 Select layer. Right click for properties.
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt
index 31d65151..9fce4438 100644
--- a/data/languages/ukrainian.txt
+++ b/data/languages/ukrainian.txt
@@ -1005,6 +1005,12 @@ Rename demo
 Rotation of the envelope
 == 
 
+Server address:
+== 
+
+Server filter
+== 
+
 Shift
 == 
 
diff --git a/src/engine/client.h b/src/engine/client.h
index 539bed44..31b6f794 100644
--- a/src/engine/client.h
+++ b/src/engine/client.h
@@ -80,6 +80,7 @@ public:
 	virtual void DemoRecorder_HandleAutoStart() = 0;
 	virtual void DemoRecorder_Stop() = 0;
 	virtual void AutoScreenshot_Start() = 0;
+	virtual void ServerBrowserUpdate() = 0;
 
 	// networking
 	virtual void EnterGame() = 0;
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 49abd2e9..7277cecd 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -1760,7 +1760,8 @@ void CClient::Update()
 	MasterServer()->Update();
 
 	// update the server browser
-	m_ServerBrowser.Update();
+	m_ServerBrowser.Update(m_ResortServerBrowser);
+	m_ResortServerBrowser = false;
 }
 
 void CClient::VersionUpdate()
@@ -2234,6 +2235,18 @@ void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData)
 	pSelf->DemoRecorder_Stop();
 }
 
+void CClient::ServerBrowserUpdate()
+{
+	m_ResortServerBrowser = true;
+}
+
+void CClient::ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
+{
+	pfnCallback(pResult, pCallbackUserData);
+	if(pResult->NumArguments())
+		((CClient *)pUserData)->ServerBrowserUpdate();
+}
+
 void CClient::RegisterCommands()
 {
 	m_pConsole = Kernel()->RequestInterface<IConsole>();
@@ -2260,8 +2273,12 @@ void CClient::RegisterCommands()
 	m_pConsole->Register("play", "r", CFGFLAG_CLIENT, Con_Play, this, "Play the file specified");
 	m_pConsole->Register("record", "?s", CFGFLAG_CLIENT, Con_Record, this, "Record to the file");
 	m_pConsole->Register("stoprecord", "", CFGFLAG_CLIENT, Con_StopRecord, this, "Stop recording");
-
 	m_pConsole->Register("add_favorite", "s", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite");
+
+	// used for server browser update
+	m_pConsole->Chain("br_filter_string", ConchainServerBrowserUpdate, this);
+	m_pConsole->Chain("br_filter_gametype", ConchainServerBrowserUpdate, this);
+	m_pConsole->Chain("br_filter_serveraddress", ConchainServerBrowserUpdate, this);
 }
 
 static CClient m_Client;
diff --git a/src/engine/client/client.h b/src/engine/client/client.h
index e0cd17a2..b5be566b 100644
--- a/src/engine/client/client.h
+++ b/src/engine/client/client.h
@@ -121,6 +121,7 @@ class CClient : public IClient, public CDemoPlayer::IListner
 	bool m_AutoScreenshotRecycle;
 	bool m_EditorActive;
 	bool m_SoundInitFailed;
+	bool m_ResortServerBrowser;
 
 	int m_AckGameTick;
 	int m_CurrentRecvTick;
@@ -304,6 +305,7 @@ public:
 	static void Con_Play(IConsole::IResult *pResult, void *pUserData);
 	static void Con_Record(IConsole::IResult *pResult, void *pUserData);
 	static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData);
+	static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
 
 	void RegisterCommands();
 
@@ -314,5 +316,7 @@ public:
 
 	void AutoScreenshot_Start();
 	void AutoScreenshot_Cleanup();
+
+	void ServerBrowserUpdate();
 };
 #endif
diff --git a/src/engine/client/srvbrowse.cpp b/src/engine/client/srvbrowse.cpp
index 81ee175f..fb350c43 100644
--- a/src/engine/client/srvbrowse.cpp
+++ b/src/engine/client/srvbrowse.cpp
@@ -167,50 +167,44 @@ void CServerBrowser::Filter()
 			Filtered = 1;
 		else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0)
 			Filtered = 1;
-		else
+		else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aAddress, g_Config.m_BrFilterServerAddress))
+			Filtered = 1;
+		else if(g_Config.m_BrFilterGametype[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype))
+			Filtered = 1;
+		else if(g_Config.m_BrFilterString[0] != 0)
 		{
-			if(g_Config.m_BrFilterString[0] != 0)
-			{
-				int MatchFound = 0;
+			int MatchFound = 0;
 
-				m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0;
-
-				// match against server name
-				if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString))
-				{
-					MatchFound = 1;
-					m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME;
-				}
+			m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0;
 
-				// match against players
-				for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumPlayers; p++)
-				{
-					if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aPlayers[p].m_aName, g_Config.m_BrFilterString) ||
-						str_find_nocase(m_ppServerlist[i]->m_Info.m_aPlayers[p].m_aClan, g_Config.m_BrFilterString))
-					{
-						MatchFound = 1;
-						m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER;
-						break;
-					}
-				}
+			// match against server name
+			if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString))
+			{
+				MatchFound = 1;
+				m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME;
+			}
 
-				// match against map
-				if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString))
+			// match against players
+			for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumPlayers; p++)
+			{
+				if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aPlayers[p].m_aName, g_Config.m_BrFilterString) ||
+					str_find_nocase(m_ppServerlist[i]->m_Info.m_aPlayers[p].m_aClan, g_Config.m_BrFilterString))
 				{
 					MatchFound = 1;
-					m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME;
+					m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER;
+					break;
 				}
-
-				if(!MatchFound)
-					Filtered = 1;
 			}
 
-			if(!Filtered && g_Config.m_BrFilterGametype[0] != 0)
+			// match against map
+			if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString))
 			{
-				// match against game type
-				if(!str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype))
-					Filtered = 1;
+				MatchFound = 1;
+				m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME;
 			}
+
+			if(!MatchFound)
+				Filtered = 1;
 		}
 
 		if(Filtered == 0)
@@ -532,7 +526,7 @@ void CServerBrowser::Request(const NETADDR &Addr) const
 }
 
 
-void CServerBrowser::Update()
+void CServerBrowser::Update(bool ForceResort)
 {
 	int64 Timeout = time_freq()/2;	// TODO 0.6: increase this again
 	int64 Now = time_get();
@@ -606,8 +600,7 @@ void CServerBrowser::Update()
 	}
 
 	// check if we need to resort
-	// TODO: remove the str_comp
-	if(m_Sorthash != SortHash() || str_comp(m_aFilterString, g_Config.m_BrFilterString) != 0 || str_comp(m_aFilterGametypeString, g_Config.m_BrFilterGametype) != 0)
+	if(m_Sorthash != SortHash() || ForceResort)
 		Sort();
 }
 
diff --git a/src/engine/client/srvbrowse.h b/src/engine/client/srvbrowse.h
index 43bd1807..c00ce752 100644
--- a/src/engine/client/srvbrowse.h
+++ b/src/engine/client/srvbrowse.h
@@ -45,7 +45,7 @@ public:
 	void RemoveFavorite(const NETADDR &Addr);
 
 	//
-	void Update();
+	void Update(bool ForceResort);
 	void Set(const NETADDR &Addr, int Type, int Token, const CServerInfo *pInfo);
 	void Request(const NETADDR &Addr) const;
 
diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h
index c495461e..68e615bd 100644
--- a/src/engine/shared/config_variables.h
+++ b/src/engine/shared/config_variables.h
@@ -28,12 +28,12 @@ MACRO_CONFIG_INT(ClEventthread, cl_eventthread, 0, 0, 1, CFGFLAG_CLIENT, "Enable
 MACRO_CONFIG_INT(InpGrab, inp_grab, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Use forceful input grabbing method")
 
 MACRO_CONFIG_STR(BrFilterString, br_filter_string, 25, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Server browser filtering string")
-
 MACRO_CONFIG_INT(BrFilterFull, br_filter_full, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out full server in browser")
 MACRO_CONFIG_INT(BrFilterEmpty, br_filter_empty, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out empty server in browser")
 MACRO_CONFIG_INT(BrFilterPw, br_filter_pw, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out password protected servers in browser")
 MACRO_CONFIG_INT(BrFilterPing, br_filter_ping, 999, 0, 999, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Ping to filter by in the server browser")
 MACRO_CONFIG_STR(BrFilterGametype, br_filter_gametype, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Game types to filter")
+MACRO_CONFIG_STR(BrFilterServerAddress, br_filter_serveraddress, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Server address to filter")
 MACRO_CONFIG_INT(BrFilterPure, br_filter_pure, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard servers in browser")
 MACRO_CONFIG_INT(BrFilterPureMap, br_filter_pure_map, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard maps in browser")
 MACRO_CONFIG_INT(BrFilterCompatversion, br_filter_compatversion, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-compatible servers in browser")
diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp
index 756640c2..8c54afae 100644
--- a/src/game/client/components/menus_browser.cpp
+++ b/src/game/client/components/menus_browser.cpp
@@ -385,7 +385,9 @@ void CMenus::RenderServerbrowserServerList(CUIRect View)
 	QuickSearch.VSplitLeft(5.0f, 0, &QuickSearch);
 	QuickSearch.VSplitLeft(240.0f-w-22.0f, &QuickSearch, &Button);
 	static float Offset = 0.0f;
-	DoEditBox(&g_Config.m_BrFilterString, &QuickSearch, g_Config.m_BrFilterString, sizeof(g_Config.m_BrFilterString), 12.0f, &Offset, false, CUI::CORNER_L);
+	if(DoEditBox(&g_Config.m_BrFilterString, &QuickSearch, g_Config.m_BrFilterString, sizeof(g_Config.m_BrFilterString), 12.0f, &Offset, false, CUI::CORNER_L))
+		Client()->ServerBrowserUpdate();
+
 	// clear button
 	{
 		static int s_ClearButton = 0;
@@ -395,6 +397,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View)
 		{
 			g_Config.m_BrFilterString[0] = 0;
 			UI()->SetActiveItem(&g_Config.m_BrFilterString);
+			Client()->ServerBrowserUpdate();
 		}
 	}
 	
@@ -456,7 +459,8 @@ void CMenus::RenderServerbrowserFilters(CUIRect View)
 	Button.VSplitRight(60.0f, 0, &Button);
 	ServerFilter.HSplitTop(3.0f, 0, &ServerFilter);
 	static float Offset = 0.0f;
-	DoEditBox(&g_Config.m_BrFilterGametype, &Button, g_Config.m_BrFilterGametype, sizeof(g_Config.m_BrFilterGametype), FontSize, &Offset);
+	if(DoEditBox(&g_Config.m_BrFilterGametype, &Button, g_Config.m_BrFilterGametype, sizeof(g_Config.m_BrFilterGametype), FontSize, &Offset))
+		Client()->ServerBrowserUpdate();
 
 	{
 		ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter);
@@ -472,6 +476,15 @@ void CMenus::RenderServerbrowserFilters(CUIRect View)
 		g_Config.m_BrFilterPing = clamp(str_toint(aBuf), 0, 999);
 	}
 
+	// server address
+	ServerFilter.HSplitTop(3.0f, 0, &ServerFilter);
+	ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter);
+	UI()->DoLabelScaled(&Button, Localize("Server address:"), FontSize, -1);
+	Button.VSplitRight(60.0f, 0, &Button);	
+	static float OffsetAddr = 0.0f;
+	if(DoEditBox(&g_Config.m_BrFilterServerAddress, &Button, g_Config.m_BrFilterServerAddress, sizeof(g_Config.m_BrFilterServerAddress), FontSize, &OffsetAddr))
+		Client()->ServerBrowserUpdate();
+
 	ServerFilter.HSplitBottom(5.0f, &ServerFilter, 0);
 	ServerFilter.HSplitBottom(ms_ButtonHeight, &ServerFilter, &Button);
 	static int s_ClearButton = 0;
@@ -482,10 +495,12 @@ void CMenus::RenderServerbrowserFilters(CUIRect View)
 		g_Config.m_BrFilterPw = 0;
 		g_Config.m_BrFilterPing = 999;
 		g_Config.m_BrFilterGametype[0] = 0;
+		g_Config.m_BrFilterServerAddress[0] = 0;
 		g_Config.m_BrFilterCompatversion = 1;
 		g_Config.m_BrFilterString[0] = 0;
 		g_Config.m_BrFilterPure = 1;
 		g_Config.m_BrFilterPureMap = 1;
+		Client()->ServerBrowserUpdate();
 	}
 }