<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://doom3.6bb.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Форум Мапперов и Doom&#039;еров</title>
		<link>https://doom3.6bb.ru/</link>
		<description>Форум Мапперов и Doom&#039;еров</description>
		<language>ru-ru</language>
		<lastBuildDate>Sun, 20 Sep 2026 15:02:01 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Исходный код (Source Code)</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6480#p6480</link>
			<description>&lt;p&gt;Добавляем net_usePreloadedServers&lt;/p&gt;
						&lt;p&gt;Нужно отредактировать ServerScan.h и ServerScan.cpp в neo\framework\async&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Полный код ServerScan.h&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;#ifndef __SERVERSCAN_H__&lt;br /&gt;#define __SERVERSCAN_H__&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;===============================================================================&lt;/p&gt;
						&lt;p&gt;	Scan for servers, on the LAN or from a list&lt;br /&gt;	Update a listDef GUI through usage of idListGUI class&lt;br /&gt;	When updating large lists of servers, sends out getInfo in small batches to avoid congestion&lt;/p&gt;
						&lt;p&gt;===============================================================================&lt;br /&gt;*/&lt;/p&gt;
						&lt;p&gt;// storage for incoming servers / server scan&lt;br /&gt;typedef struct {&lt;br /&gt;	netadr_t	adr;&lt;br /&gt;	int&amp;#160; &amp;#160; 	id;&lt;br /&gt;	int&amp;#160; &amp;#160; 	time;&lt;br /&gt;} inServer_t;&lt;/p&gt;
						&lt;p&gt;// the menu gui uses a hard-coded control type to display a list of network games&lt;br /&gt;typedef struct {&lt;br /&gt;	netadr_t	adr;&lt;br /&gt;	idDict&amp;#160; &amp;#160; serverInfo;&lt;br /&gt;	int&amp;#160; &amp;#160; 	ping;&lt;br /&gt;	int&amp;#160; &amp;#160; 	id;&amp;#160; &amp;#160; 	// idnet mode sends an id for each server in list&lt;br /&gt;	int&amp;#160; &amp;#160; 	clients;&lt;br /&gt;	char&amp;#160; &amp;#160; nickname[ MAX_NICKLEN ][ MAX_ASYNC_CLIENTS ];&lt;br /&gt;	short&amp;#160; &amp;#160; pings[ MAX_ASYNC_CLIENTS ];&lt;br /&gt;	int&amp;#160; &amp;#160; 	rate[ MAX_ASYNC_CLIENTS ];&lt;br /&gt;	int&amp;#160; &amp;#160; 	OSMask;&lt;br /&gt;&amp;#160; &amp;#160; int&amp;#160; &amp;#160; 	challenge;&lt;br /&gt;} networkServer_t;&lt;/p&gt;
						&lt;p&gt;typedef enum {&lt;br /&gt;	SORT_PING,&lt;br /&gt;	SORT_SERVERNAME,&lt;br /&gt;	SORT_PLAYERS,&lt;br /&gt;	SORT_GAMETYPE,&lt;br /&gt;	SORT_MAP,&lt;br /&gt;	SORT_GAME&lt;br /&gt;} serverSort_t;&lt;/p&gt;
						&lt;p&gt;class idServerScan : public idList&amp;lt;networkServer_t&amp;gt; {&lt;br /&gt;public:	&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; idServerScan( );&lt;/p&gt;
						&lt;p&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	InfoResponse( networkServer_t &amp;amp;server );&lt;/p&gt;
						&lt;p&gt;	// add an internet server - ( store a numeric id along with it )&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; AddServer( int id, const char *srv );&lt;/p&gt;
						&lt;p&gt;	// we are going to feed server entries to be pinged&lt;br /&gt;	// if timeout is true, use a timeout once we start AddServer to trigger EndServers and decide the scan is done&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; StartServers( bool timeout );&lt;br /&gt;	// we are done filling up the list of server entries&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; EndServers( );&lt;/p&gt;
						&lt;p&gt;	// scan the current list of servers - used for refreshes and while receiving a fresh list&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; NetScan( );&lt;/p&gt;
						&lt;p&gt;	// clear&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; Clear( );&lt;/p&gt;
						&lt;p&gt;	// called each game frame. Updates the scanner state, takes care of ongoing scans&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; RunFrame( );&lt;/p&gt;
						&lt;p&gt;	typedef enum {&lt;br /&gt;&amp;#160; &amp;#160; IDLE = 0,&lt;br /&gt;&amp;#160; &amp;#160; WAIT_ON_INIT,&lt;br /&gt;&amp;#160; &amp;#160; LAN_SCAN,&lt;br /&gt;&amp;#160; &amp;#160; NET_SCAN&lt;br /&gt;	} scan_state_t;&lt;/p&gt;
						&lt;p&gt;	scan_state_t&amp;#160; &amp;#160; GetState() { return scan_state; }&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; SetState( scan_state_t );&lt;/p&gt;
						&lt;p&gt;	bool&amp;#160; &amp;#160; &amp;#160; &amp;#160; GetBestPing( networkServer_t &amp;amp;serv );&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // prepare for a LAN scan. idAsyncClient does the network job (UDP broadcast), we do the storage&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; SetupLANScan( );&lt;/p&gt;
						&lt;p&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; GUIConfig( idUserInterface *pGUI, const char *name );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // update the GUI fields with information about the currently selected server&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; GUIUpdateSelected( void );&lt;/p&gt;
						&lt;p&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; Shutdown( );&lt;/p&gt;
						&lt;p&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; ApplyFilter( );&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // there is an internal toggle, call twice with same sort to switch&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; SetSorting( serverSort_t sort );&lt;/p&gt;
						&lt;p&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	GetChallenge( );&lt;/p&gt;
						&lt;p&gt;private:&lt;br /&gt;	static const int	MAX_PINGREQUESTS 	= 32;&amp;#160; &amp;#160; // how many servers to query at once&lt;br /&gt;	static const int	REPLY_TIMEOUT &amp;#160; &amp;#160; = 999;&amp;#160; &amp;#160; // how long should we wait for a reply from a game server&lt;br /&gt;	static const int	INCOMING_TIMEOUT	= 1500;&amp;#160; &amp;#160; // when we got an incoming server list, how long till we decide the list is done&lt;br /&gt;	static const int	REFRESH_START&amp;#160; &amp;#160; = 10000;	// how long to wait when sending the initial refresh request&lt;/p&gt;
						&lt;p&gt;	scan_state_t&amp;#160; &amp;#160; scan_state;&lt;/p&gt;
						&lt;p&gt;	bool&amp;#160; &amp;#160; &amp;#160; &amp;#160; incoming_net;	// set to true while new servers are fed through AddServer&lt;br /&gt;	bool&amp;#160; &amp;#160; &amp;#160; &amp;#160; incoming_useTimeout;&lt;br /&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	incoming_lastTime;&lt;/p&gt;
						&lt;p&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	lan_pingtime;	// holds the time of LAN scan&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // servers we&#039;re waiting for a reply from&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // won&#039;t exceed MAX_PINGREQUESTS elements&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // holds index of net_servers elements, indexed by &#039;from&#039; string&lt;br /&gt;	idDict&amp;#160; &amp;#160; &amp;#160; &amp;#160; net_info;&amp;#160; &amp;#160; &lt;/p&gt;
						&lt;p&gt;	idList&amp;lt;inServer_t&amp;gt;	net_servers;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // where we are in net_servers list for getInfo emissions ( NET_SCAN only )&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // we may either be waiting on MAX_PINGREQUESTS, or for net_servers to grow some more ( through AddServer )&lt;br /&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	cur_info;&lt;/p&gt;
						&lt;p&gt;	idUserInterface&amp;#160; &amp;#160; *m_pGUI;&lt;br /&gt;	idListGUI *&amp;#160; &amp;#160; 	listGUI;&lt;/p&gt;
						&lt;p&gt;	serverSort_t&amp;#160; &amp;#160; m_sort;&lt;br /&gt;	bool&amp;#160; &amp;#160; &amp;#160; &amp;#160; m_sortAscending;&lt;br /&gt;	idList&amp;lt;int&amp;gt;&amp;#160; &amp;#160; 	m_sortedServers;	// use ascending for the walking order&lt;/p&gt;
						&lt;p&gt;	idStr&amp;#160; &amp;#160; &amp;#160; &amp;#160; screenshot;&lt;br /&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	challenge;&amp;#160; &amp;#160; 	// challenge for current scan&lt;/p&gt;
						&lt;p&gt;	int&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	endWaitTime;&amp;#160; &amp;#160; // when to stop waiting on a port init&lt;/p&gt;
						&lt;p&gt;private:&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; LocalClear( );&amp;#160; &amp;#160; // we need to clear some internal data as well&lt;/p&gt;
						&lt;p&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; EmitGetInfo( netadr_t &amp;amp;serv );&lt;br /&gt;	void&amp;#160; &amp;#160; &amp;#160; &amp;#160; GUIAdd( int id, const networkServer_t server );&lt;br /&gt;	bool&amp;#160; &amp;#160; &amp;#160; &amp;#160; IsFiltered( const networkServer_t server );&lt;/p&gt;
						&lt;p&gt;	static int&amp;#160; &amp;#160; 	Cmp( const int *a, const int *b );&lt;/p&gt;
						&lt;p&gt;	&lt;span style=&quot;color: red&quot;&gt;void&amp;#160; &amp;#160; &amp;#160; &amp;#160; AddPreloadedServers();&lt;/span&gt;&lt;br /&gt;};&lt;/p&gt;
						&lt;p&gt;#endif /* !__SERVERSCAN_H__ */&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Полный код ServerScan.cpp&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;#include &amp;quot;../../idlib/precompiled.h&amp;quot;&lt;br /&gt;#pragma hdrstop&lt;/p&gt;
						&lt;p&gt;idCVar gui_filter_password( &amp;quot;gui_filter_password&amp;quot;, &amp;quot;0&amp;quot;, CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, &amp;quot;Password filter&amp;quot; );&lt;br /&gt;idCVar gui_filter_players( &amp;quot;gui_filter_players&amp;quot;, &amp;quot;0&amp;quot;, CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, &amp;quot;Players filter&amp;quot; );&lt;br /&gt;idCVar gui_filter_gameType( &amp;quot;gui_filter_gameType&amp;quot;, &amp;quot;0&amp;quot;, CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, &amp;quot;Gametype filter&amp;quot; );&lt;br /&gt;idCVar gui_filter_idle( &amp;quot;gui_filter_idle&amp;quot;, &amp;quot;0&amp;quot;, CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, &amp;quot;Idle servers filter&amp;quot; );&lt;br /&gt;idCVar gui_filter_game( &amp;quot;gui_filter_game&amp;quot;, &amp;quot;0&amp;quot;, CVAR_GUI | CVAR_INTEGER | CVAR_ARCHIVE, &amp;quot;Game filter&amp;quot; );&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;idCVar net_usePreloadedServers (&amp;quot;net_usePreloadedServers&amp;quot;,&amp;quot;0&amp;quot;, CVAR_BOOL | CVAR_ARCHIVE, &amp;quot;Use preloaded servers in server browser if master-server has no response&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer1 (&amp;quot;net_preloadedServer1&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 1 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer2 (&amp;quot;net_preloadedServer2&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 2 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer3 (&amp;quot;net_preloadedServer3&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 3 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer4 (&amp;quot;net_preloadedServer4&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 4 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer5 (&amp;quot;net_preloadedServer5&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 5 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer6 (&amp;quot;net_preloadedServer6&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 6 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer7 (&amp;quot;net_preloadedServer7&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 7 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer8 (&amp;quot;net_preloadedServer8&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 8 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer9 (&amp;quot;net_preloadedServer9&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 9 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer10 (&amp;quot;net_preloadedServer10&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 10 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer11 (&amp;quot;net_preloadedServer11&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 11 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer12 (&amp;quot;net_preloadedServer12&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 12 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer13 (&amp;quot;net_preloadedServer13&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 13 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer14 (&amp;quot;net_preloadedServer14&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 14 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer15 (&amp;quot;net_preloadedServer15&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 15 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer16 (&amp;quot;net_preloadedServer16&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 16 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer17 (&amp;quot;net_preloadedServer17&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 17 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer18 (&amp;quot;net_preloadedServer18&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 18 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer19 (&amp;quot;net_preloadedServer19&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 19 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer20 (&amp;quot;net_preloadedServer20&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 20 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer21 (&amp;quot;net_preloadedServer21&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 21 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer22 (&amp;quot;net_preloadedServer22&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 22 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer23 (&amp;quot;net_preloadedServer23&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 23 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer24 (&amp;quot;net_preloadedServer24&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 24 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer25 (&amp;quot;net_preloadedServer25&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 25 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer26 (&amp;quot;net_preloadedServer26&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 26 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer27 (&amp;quot;net_preloadedServer27&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 27 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer28 (&amp;quot;net_preloadedServer28&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 28 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer29 (&amp;quot;net_preloadedServer29&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 29 (IP:port)&amp;quot;);&lt;br /&gt;idCVar net_preloadedServer30 (&amp;quot;net_preloadedServer30&amp;quot;, &amp;quot;&amp;quot;, CVAR_ARCHIVE, &amp;quot;Preloaded server 30 (IP:port)&amp;quot;);&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;static idCVar* preloadedServers[30] = {&lt;br /&gt;	&amp;amp;net_preloadedServer1, 	&amp;amp;net_preloadedServer2, 	&amp;amp;net_preloadedServer3,	&amp;amp;net_preloadedServer4,	&amp;amp;net_preloadedServer5,&lt;br /&gt;	&amp;amp;net_preloadedServer6,	&amp;amp;net_preloadedServer7,	&amp;amp;net_preloadedServer8,	&amp;amp;net_preloadedServer9,	&amp;amp;net_preloadedServer10,&lt;br /&gt;	&amp;amp;net_preloadedServer11, &amp;amp;net_preloadedServer12,	&amp;amp;net_preloadedServer13,	&amp;amp;net_preloadedServer14,	&amp;amp;net_preloadedServer15,&lt;br /&gt;	&amp;amp;net_preloadedServer16,	&amp;amp;net_preloadedServer17,	&amp;amp;net_preloadedServer18,	&amp;amp;net_preloadedServer19,	&amp;amp;net_preloadedServer20,&lt;br /&gt;	&amp;amp;net_preloadedServer21,	&amp;amp;net_preloadedServer22,	&amp;amp;net_preloadedServer23,	&amp;amp;net_preloadedServer24,	&amp;amp;net_preloadedServer25,&lt;br /&gt;	&amp;amp;net_preloadedServer26,	&amp;amp;net_preloadedServer27,	&amp;amp;net_preloadedServer28,	&amp;amp;net_preloadedServer29,	&amp;amp;net_preloadedServer30&lt;br /&gt;};&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;static bool NetAdrEqual(const netadr_t&amp;amp; a, const netadr_t&amp;amp; b) {&lt;br /&gt;	return a.type == b.type &amp;amp;&amp;amp;&lt;br /&gt;&amp;#160; &amp;#160; a.port == b.port &amp;amp;&amp;amp;&lt;br /&gt;&amp;#160; &amp;#160; memcmp(a.ip, b.ip, 4) == 0;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;const char* l_gameTypes[] = {&lt;br /&gt;	&amp;quot;Deathmatch&amp;quot;,&lt;br /&gt;	&amp;quot;Tourney&amp;quot;,&lt;br /&gt;	&amp;quot;Team DM&amp;quot;,&lt;br /&gt;	&amp;quot;Last Man&amp;quot;,&lt;br /&gt;	&amp;quot;CTF&amp;quot;,&lt;br /&gt;	NULL&lt;br /&gt;};&lt;/p&gt;
						&lt;p&gt;static idServerScan *l_serverScan = NULL;&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::idServerScan&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;idServerScan::idServerScan( ) {&lt;br /&gt;	m_pGUI = NULL;&lt;br /&gt;	m_sort = SORT_PING;&lt;br /&gt;	m_sortAscending = true;&lt;br /&gt;	challenge = 0;&lt;br /&gt;	LocalClear();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::LocalClear&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::LocalClear( ) {&lt;br /&gt;	scan_state = IDLE;&lt;br /&gt;	incoming_net = false;&lt;br /&gt;	lan_pingtime = -1;&lt;br /&gt;	net_info.Clear();&lt;br /&gt;	net_servers.Clear();&lt;br /&gt;	cur_info = 0;&lt;br /&gt;	if ( listGUI ) {&lt;br /&gt;&amp;#160; &amp;#160; listGUI-&amp;gt;Clear();&lt;br /&gt;	}&lt;br /&gt;	incoming_useTimeout = false;&lt;br /&gt;	m_sortedServers.Clear();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::Clear&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::Clear( ) {&lt;br /&gt;	LocalClear();&lt;br /&gt;	idList&amp;lt;networkServer_t&amp;gt;::Clear();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::Shutdown&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::Shutdown( ) {&lt;br /&gt;	m_pGUI = NULL;&lt;br /&gt;	if ( listGUI ) {&lt;br /&gt;&amp;#160; &amp;#160; listGUI-&amp;gt;Config( NULL, NULL );&lt;br /&gt;&amp;#160; &amp;#160; uiManager-&amp;gt;FreeListGUI( listGUI );&lt;br /&gt;&amp;#160; &amp;#160; listGUI = NULL;&lt;br /&gt;	}&lt;br /&gt;	screenshot.Clear();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::SetupLANScan&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::SetupLANScan( ) {	&lt;br /&gt;	Clear();&lt;br /&gt;	GUIUpdateSelected();&lt;br /&gt;	scan_state = LAN_SCAN;&lt;br /&gt;	challenge++;&lt;br /&gt;	lan_pingtime = Sys_Milliseconds();&lt;br /&gt;	common-&amp;gt;DPrintf( &amp;quot;SetupLANScan with challenge %d\n&amp;quot;, challenge );&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::InfoResponse&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;int idServerScan::InfoResponse( networkServer_t &amp;amp;server ) {&lt;br /&gt;	if ( scan_state == IDLE ) {&lt;br /&gt;&amp;#160; &amp;#160; return false;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	idStr serv = Sys_NetAdrToString( server.adr );&lt;/p&gt;
						&lt;p&gt;	if ( server.challenge != challenge ) {&lt;br /&gt;&amp;#160; &amp;#160; common-&amp;gt;DPrintf( &amp;quot;idServerScan::InfoResponse - ignoring response from %s, wrong challenge %d.&amp;quot;, serv.c_str(), server.challenge );&lt;br /&gt;&amp;#160; &amp;#160; return false;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	if ( scan_state == NET_SCAN ) {	&lt;br /&gt;&amp;#160; &amp;#160; const idKeyValue *info = net_info.FindKey( serv.c_str() );&lt;br /&gt;&amp;#160; &amp;#160; if ( !info ) {&lt;br /&gt;&amp;#160; &amp;#160; 	common-&amp;gt;DPrintf( &amp;quot;idServerScan::InfoResponse NET_SCAN: reply from unknown %s\n&amp;quot;, serv.c_str() );&lt;br /&gt;&amp;#160; &amp;#160; 	return false;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; int id = atoi( info-&amp;gt;GetValue() );&lt;br /&gt;&amp;#160; &amp;#160; net_info.Delete( serv.c_str() );&lt;br /&gt;&amp;#160; &amp;#160; inServer_t iserv = net_servers[ id ];&lt;br /&gt;&amp;#160; &amp;#160; server.ping = Sys_Milliseconds() - iserv.time;&lt;br /&gt;&amp;#160; &amp;#160; server.id = iserv.id;&lt;br /&gt;	} else {&lt;br /&gt;&amp;#160; &amp;#160; server.ping = Sys_Milliseconds() - lan_pingtime;&lt;br /&gt;&amp;#160; &amp;#160; server.id = 0;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // check for duplicate servers&lt;br /&gt;&amp;#160; &amp;#160; for ( int i = 0; i &amp;lt; Num() ; i++ ) {&lt;br /&gt;&amp;#160; &amp;#160; 	if ( memcmp( &amp;amp;(*this)[ i ].adr, &amp;amp;server.adr, sizeof(netadr_t) ) == 0 ) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; common-&amp;gt;DPrintf( &amp;quot;idServerScan::InfoResponse LAN_SCAN: duplicate server %s\n&amp;quot;, serv.c_str() );&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return true;&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	const char *si_map = server.serverInfo.GetString( &amp;quot;si_map&amp;quot; );&lt;br /&gt;	const idDecl *mapDecl = declManager-&amp;gt;FindType( DECL_MAPDEF, si_map, false );&lt;br /&gt;	const idDeclEntityDef *mapDef = static_cast&amp;lt; const idDeclEntityDef * &amp;gt;( mapDecl );&lt;br /&gt;	if ( mapDef ) {&lt;br /&gt;&amp;#160; &amp;#160; const char *mapName = common-&amp;gt;GetLanguageDict()-&amp;gt;GetString( mapDef-&amp;gt;dict.GetString( &amp;quot;name&amp;quot;, si_map ) );&lt;br /&gt;&amp;#160; &amp;#160; server.serverInfo.Set( &amp;quot;si_mapName&amp;quot;, mapName );&lt;br /&gt;	} else {&lt;br /&gt;&amp;#160; &amp;#160; server.serverInfo.Set( &amp;quot;si_mapName&amp;quot;, si_map );&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	int index = Append( server );&lt;br /&gt;	// for now, don&#039;t maintain sorting when adding new info response servers&lt;br /&gt;	m_sortedServers.Append( Num()-1 );&lt;br /&gt;	if ( listGUI-&amp;gt;IsConfigured( ) &amp;amp;&amp;amp; !IsFiltered( server ) ) {&lt;br /&gt;&amp;#160; &amp;#160; GUIAdd( Num()-1, server );&lt;br /&gt;	}&lt;br /&gt;	if ( listGUI-&amp;gt;GetSelection( NULL, 0 ) == ( Num()-1 ) ) {&lt;br /&gt;&amp;#160; &amp;#160; GUIUpdateSelected();&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	return index;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::AddServer&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::AddServer(int id, const char* srv) {&lt;br /&gt;	inServer_t s;&lt;/p&gt;
						&lt;p&gt;	incoming_net = true;&lt;br /&gt;	incoming_lastTime = Sys_Milliseconds() + INCOMING_TIMEOUT;&lt;br /&gt;	s.id = id;&lt;/p&gt;
						&lt;p&gt;	if (!Sys_StringToNetAdr(srv, &amp;amp;s.adr, false)) {&lt;br /&gt;&amp;#160; &amp;#160; common-&amp;gt;DPrintf(&amp;quot;idServerScan::AddServer: failed to parse server %s\n&amp;quot;, srv);&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	if (!s.adr.port) {&lt;br /&gt;&amp;#160; &amp;#160; s.adr.port = PORT_SERVER;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;	if (net_usePreloadedServers.GetBool()) {&lt;br /&gt;&amp;#160; &amp;#160; for (int i = 0; i &amp;lt; net_servers.Num(); i++) {&lt;br /&gt;&amp;#160; &amp;#160; 	if (NetAdrEqual(net_servers[i].adr, s.adr)) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; common-&amp;gt;DPrintf(&amp;quot;idServerScan::AddServer: duplicate server %s\n&amp;quot;, srv);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;	net_servers.Append(s);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::EndServers&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::EndServers( ) {&lt;br /&gt;	incoming_net = false;&lt;br /&gt;	l_serverScan = this;	&lt;br /&gt;	m_sortedServers.Sort( idServerScan::Cmp );	&lt;br /&gt;} &lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::StartServers&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::StartServers( bool timeout ) {&lt;br /&gt;	incoming_net = true;&lt;br /&gt;	incoming_useTimeout = timeout;&lt;br /&gt;	incoming_lastTime = Sys_Milliseconds() + REFRESH_START;&lt;/p&gt;
						&lt;p&gt;	&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;	if (net_usePreloadedServers.GetBool()) {&lt;br /&gt;&amp;#160; &amp;#160; AddPreloadedServers();&lt;br /&gt;	}&lt;/span&gt;&lt;br /&gt;	ApplyFilter();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::EmitGetInfo&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::EmitGetInfo( netadr_t &amp;amp;serv ) {&lt;br /&gt;	idAsyncNetwork::client.GetServerInfo( serv );&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;===============&lt;br /&gt;idServerScan::GetChallenge&lt;br /&gt;===============&lt;br /&gt;*/&lt;br /&gt;int idServerScan::GetChallenge( ) {&lt;br /&gt;	return challenge;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::NetScan&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::NetScan( ) {&lt;br /&gt;	if ( !idAsyncNetwork::client.IsPortInitialized() ) {&lt;br /&gt;&amp;#160; &amp;#160; // if the port isn&#039;t open, initialize it, but wait for a short&lt;br /&gt;&amp;#160; &amp;#160; // time to let the OS do whatever magic things it needs to do...&lt;br /&gt;&amp;#160; &amp;#160; idAsyncNetwork::client.InitPort();&lt;br /&gt;&amp;#160; &amp;#160; // start the scan one second from now...&lt;br /&gt;&amp;#160; &amp;#160; scan_state = WAIT_ON_INIT;&lt;br /&gt;&amp;#160; &amp;#160; endWaitTime = Sys_Milliseconds() + 1000;&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	// make sure the client port is open&lt;br /&gt;	idAsyncNetwork::client.InitPort();&lt;/p&gt;
						&lt;p&gt;	scan_state = NET_SCAN;&lt;br /&gt;	challenge++;&lt;/p&gt;
						&lt;p&gt;	idList&amp;lt;networkServer_t&amp;gt;::Clear();&lt;br /&gt;	m_sortedServers.Clear();&lt;br /&gt;	cur_info = 0;&lt;br /&gt;	net_info.Clear();&lt;br /&gt;	listGUI-&amp;gt;Clear();&lt;br /&gt;	GUIUpdateSelected();&lt;br /&gt;	common-&amp;gt;DPrintf( &amp;quot;NetScan with challenge %d\n&amp;quot;, challenge );&lt;/p&gt;
						&lt;p&gt;	while ( cur_info &amp;lt; Min( net_servers.Num(), MAX_PINGREQUESTS ) ) {&lt;br /&gt;&amp;#160; &amp;#160; netadr_t serv = net_servers[ cur_info ].adr;&lt;br /&gt;&amp;#160; &amp;#160; EmitGetInfo( serv );&lt;br /&gt;&amp;#160; &amp;#160; net_servers[ cur_info ].time = Sys_Milliseconds();&lt;br /&gt;&amp;#160; &amp;#160; net_info.SetInt( Sys_NetAdrToString( serv ), cur_info );&lt;br /&gt;&amp;#160; &amp;#160; cur_info++;&lt;br /&gt;	}&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;===============&lt;br /&gt;idServerScan::ServerScanFrame&lt;br /&gt;===============&lt;br /&gt;*/&lt;br /&gt;void idServerScan::RunFrame( ) {&lt;br /&gt;	if ( scan_state == IDLE ) {&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	} &lt;/p&gt;
						&lt;p&gt;	if ( scan_state == WAIT_ON_INIT ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( Sys_Milliseconds() &amp;gt;= endWaitTime ) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; scan_state = IDLE;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; NetScan();&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	} &lt;/p&gt;
						&lt;p&gt;	int timeout_limit = Sys_Milliseconds() - REPLY_TIMEOUT;&lt;/p&gt;
						&lt;p&gt;	if ( scan_state == LAN_SCAN ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( timeout_limit &amp;gt; lan_pingtime ) {&lt;br /&gt;&amp;#160; &amp;#160; 	common-&amp;gt;Printf( &amp;quot;Scanned for servers on the LAN\n&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; 	scan_state = IDLE;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	// if scan_state == NET_SCAN&lt;/p&gt;
						&lt;p&gt;	// check for timeouts&lt;br /&gt;	int i = 0;&lt;br /&gt;	while ( i &amp;lt; net_info.GetNumKeyVals() ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( timeout_limit &amp;gt; net_servers[ atoi( net_info.GetKeyVal( i )-&amp;gt;GetValue().c_str() ) ].time ) {&lt;br /&gt;&amp;#160; &amp;#160; 	common-&amp;gt;DPrintf( &amp;quot;timeout %s\n&amp;quot;, net_info.GetKeyVal( i )-&amp;gt;GetKey().c_str() );&lt;br /&gt;&amp;#160; &amp;#160; 	net_info.Delete( net_info.GetKeyVal( i )-&amp;gt;GetKey().c_str() );&lt;br /&gt;&amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; 	i++;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;&amp;#160; &amp;#160; 	&lt;br /&gt;	// possibly send more queries&lt;br /&gt;	while ( cur_info &amp;lt; net_servers.Num() &amp;amp;&amp;amp; net_info.GetNumKeyVals() &amp;lt; MAX_PINGREQUESTS ) {&lt;br /&gt;&amp;#160; &amp;#160; netadr_t serv = net_servers[ cur_info ].adr;&lt;br /&gt;&amp;#160; &amp;#160; EmitGetInfo( serv );&lt;br /&gt;&amp;#160; &amp;#160; net_servers[ cur_info ].time = Sys_Milliseconds();&lt;br /&gt;&amp;#160; &amp;#160; net_info.SetInt( Sys_NetAdrToString( serv ), cur_info );&lt;br /&gt;&amp;#160; &amp;#160; cur_info++;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	// update state&lt;br /&gt;	if ( ( !incoming_net || ( incoming_useTimeout &amp;amp;&amp;amp; Sys_Milliseconds() &amp;gt; incoming_lastTime ) ) &amp;amp;&amp;amp; net_info.GetNumKeyVals() == 0 ) {&lt;br /&gt;&amp;#160; &amp;#160; EndServers();&lt;br /&gt;&amp;#160; &amp;#160; // the list is complete, we are no longer waiting for any getInfo replies&lt;br /&gt;&amp;#160; &amp;#160; common-&amp;gt;Printf( &amp;quot;Scanned %d servers.\n&amp;quot;, cur_info );&lt;br /&gt;&amp;#160; &amp;#160; scan_state = IDLE;&lt;br /&gt;	}&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;===============&lt;br /&gt;idServerScan::GetBestPing&lt;br /&gt;===============&lt;br /&gt;*/&lt;br /&gt;bool idServerScan::GetBestPing( networkServer_t &amp;amp;serv ) {&lt;br /&gt;	int i, ic;&lt;br /&gt;	ic = Num();&lt;br /&gt;	if ( !ic ) {&lt;br /&gt;&amp;#160; &amp;#160; return false;&lt;br /&gt;	}&lt;br /&gt;	serv = (*this)[ 0 ];&lt;br /&gt;	for ( i = 0 ; i &amp;lt; ic ; i++ ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( (*this)[ i ].ping &amp;lt; serv.ping ) {&lt;br /&gt;&amp;#160; &amp;#160; 	serv = (*this)[ i ];&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;	return true;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::GUIConfig&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::GUIConfig( idUserInterface *pGUI, const char *name ) {&lt;br /&gt;	m_pGUI = pGUI;&lt;br /&gt;	if ( listGUI == NULL ) {&lt;br /&gt;&amp;#160; &amp;#160; listGUI = uiManager-&amp;gt;AllocListGUI();&lt;br /&gt;	}&lt;br /&gt;	listGUI-&amp;gt;Config( pGUI, name );&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::GUIUpdateSelected&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::GUIUpdateSelected( void ) {&lt;br /&gt;	char screenshot[ MAX_STRING_CHARS ];&lt;/p&gt;
						&lt;p&gt;	if ( !m_pGUI ) {&lt;br /&gt;&amp;#160; &amp;#160; return;&lt;br /&gt;	}&lt;br /&gt;	int i = listGUI-&amp;gt;GetSelection( NULL, 0 );&lt;br /&gt;	if ( i == -1 || i &amp;gt;= Num() ) {&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_name&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player1&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player2&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player3&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player4&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player5&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player6&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player7&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;player8&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_map&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;browser_levelshot&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_gameType&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_IP&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_passworded&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;	} else {&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_name&amp;quot;, (*this)[ i ].serverInfo.GetString( &amp;quot;si_name&amp;quot; ) );&lt;br /&gt;&amp;#160; &amp;#160; for ( int j = 0; j &amp;lt; 8; j++ ) {&lt;br /&gt;&amp;#160; &amp;#160; 	if ( (*this)[i].clients &amp;gt; j ) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( va( &amp;quot;player%i&amp;quot;, j + 1 ) , (*this)[ i ].nickname[ j ] );&lt;br /&gt;&amp;#160; &amp;#160; 	} else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( va( &amp;quot;player%i&amp;quot;, j + 1 ) , &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_map&amp;quot;, (*this)[ i ].serverInfo.GetString( &amp;quot;si_mapName&amp;quot; ) );&lt;br /&gt;&amp;#160; &amp;#160; fileSystem-&amp;gt;FindMapScreenshot( (*this)[ i ].serverInfo.GetString( &amp;quot;si_map&amp;quot; ), screenshot, MAX_STRING_CHARS );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;browser_levelshot&amp;quot;, screenshot );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_gameType&amp;quot;, (*this)[ i ].serverInfo.GetString( &amp;quot;si_gameType&amp;quot; ) );&lt;br /&gt;&amp;#160; &amp;#160; m_pGUI-&amp;gt;SetStateString( &amp;quot;server_IP&amp;quot;, Sys_NetAdrToString( (*this)[ i ].adr ) );&lt;br /&gt;&amp;#160; &amp;#160; if ( (*this)[ i ].serverInfo.GetBool( &amp;quot;si_usePass&amp;quot; ) ) {&lt;br /&gt;&amp;#160; &amp;#160; 	m_pGUI-&amp;gt;SetStateString( &amp;quot;server_passworded&amp;quot;, &amp;quot;PASSWORD REQUIRED&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; 	m_pGUI-&amp;gt;SetStateString( &amp;quot;server_passworded&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::GUIAdd&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::GUIAdd( int id, const networkServer_t server ) {&lt;br /&gt;	idStr name = server.serverInfo.GetString( &amp;quot;si_name&amp;quot;, GAME_NAME &amp;quot; Server&amp;quot; );&lt;br /&gt;	bool d3xp = false;&lt;br /&gt;	bool mod = false;&lt;/p&gt;
						&lt;p&gt;	if ( !idStr::Icmp( server.serverInfo.GetString( &amp;quot;fs_game&amp;quot; ), &amp;quot;d3xp&amp;quot; ) ||&lt;br /&gt;&amp;#160; &amp;#160;&amp;#160; !idStr::Icmp( server.serverInfo.GetString( &amp;quot;fs_game_base&amp;quot; ), &amp;quot;d3xp&amp;quot; ) ) {&lt;br /&gt;&amp;#160; &amp;#160; d3xp = true;&lt;br /&gt;	}&lt;br /&gt;	if ( server.serverInfo.GetString( &amp;quot;fs_game&amp;quot; )[ 0 ] != &#039;\0&#039; ) {&lt;br /&gt;&amp;#160; &amp;#160; mod = true;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	name += &amp;quot;\t&amp;quot;;&lt;br /&gt;	if ( server.serverInfo.GetString( &amp;quot;sv_punkbuster&amp;quot; )[ 0 ] == &#039;1&#039; ) {&lt;br /&gt;&amp;#160; &amp;#160; name += &amp;quot;mtr_PB&amp;quot;;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	name += &amp;quot;\t&amp;quot;;&lt;br /&gt;	if ( d3xp ) {&lt;br /&gt;&amp;#160; &amp;#160; // FIXME: even for a &#039;D3XP mod&#039;&lt;br /&gt;&amp;#160; &amp;#160; // could have a specific icon for this case&lt;br /&gt;&amp;#160; &amp;#160; name += &amp;quot;mtr_doom3XPIcon&amp;quot;;&lt;br /&gt;	} else if ( mod ) {&lt;br /&gt;&amp;#160; &amp;#160; name += &amp;quot;mtr_doom3Mod&amp;quot;;&lt;br /&gt;	} else {&lt;br /&gt;&amp;#160; &amp;#160; name += &amp;quot;mtr_doom3Icon&amp;quot;;&lt;br /&gt;	}&lt;br /&gt;	name += &amp;quot;\t&amp;quot;;&lt;br /&gt;	name += va( &amp;quot;%i/%i\t&amp;quot;, server.clients, server.serverInfo.GetInt( &amp;quot;si_maxPlayers&amp;quot; ) );&lt;br /&gt;	name += ( server.ping &amp;gt; -1 ) ? va( &amp;quot;%i\t&amp;quot;, server.ping ) : &amp;quot;na\t&amp;quot;;&lt;br /&gt;	name += server.serverInfo.GetString( &amp;quot;si_gametype&amp;quot; );&lt;br /&gt;	name += &amp;quot;\t&amp;quot;;&lt;br /&gt;	name += server.serverInfo.GetString( &amp;quot;si_mapName&amp;quot; );&lt;br /&gt;	name += &amp;quot;\t&amp;quot;;&lt;br /&gt;	listGUI-&amp;gt;Add( id, name );&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::ApplyFilter&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::ApplyFilter( ) {&lt;br /&gt;	int i;&lt;br /&gt;	networkServer_t serv;&lt;br /&gt;	idStr s;&lt;/p&gt;
						&lt;p&gt;	listGUI-&amp;gt;SetStateChanges( false );&lt;br /&gt;	listGUI-&amp;gt;Clear();&lt;br /&gt;	for ( i = m_sortAscending ? 0 : m_sortedServers.Num() - 1;&lt;br /&gt;&amp;#160; &amp;#160; 	m_sortAscending ? i &amp;lt; m_sortedServers.Num() : i &amp;gt;= 0;&lt;br /&gt;&amp;#160; &amp;#160; 	m_sortAscending ? i++ : i-- ) {&lt;br /&gt;&amp;#160; &amp;#160; serv = (*this)[ m_sortedServers[ i ] ];&lt;br /&gt;&amp;#160; &amp;#160; if ( !IsFiltered( serv ) ) {&lt;br /&gt;&amp;#160; &amp;#160; 	GUIAdd( m_sortedServers[ i ], serv );&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;	GUIUpdateSelected();&lt;br /&gt;	listGUI-&amp;gt;SetStateChanges( true );&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::IsFiltered&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;bool idServerScan::IsFiltered( const networkServer_t server ) {&lt;br /&gt;	int i;&lt;br /&gt;	const idKeyValue *keyval;&lt;/p&gt;
						&lt;p&gt;	// OS support filter&lt;br /&gt;#if 0&lt;br /&gt;	// filter out pure servers that won&#039;t provide checksumed game code for client OS&lt;br /&gt;	keyval = server.serverInfo.FindKey( &amp;quot;si_pure&amp;quot; );&lt;br /&gt;	if ( keyval &amp;amp;&amp;amp; !idStr::Cmp( keyval-&amp;gt;GetValue(), &amp;quot;1&amp;quot; ) ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( ( server.OSMask &amp;amp; ( 1 &amp;lt;&amp;lt; BUILD_OS_ID ) ) == 0 ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;#else&lt;br /&gt;	if ( ( server.OSMask &amp;amp; ( 1 &amp;lt;&amp;lt; BUILD_OS_ID ) ) == 0 ) {&lt;br /&gt;&amp;#160; &amp;#160; return true;&lt;br /&gt;	}&lt;br /&gt;#endif&lt;br /&gt;	// password filter&lt;br /&gt;	keyval = server.serverInfo.FindKey( &amp;quot;si_usePass&amp;quot; );&lt;br /&gt;	if ( keyval &amp;amp;&amp;amp; gui_filter_password.GetInteger() == 1 ) {&lt;br /&gt;&amp;#160; &amp;#160; // show passworded only&lt;br /&gt;&amp;#160; &amp;#160; if ( keyval-&amp;gt;GetValue()[ 0 ] == &#039;0&#039; ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	} else if ( keyval &amp;amp;&amp;amp; gui_filter_password.GetInteger() == 2 ) {&lt;br /&gt;&amp;#160; &amp;#160; // show no password only&lt;br /&gt;&amp;#160; &amp;#160; if ( keyval-&amp;gt;GetValue()[ 0 ] != &#039;0&#039; ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;	// players filter&lt;br /&gt;	keyval = server.serverInfo.FindKey( &amp;quot;si_maxPlayers&amp;quot; );&lt;br /&gt;	if ( keyval ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( gui_filter_players.GetInteger() == 1 &amp;amp;&amp;amp; server.clients == atoi( keyval-&amp;gt;GetValue() ) ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; } else if ( gui_filter_players.GetInteger() == 2 &amp;amp;&amp;amp; ( !server.clients || server.clients == atoi( keyval-&amp;gt;GetValue() ) ) ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;	// gametype filter&lt;br /&gt;	keyval = server.serverInfo.FindKey( &amp;quot;si_gameType&amp;quot; );&lt;br /&gt;	if ( keyval &amp;amp;&amp;amp; gui_filter_gameType.GetInteger() ) {&lt;br /&gt;&amp;#160; &amp;#160; i = 0;&lt;br /&gt;&amp;#160; &amp;#160; while ( l_gameTypes[ i ] ) {&lt;br /&gt;&amp;#160; &amp;#160; 	if ( !keyval-&amp;gt;GetValue().Icmp( l_gameTypes[ i ] ) ) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; break;&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; 	i++;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; if ( l_gameTypes[ i ] &amp;amp;&amp;amp; i != gui_filter_gameType.GetInteger() -1 ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;br /&gt;	// idle server filter&lt;br /&gt;	keyval = server.serverInfo.FindKey( &amp;quot;si_idleServer&amp;quot; );&lt;br /&gt;	if ( keyval &amp;amp;&amp;amp; !gui_filter_idle.GetInteger() ) {&lt;br /&gt;&amp;#160; &amp;#160; if ( !keyval-&amp;gt;GetValue().Icmp( &amp;quot;1&amp;quot; ) ) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	// autofilter D3XP games if the user does not has the XP installed&lt;br /&gt;	if(!fileSystem-&amp;gt;HasD3XP() &amp;amp;&amp;amp; !idStr::Icmp(server.serverInfo.GetString( &amp;quot;fs_game&amp;quot; ), &amp;quot;d3xp&amp;quot;)) {&lt;br /&gt;&amp;#160; &amp;#160; return true;&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	// filter based on the game doom or XP&lt;br /&gt;	if(gui_filter_game.GetInteger() == 1) { //Only Doom&lt;br /&gt;&amp;#160; &amp;#160; if(idStr::Icmp(server.serverInfo.GetString(&amp;quot;fs_game&amp;quot;), &amp;quot;&amp;quot;)) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	} else if(gui_filter_game.GetInteger() == 2) { //Only D3XP&lt;br /&gt;&amp;#160; &amp;#160; if(idStr::Icmp(server.serverInfo.GetString(&amp;quot;fs_game&amp;quot;), &amp;quot;d3xp&amp;quot;)) {&lt;br /&gt;&amp;#160; &amp;#160; 	return true;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;	}&lt;/p&gt;
						&lt;p&gt;	return false;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::Cmp&lt;br /&gt;================&lt;br /&gt;*/&lt;/p&gt;
						&lt;p&gt;int idServerScan::Cmp( const int *a, const int *b ) {&lt;br /&gt;	networkServer_t serv1, serv2;&lt;br /&gt;	idStr s1, s2;&lt;br /&gt;	int ret;&lt;/p&gt;
						&lt;p&gt;	serv1 = (*l_serverScan)[ *a ];&lt;br /&gt;	serv2 = (*l_serverScan)[ *b ];&lt;br /&gt;	switch ( l_serverScan-&amp;gt;m_sort ) {&lt;br /&gt;&amp;#160; &amp;#160; case SORT_PING:&lt;br /&gt;&amp;#160; &amp;#160; 	ret = serv1.ping &amp;lt; serv2.ping ? -1 : ( serv1.ping &amp;gt; serv2.ping ? 1 : 0 );&lt;br /&gt;&amp;#160; &amp;#160; 	return ret;&lt;br /&gt;&amp;#160; &amp;#160; case SORT_SERVERNAME:&lt;br /&gt;&amp;#160; &amp;#160; 	serv1.serverInfo.GetString( &amp;quot;si_name&amp;quot;, &amp;quot;&amp;quot;, s1 );&lt;br /&gt;&amp;#160; &amp;#160; 	serv2.serverInfo.GetString( &amp;quot;si_name&amp;quot;, &amp;quot;&amp;quot;, s2 );&lt;br /&gt;&amp;#160; &amp;#160; 	return s1.IcmpNoColor( s2 );&lt;br /&gt;&amp;#160; &amp;#160; case SORT_PLAYERS:&lt;br /&gt;&amp;#160; &amp;#160; 	ret = serv1.clients &amp;lt; serv2.clients ? -1 : ( serv1.clients &amp;gt; serv2.clients ? 1 : 0 );&lt;br /&gt;&amp;#160; &amp;#160; 	return ret;&lt;br /&gt;&amp;#160; &amp;#160; case SORT_GAMETYPE:&lt;br /&gt;&amp;#160; &amp;#160; 	serv1.serverInfo.GetString( &amp;quot;si_gameType&amp;quot;, &amp;quot;&amp;quot;, s1 );&lt;br /&gt;&amp;#160; &amp;#160; 	serv2.serverInfo.GetString( &amp;quot;si_gameType&amp;quot;, &amp;quot;&amp;quot;, s2 );&lt;br /&gt;&amp;#160; &amp;#160; 	return s1.Icmp( s2 );&lt;br /&gt;&amp;#160; &amp;#160; case SORT_MAP:&lt;br /&gt;&amp;#160; &amp;#160; 	serv1.serverInfo.GetString( &amp;quot;si_mapName&amp;quot;, &amp;quot;&amp;quot;, s1 );&lt;br /&gt;&amp;#160; &amp;#160; 	serv2.serverInfo.GetString( &amp;quot;si_mapName&amp;quot;, &amp;quot;&amp;quot;, s2 );&lt;br /&gt;&amp;#160; &amp;#160; 	return s1.Icmp( s2 );&lt;br /&gt;&amp;#160; &amp;#160; case SORT_GAME:&lt;br /&gt;&amp;#160; &amp;#160; 	serv1.serverInfo.GetString( &amp;quot;fs_game&amp;quot;, &amp;quot;&amp;quot;, s1 );&lt;br /&gt;&amp;#160; &amp;#160; 	serv2.serverInfo.GetString( &amp;quot;fs_game&amp;quot;, &amp;quot;&amp;quot;, s2 );&lt;br /&gt;&amp;#160; &amp;#160; 	return s1.Icmp( s2 );&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;/*&lt;br /&gt;================&lt;br /&gt;idServerScan::SetSorting&lt;br /&gt;================&lt;br /&gt;*/&lt;br /&gt;void idServerScan::SetSorting( serverSort_t sort ) {&lt;br /&gt;	l_serverScan = this;&lt;br /&gt;	if ( sort == m_sort ) {&lt;br /&gt;&amp;#160; &amp;#160; m_sortAscending = !m_sortAscending;&lt;br /&gt;	} else {&lt;br /&gt;&amp;#160; &amp;#160; m_sort = sort;&lt;br /&gt;&amp;#160; &amp;#160; m_sortAscending = true; // is the default for any new sort&lt;br /&gt;&amp;#160; &amp;#160; m_sortedServers.Sort( idServerScan::Cmp );&lt;br /&gt;	}&lt;br /&gt;	// trigger a redraw&lt;br /&gt;	ApplyFilter();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;void idServerScan::AddPreloadedServers() {&lt;br /&gt;	for (int i = 0; i &amp;lt; 30; i++) {&lt;br /&gt;&amp;#160; &amp;#160; const char* srv = preloadedServers[i]-&amp;gt;GetString();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;&amp;#160; &amp;#160; if (!srv[0]) {&lt;br /&gt;&amp;#160; &amp;#160; 	continue;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;br /&gt;&amp;#160; &amp;#160; inServer_t s;&lt;br /&gt;&amp;#160; &amp;#160; if (!Sys_StringToNetAdr(srv, &amp;amp;s.adr, false)) {&lt;br /&gt;&amp;#160; &amp;#160; 	common-&amp;gt;DPrintf(&amp;quot;idServerScan::AddPreloadedServers: failed to parse server %s\n&amp;quot;, srv);&lt;br /&gt;&amp;#160; &amp;#160; 	continue;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; if (!s.adr.port) {&lt;br /&gt;&amp;#160; &amp;#160; 	s.adr.port = PORT_SERVER;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; bool duplicate = false;&lt;br /&gt;&amp;#160; &amp;#160; for (int j = 0; j &amp;lt; net_servers.Num(); j++) {&lt;br /&gt;&amp;#160; &amp;#160; 	if (NetAdrEqual(net_servers[j].adr, s.adr)) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; duplicate = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; break;&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; if (duplicate) {&lt;br /&gt;&amp;#160; &amp;#160; 	common-&amp;gt;DPrintf(&amp;quot;idServerScan::AddPreloadedServers: duplicate server %s\n&amp;quot;,	srv);&lt;br /&gt;&amp;#160; &amp;#160; 	continue;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; s.id = 777 + i;&lt;br /&gt;&amp;#160; &amp;#160; net_servers.Append(s);&lt;br /&gt;&amp;#160; &amp;#160; common-&amp;gt;DPrintf(&amp;quot;idServerScan::AddPreloadedServers: added %s with id %d\n&amp;quot;,	Sys_NetAdrToString(s.adr), s.id);&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Sun, 20 Sep 2026 15:02:01 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6480#p6480</guid>
		</item>
		<item>
			<title>Новые карты для Doom&#039;a 3</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6477#p6477</link>
			<description>&lt;p&gt;Обновил свою старую карту Deck 16. Улучшил её геймплейно - скорректировал геометрию для более интересных игровых ситуаций, добавил мелких деталей, освежил визуал. Добавил на карту эмбиент и звуки.&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://www.moddb.com/mods/deck-16-20-multiplayer-map&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Скачать Deck 16 (2.0) с ModDB&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Sun, 22 Jun 2025 15:06:04 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6477#p6477</guid>
		</item>
		<item>
			<title>GUI и все что с ними связано.</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6476#p6476</link>
			<description>&lt;p&gt;Неплохой туториал по работе с GUI в Doom 3:&lt;br /&gt;&lt;a href=&quot;https://www.moddb.com/games/doom-iii/tutorials/doom-3-gui-scripting-tutorials&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.moddb.com/games/doom-iii/tu &amp;#8230; -tutorials&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Sun, 22 Jun 2025 14:11:49 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6476#p6476</guid>
		</item>
		<item>
			<title>Новости маппинга</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6474#p6474</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Проект ещё жив) Переоценил свои способности и не получилось так быстро довести карту до бета теста...&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;И снова карта была заброшена на несколько лет и снова я продолжил её делать) Уже как месяцев 6 её периодически ковыряю, по состоянию могу сказать следующее:&lt;br /&gt;За эти полгода сделал очень многое, многое доделал, многое починил. &lt;br /&gt;Много было возни с текстурками. Часть пришлось создавать самому т.к. стандартными не получилось полностью вывезти концепцию и стилистику.&lt;br /&gt;Много было возни с геометрией. С начала разработки прошло уже много времени, среднестатистическая производительность ПК выросла и, если поначалу приходилось ужиматься в деталях в пользу открытых пространств, которыми преобладает карта, то сейчас уже больше не было смысла жертвовать красотой ради FPS, но тут я столкнулся с другой проблемой, о ней чуть ниже...&lt;br /&gt;Прокачал освещение, убрал этот ущербный материал с общим глобальным освещением без бамп маппинга и карты освещения. Настроил освещение индивидуально в каждой зоне, бамп и спекуляры теперь присутствуют, но пришлось отказаться от теней в пользу производительности (тени в Doom 3 катастрофически губят производительность).&lt;br /&gt;Но теперь о проблеме. После повышения детализации напоролся на такие побочки, как нехватка памяти (не ПК, а 32 битного приложения). Карта в определенные моменты просто отказывается компилироваться, редактор начинает вылетать с ошибками о недостатке памяти. Сейчас вылеты бывают двух типов - рандомные и постоянные. Сначала появились рандомные, их можно терпеть, просто попытавшись скомпилировать карту ещё несколько раз. Обычно раз на 2й-4й карта компилируется нормально. Но в последнее время уже трижды столкнулся с постоянными, когда карта вообще перестаёт компилироваться. В первый раз в одной из зон оказалась дыра, но редактор не сообщал об этом, а просто падал с ошибкой, так что обнаружил не сразу. Во второй раз слишком разошёлся с источниками света, слишком много их сделал. Пришлось убирать и оптимизировать. Ну и в третий раз, буквально на днях снова попал на такую ошибку, ничего не помогало, пока не решил просто все зоны максимально сдвинуть друг к другу (но чтоб зоны не пересекались освещением). Помогло. Видимо редактор резервирует в памяти занятую рабочую область, и если 2 зоны уровня находятся по разным сторонам полотна редактора, допустим в левом нижнем углу и в правом верхнем, то при компиляции движок будет пробегать по всем координатам между ними, и если объектов на карте очень много, то память в процессе тупо переполняется. Но я бы не сказал, что у меня зоны были шибко далеко друг от друга, так что видимо я приблизился к пределу движка, как бы печально это не звучало... Видимо теперь последний рывок, доделываю то, что есть и в релиз. Надеюсь под нагрузкой с несколькими игроками карта будет стабильно работать, ибо помню печальный опыт с FRDM1, когда заморочился с оптимизацией и добился 60 FPS при игре на своём сервере в одиночку, но стоило зайти ещё 2-3 игрокам, так фпс просаживался до 30... Но это ещё на том, древнем железе, с 1 ядром на 1.8 ГГц и 1.5 ГБ ОЗУ.&lt;br /&gt;Скринов пока нет, думаю по приколу сделаю трейлер, когда всё там доведу до ума)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Tue, 18 Feb 2025 15:03:30 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6474#p6474</guid>
		</item>
		<item>
			<title>Во что играете?</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6473#p6473</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Кстати давно уже хочу глянуть FF, т.к. ни разу ни в одну из частей не играл и даже со вселенной практически не знаком. Но отпугивает пока количество частей) Их там штук 16, а проходить, по идее, надо с первой.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;У многих японских серий игр (особенно у старых) есть такая фишка, что номерные части друг от друга никак не зависят. Финалка не исключение. Каждая номерная часть это отдельный сюжет, персонажи, мир и тд. Можно просто любую выбирать и играть.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Sun, 09 Feb 2025 00:12:20 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6473#p6473</guid>
		</item>
		<item>
			<title>Какой у вас компьютер?</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6466#p6466</link>
			<description>&lt;p&gt;Основная машина, собрал в декабре 2023:&lt;/p&gt;
						&lt;p&gt;МП: MSI MAG X670E TOMAHAWK WIFI (неплохая, но дорогая, наличие PCI Express 5.0 сейчас всё-таки излишне, но зато хороший запас на будущее)&lt;br /&gt;Проц: AMD Ryzen 9 7900X (моё почтение &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/BGn8J.gif&quot; alt=&quot;http://s5.uploads.ru/BGn8J.gif&quot; /&gt;. Тот самый проц, который под нагрузкой, готов ещё на нагрузку &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/3J9vY.gif&quot; alt=&quot;http://s5.uploads.ru/3J9vY.gif&quot; /&gt;)&lt;br /&gt;Видео: GeForce RTX 3070 TI (брал ещё в начале 2023 года, до сих пор всем устраивает и всё тянет, но если буду менять, то на 5000 серию RTX, либо аналог от AMD)&lt;br /&gt;SSD: Системный на 1TB (на PCIE 5, под систему и самое нужное, решил ради интереса попробовать, но какой-то ощутимой разницы с обычными SSD не заметил) + 2TB (на PCIE 4, под игры, софт и т.д.)&lt;br /&gt;HDD: 1TB + 500GB (под файловое хранилище)&lt;br /&gt;ОЗУ: 64GB DDR5&lt;/p&gt;
						&lt;p&gt;Мне для &lt;del&gt;учебы&lt;/del&gt;девелоперских нужд &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s4.uploads.ru/a3nM6.gif&quot; alt=&quot;http://s4.uploads.ru/a3nM6.gif&quot; /&gt; &lt;br /&gt;ПК используется максимально разносторонне (кодинг, рендеринг, запись музыки, виртуалки), поэтому железо подбирал сочное.&lt;br /&gt;В чем разочаровался - BIOS писец как долго грузится, если винда загружается секунды за 4, то биос может грузиться секунд 10-20.&lt;br /&gt;Но в остальном всё отлично, правда играть особо не во что &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/3J9vY.gif&quot; alt=&quot;http://s5.uploads.ru/3J9vY.gif&quot; /&gt; Вот недавно починил свои старенькие Денди (NES) и Playstation 1, в них даже как-то интереснее посидеть. Ну либо вот в своём старом ПК посидеть из сообщения выше, рубануть во что-нибудь DOS&#039;овское &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s4.uploads.ru/rcl5t.gif&quot; alt=&quot;http://s4.uploads.ru/rcl5t.gif&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Итого эволюция за 26 лет -&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Проц:&lt;/strong&gt; 600 МГц и 1 ядро -&amp;gt; 4700 МГц и 12 ядер/24 потока &lt;strong&gt;(Intel Celeron 600E -&amp;gt; AMD Athlon 64 2800+ -&amp;gt; Intel Core i7 2600k -&amp;gt; AMD Ryzen 9 7900X)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Видео:&lt;/strong&gt; 8 Мб, чип 143 МГц, память 143 МГц -&amp;gt; 8192 Мб, чип 1500 МГц, память 19000 МГц &lt;strong&gt;(3dfx Velocity 100 -&amp;gt; NVIDIA GeForce 6800 LE -&amp;gt; ATI Radeon HD 3850 -&amp;gt; AMD Radeon HD 6950 -&amp;gt; NVIDIA GeForce 1660 SUPER -&amp;gt; NVIDIA RTX 3070 TI)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Постоянная память:&lt;/strong&gt; 10 Гб HDD -&amp;gt; 3000 Гб SSD &lt;strong&gt;(10 Гб -&amp;gt; 80 Гб -&amp;gt; 580 Гб -&amp;gt; 1500 Гб -&amp;gt; 4500 Гб)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ОЗУ:&lt;/strong&gt; 64 Мб 133 МГц -&amp;gt; 64000 Мб 6000 МГц &lt;strong&gt;(64 Мб -&amp;gt; 192 Мб -&amp;gt; 512 Мб -&amp;gt; 1536 Мб -&amp;gt; 4096 Мб -&amp;gt; 8192 Мб -&amp;gt; 65536 Мб)&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;В скобках попытался вспомнить что на что менял, обновку старого компа не учитывал, т.к. это вышло из основного &amp;quot;таймлайна&amp;quot;))&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Mon, 20 Jan 2025 08:36:35 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6466#p6466</guid>
		</item>
		<item>
			<title>Разговариваем про маппинг</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6460#p6460</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Я свою карту, видимо, потомкам передам доделывать&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Надо нейросетку натренировать карты под дум маппить))) Быстрее выйдет и проще, чем самому доделывать&amp;#160; &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/3J9vY.gif&quot; alt=&quot;http://s5.uploads.ru/3J9vY.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Thu, 19 Dec 2024 17:10:56 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6460#p6460</guid>
		</item>
		<item>
			<title>Флудилка</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6459#p6459</link>
			<description>&lt;p&gt;Лень регистрироваться? Тогда тебе сюда &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/FBPoZ.gif&quot; alt=&quot;http://s5.uploads.ru/FBPoZ.gif&quot; /&gt;&lt;br /&gt;Спам будет удаляться. Мат с высокой вероятностью тоже. &lt;br /&gt;Уважайте себя и своих собеседников!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Wed, 18 Dec 2024 23:11:06 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6459#p6459</guid>
		</item>
		<item>
			<title>Другие прикольные скрины и картинки.</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6456#p6456</link>
			<description>&lt;p&gt;Уууу, такое золото в интернет архиве нашёл)))&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box media-box&quot;&gt;&lt;div onclick=&quot;toggleSpoiler(this);&quot;&gt;Первый рус форум&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;script type=&quot;text/html&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/0002/8c/f5/2/663834.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t663834.png&quot; alt=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t663834.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box media-box&quot;&gt;&lt;div onclick=&quot;toggleSpoiler(this);&quot;&gt;Школьные разборки 1&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;script type=&quot;text/html&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/0002/8c/f5/2/258922.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t258922.png&quot; alt=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t258922.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box media-box&quot;&gt;&lt;div onclick=&quot;toggleSpoiler(this);&quot;&gt;Школьные разборки 2&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;script type=&quot;text/html&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/0002/8c/f5/2/996247.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t996247.png&quot; alt=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t996247.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box media-box&quot;&gt;&lt;div onclick=&quot;toggleSpoiler(this);&quot;&gt;Школьные разборки 3&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;script type=&quot;text/html&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/0002/8c/f5/2/859081.png&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t859081.png&quot; alt=&quot;https://upforme.ru/uploads/0002/8c/f5/2/t859081.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/script&gt;&lt;/div&gt;
						&lt;p&gt;P.S. Да, Andrey[xXx] это я. Нет, что там за история с рукой я не помню &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/g7lG3.gif&quot; alt=&quot;http://s5.uploads.ru/g7lG3.gif&quot; /&gt; &lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://s5.uploads.ru/g7lG3.gif&quot; alt=&quot;http://s5.uploads.ru/g7lG3.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Wed, 18 Dec 2024 18:23:06 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6456#p6456</guid>
		</item>
		<item>
			<title>Информация</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6454#p6454</link>
			<description>&lt;p&gt;Открыл форум на чтение гостям.&lt;br /&gt;Мне кажется это ограничение уже давно не актуально (и было ли актуальным вообще? что и от кого прятали? :D )&lt;/p&gt;
						&lt;p&gt;P.S. Минутка интересных фактов: &lt;br /&gt;Оказывается этот форум был создан всего-лишь через полгода после создания того самого утерянного форума Спринтера. Регистрация там Спринтера датируется 2007-04-11 (через WaybackMachine глянул), а этот форум был создан 2007-12-03.&lt;br /&gt;А второй форум, который &amp;quot;Форум думеров и не только&amp;quot; (doom3ru.mybb), был создан только через год, в сентябре 2008.&lt;br /&gt;Так что получается, наш форум сейчас самый древнейший из оставшихся mybb&#039;овских) Неожиданно)&lt;br /&gt;И по идее один из самых древних по тематике Doom 3 в СНГ, т.к. у меня на слуху только Doom3.ru и iddqd.ru, но это больше сайты, чем форумы.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Wed, 18 Dec 2024 13:19:11 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6454#p6454</guid>
		</item>
		<item>
			<title>Уроки по маппингу</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6453#p6453</link>
			<description>&lt;p&gt;Красава&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Doctor Death)</author>
			<pubDate>Fri, 04 Oct 2024 01:24:01 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6453#p6453</guid>
		</item>
		<item>
			<title>Видео</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6450#p6450</link>
			<description>&lt;p&gt;Это должно быть тут.&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Mon, 25 Mar 2024 14:58:31 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6450#p6450</guid>
		</item>
		<item>
			<title>Скрипты</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6447#p6447</link>
			<description>&lt;p&gt;Годный гайд по полному перечню скриптовых команд для Doom 3:&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://modwiki.dhewm3.org/Script_events_(Doom_3)&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Modwiki dhewm3&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Также, полный список всех команд можно увидеть распаковав pak000.pk4. Все они перечислены с синтаксисом в файле script\doom_events.script&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Sun, 20 Aug 2023 20:26:17 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6447#p6447</guid>
		</item>
		<item>
			<title>Разговариваем обо всем №2</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6444#p6444</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Это рекламодатель сказал? Вообще не сталкивался, но слишком жирно для рекламного поста. Вы же не саму музыку через этот пост продавать собираетесь, какая им разница чей контент. &lt;br /&gt;В Москве играете? Скинь в личку ссылку на группу, мб &amp;quot;поджемим&amp;quot; как-нибудь)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Не в Москве. Мы ребята из Беларуси) Да и рока публично никогда не записывали. &amp;quot;Джемим&amp;quot;, но не на запись. А тут решили стебануться и записать &amp;quot;пацанский рэп&amp;quot;, хотя вся наша тусовка рэп терпеть не может. За рюмкой кофе написали какую-то хренотень, чисто в целях выстебать пафосных пацанчиков с района. Поэтому серьёзно воспринимать этот &amp;quot;шедевр&amp;quot; не стоит. &lt;a href=&quot;https://vk.com/jorshiks&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Кликабельно&lt;/a&gt;. Вообще у нас все по индастриалу и ню металу&amp;#160; 8-)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Respawner)</author>
			<pubDate>Fri, 18 Jun 2021 18:28:00 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6444#p6444</guid>
		</item>
		<item>
			<title>Флудилка</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6436#p6436</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Пока даже не собираюсь смотреть. Даже как-то неинтересно, учитывая какой уныленький Eternal сам по себе вышел&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;Аналогично. Я и оригинал то не прошел, за дополнение тем более не вижу смысла браться. Увы, не зацепила эта часть&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Fri, 27 Nov 2020 17:51:43 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6436#p6436</guid>
		</item>
		<item>
			<title>Offtopic</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6431#p6431</link>
			<description>&lt;p&gt;That sucked!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Tue, 30 Jun 2020 20:24:34 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6431#p6431</guid>
		</item>
		<item>
			<title>Разговариваем про игры</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6427#p6427</link>
			<description>&lt;p&gt;Кто нибудь играл в Rage 2? Стоит поиграть?&lt;br /&gt;После того, как я опробовал первый Rage, я на выход Rage 2 даже внимания не обратил. Проходная помойка. Но сегодня довелось поглядеть немного геймплея второй части и выглядит на порядок лучше первого Rage. Перестрелки весьма сочные, сюжет правда опять какой-то всратый, но стрельба хороша, особенно из дробовика. Может не всё так плохо? Играл кто, стоит на неё время тратить?&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Wed, 24 Jun 2020 10:59:49 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6427#p6427</guid>
		</item>
		<item>
			<title>Замечания и предложения</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6425#p6425</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;всё что я могу сейчас сюда прикрутить, это падающие снежинки&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Звучит неплохо)))&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Wed, 24 Jun 2020 10:36:28 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6425#p6425</guid>
		</item>
		<item>
			<title>Архив карт и модов</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6419#p6419</link>
			<description>&lt;p&gt;Ссылки как на карты и моды форумчан, так и на другие работы. В качестве файлообменника используется Mega. &lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://mega.nz/#!7dUGHQyR!DrsfD0_zK3kIYCeyza9BlOPVsn6I_YZNYXFDEN44S3Y&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; MARIO DOOM 1&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!SYUCyKRQ!c293TMxdWqPV5WhDOVKO0Jl3mRjeZKjqzgNekiAYO-U&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; MARIO DOOM 2&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!HJV2ECpA!RwwPb_cQ9lhji4TnnRqbT81cYg6cyALYBfFNLp1GLIQ&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; MARIO DOOM 3&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!rI9wVKDA!gJbou7Wz0TgQ6e50KBHt6wxXRSQBsuomUSPJ_KpaTc8&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; bassein2_2014&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!zU80mARK!byYSKU45CFBg2j7LSugWEyNj4qt37rVXZRea_3wIKVQ&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; City_2edition&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!iclgDKxD!YSujIp4MJyf5Sb8BeQIJnJiS0TN4-vPsXGkdSOo36Ag&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; CTM_shower&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!uclA3aLa!tSn5OAFBKNaCzaAzd3G5OEtxLMBqA-WMLyE04n6-fj8&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Туши Свет 2&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!rFsWhKha!sS694n3e49u6JjUWE9oD7yq-dfB5vyEFkfyZR88PSkA&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Episode&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!ncskkC7Y!5Xvoi9KEOcMLqPD62yMNssDByjIOS5ha6_BXKWsview&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Labirintian&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!qQ0QTCJJ!nm5tee9DsX9I6qhlFMlvpJ-DBkMj4WzS4RYEE3yNCvE&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; MEGA_CITY_M&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!DVsCiYCK!YJpSZQfEBfT1_-vn0pdAesFah-PIPPfK0q15uAYJHYs&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Mestnost_new&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!mBs0ia4Y!1zh-kAHQnEksodzdWU6sdac6iTcSryq9PJIn39Ykuy0&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Project2&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!bA1SDQZB!pzmXi6B5CM3l8kK4YtGimExAIj-V7j-EWvcxeOtufLQ&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; L_mod_v_1.4&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://mega.nz/#!iB1S1YDY!O-1PR1RpdLkyVPUMx4sIFF3P2ra9MEQP27VvrwK4_nk&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: aqua&quot;&gt; Saimon_garlik_coop&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;Это далеко не полный список того, что сделали члены этого форума. Большая просьба тем, у кого есть работы, не вошедшие в этот список, выложить их в этой теме.&lt;/p&gt;
						&lt;p&gt;У нас с &lt;a href=&quot;https://doom3.6bb.ru/profile.php?id=21&quot;&gt;XXX |V&lt;/a&gt; есть общая папка на Mega, в которой, помимо готовых карт и модов, присутствует множество недоделок и прочих интересных вещей. Если кому будет интересно посмотреть- стучитесь в лс, дам доступ к папке.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Wed, 12 Jun 2019 17:44:51 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6419#p6419</guid>
		</item>
		<item>
			<title>Прикольные скрины из Doom</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6418#p6418</link>
			<description>&lt;p&gt;ошибся игрой&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/7PIDc.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://sh.uploads.ru/t/7PIDc.jpg&quot; alt=&quot;http://sh.uploads.ru/t/7PIDc.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Wed, 12 Jun 2019 16:49:49 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6418#p6418</guid>
		</item>
		<item>
			<title>Новости</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6417#p6417</link>
			<description>&lt;p&gt;На Е3 были продемонстрированы 3 ролика. Сюжетный трейлер, геймплей и мультиплеерный трейлер с новым режимом. Смотрим.&lt;/p&gt;
						&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Wed, 12 Jun 2019 14:29:53 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6417#p6417</guid>
		</item>
		<item>
			<title>RedOctober4 с Днем Рождения!</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6397#p6397</link>
			<description>&lt;p&gt;:flag:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (RedOctober4)</author>
			<pubDate>Sun, 15 Jul 2018 22:07:24 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6397#p6397</guid>
		</item>
		<item>
			<title>Doom 3 - Phobos (MOD)</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6385#p6385</link>
			<description>&lt;p&gt;Освежающие память скриншоты:&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;1&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/shot2_11.jpg&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/shot2_11.jpg&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;2&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/phobosaction_1_1600x1200.jpg&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/phobosaction_1_1600x1200.jpg&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;3&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/hell02.jpg&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/hell02.jpg&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;4&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/gallery_9.png&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/gallery_9.png&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;5&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/shot5_11.jpg&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/shot5_11.jpg&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;6&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://media.moddb.com/images/mods/1/7/6603/shot00030.png&quot; alt=&quot;http://media.moddb.com/images/mods/1/7/6603/shot00030.png&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Wed, 23 May 2018 10:20:18 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6385#p6385</guid>
		</item>
		<item>
			<title>Карты</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6382#p6382</link>
			<description>&lt;p&gt;Моя сетевая Deathmatch карта RSpaceship. Забыл выложить её сюда еще тогда, когда сделал. Бегаем по космическому кораблю, вокруг космос и т.д. Старался использовать кастомную геометрию (еще до обновления, когда это разрешили официально и сделали для этого инструменты). Помимо этого, наверное первым, реализовал давящую ловушку (показана на видео).&lt;br /&gt;Код: WLRAFSEL&lt;br /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FoREVERror)</author>
			<pubDate>Thu, 20 Apr 2017 11:17:36 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6382#p6382</guid>
		</item>
		<item>
			<title>Впечатления</title>
			<link>https://doom3.6bb.ru/viewtopic.php?pid=6378#p6378</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;FoREVERror написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Впечатления о DOOM (2016)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Посмотрел - лайк поставил, на канал не подписывался)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (jONNY[ReWIRE])</author>
			<pubDate>Wed, 25 May 2016 14:55:20 +0300</pubDate>
			<guid>https://doom3.6bb.ru/viewtopic.php?pid=6378#p6378</guid>
		</item>
	</channel>
</rss>
