mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-11-30 16:11:11 +00:00
736ec20d4d
Don't include the lazy precompiled.h everywhere, only what's required for the compilation unit. platform.h needs to be included instead to provide all essential defines and types. All includes use the relative path to the neo or the game specific root. Move all idlib related includes from idlib/Lib.h to precompiled.h. precompiled.h still exists for the MFC stuff in tools/. Add some missing header guards.
172 lines
5.6 KiB
C++
172 lines
5.6 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 GPL Source Code
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
|
|
|
Doom 3 Source Code is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Doom 3 Source Code is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
===========================================================================
|
|
*/
|
|
|
|
#ifndef __SERVERSCAN_H__
|
|
#define __SERVERSCAN_H__
|
|
|
|
#include "ui/UserInterface.h"
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
Scan for servers, on the LAN or from a list
|
|
Update a listDef GUI through usage of idListGUI class
|
|
When updating large lists of servers, sends out getInfo in small batches to avoid congestion
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
// storage for incoming servers / server scan
|
|
typedef struct {
|
|
netadr_t adr;
|
|
int id;
|
|
int time;
|
|
} inServer_t;
|
|
|
|
// the menu gui uses a hard-coded control type to display a list of network games
|
|
typedef struct {
|
|
netadr_t adr;
|
|
idDict serverInfo;
|
|
int ping;
|
|
int id; // idnet mode sends an id for each server in list
|
|
int clients;
|
|
char nickname[ MAX_NICKLEN ][ MAX_ASYNC_CLIENTS ];
|
|
short pings[ MAX_ASYNC_CLIENTS ];
|
|
int rate[ MAX_ASYNC_CLIENTS ];
|
|
int OSMask;
|
|
int challenge;
|
|
} networkServer_t;
|
|
|
|
typedef enum {
|
|
SORT_PING,
|
|
SORT_SERVERNAME,
|
|
SORT_PLAYERS,
|
|
SORT_GAMETYPE,
|
|
SORT_MAP,
|
|
SORT_GAME
|
|
} serverSort_t;
|
|
|
|
class idServerScan : public idList<networkServer_t> {
|
|
public:
|
|
idServerScan( );
|
|
|
|
int InfoResponse( networkServer_t &server );
|
|
|
|
// add an internet server - ( store a numeric id along with it )
|
|
void AddServer( int id, const char *srv );
|
|
|
|
// we are going to feed server entries to be pinged
|
|
// if timeout is true, use a timeout once we start AddServer to trigger EndServers and decide the scan is done
|
|
void StartServers( bool timeout );
|
|
// we are done filling up the list of server entries
|
|
void EndServers( );
|
|
|
|
// scan the current list of servers - used for refreshes and while receiving a fresh list
|
|
void NetScan( );
|
|
|
|
// clear
|
|
void Clear( );
|
|
|
|
// called each game frame. Updates the scanner state, takes care of ongoing scans
|
|
void RunFrame( );
|
|
|
|
typedef enum {
|
|
IDLE = 0,
|
|
WAIT_ON_INIT,
|
|
LAN_SCAN,
|
|
NET_SCAN
|
|
} scan_state_t;
|
|
|
|
scan_state_t GetState() { return scan_state; }
|
|
void SetState( scan_state_t );
|
|
|
|
bool GetBestPing( networkServer_t &serv );
|
|
|
|
// prepare for a LAN scan. idAsyncClient does the network job (UDP broadcast), we do the storage
|
|
void SetupLANScan( );
|
|
|
|
void GUIConfig( idUserInterface *pGUI, const char *name );
|
|
// update the GUI fields with information about the currently selected server
|
|
void GUIUpdateSelected( void );
|
|
|
|
void Shutdown( );
|
|
|
|
void ApplyFilter( );
|
|
|
|
// there is an internal toggle, call twice with same sort to switch
|
|
void SetSorting( serverSort_t sort );
|
|
|
|
int GetChallenge( );
|
|
|
|
private:
|
|
static const int MAX_PINGREQUESTS = 32; // how many servers to query at once
|
|
static const int REPLY_TIMEOUT = 999; // how long should we wait for a reply from a game server
|
|
static const int INCOMING_TIMEOUT = 1500; // when we got an incoming server list, how long till we decide the list is done
|
|
static const int REFRESH_START = 10000; // how long to wait when sending the initial refresh request
|
|
|
|
scan_state_t scan_state;
|
|
|
|
bool incoming_net; // set to true while new servers are fed through AddServer
|
|
bool incoming_useTimeout;
|
|
int incoming_lastTime;
|
|
|
|
int lan_pingtime; // holds the time of LAN scan
|
|
|
|
// servers we're waiting for a reply from
|
|
// won't exceed MAX_PINGREQUESTS elements
|
|
// holds index of net_servers elements, indexed by 'from' string
|
|
idDict net_info;
|
|
|
|
idList<inServer_t> net_servers;
|
|
// where we are in net_servers list for getInfo emissions ( NET_SCAN only )
|
|
// we may either be waiting on MAX_PINGREQUESTS, or for net_servers to grow some more ( through AddServer )
|
|
int cur_info;
|
|
|
|
idUserInterface *m_pGUI;
|
|
idListGUI * listGUI;
|
|
|
|
serverSort_t m_sort;
|
|
bool m_sortAscending;
|
|
idList<int> m_sortedServers; // use ascending for the walking order
|
|
|
|
idStr screenshot;
|
|
int challenge; // challenge for current scan
|
|
|
|
int endWaitTime; // when to stop waiting on a port init
|
|
|
|
private:
|
|
void LocalClear( ); // we need to clear some internal data as well
|
|
|
|
void EmitGetInfo( netadr_t &serv );
|
|
void GUIAdd( int id, const networkServer_t server );
|
|
bool IsFiltered( const networkServer_t server );
|
|
|
|
static int Cmp( const int *a, const int *b );
|
|
};
|
|
|
|
#endif /* !__SERVERSCAN_H__ */
|