1
0
Fork 0
forked from fte/fteqw
fteqw/engine/client/cl_master.h
Spoike 5aa11ddbb1 makefile: attempt to fix freetype when not using makelibs (should make it slightly easier for people to compile with msys2 without needing to resort to cmake).
emenu: clean up hexen2's maplist options slightly.
emenu: modelviewer should now be slightly more friendly (click+wasd to move around).
particles: fix up randomised s coords.
csqc: try to fix issue with applycustomskin not refcounting properly.
client: [s_]precache and (new) mod_precache cvars can be set to 2 to precache the resources after load, for faster loading at the expense of some early stutter, without risking later mid-game stuttering.
gltf: add support for morphweights in a cpu-fallback path. don't expect good performance on surfaces with morphtargets for now.
gtlf: add some support for gltf1 files. far from perfect.
shaders: gltf1 semantics handling
shaders: const correctness
iqmtool: fix up mdl skin export.
iqmtool: integrate the engine's gltf2 loader. works with animated models, but unanimated ones suffer from basepose-different-from-bindpose issues.
q3bsp: hopefully fixed bih traces. still disabled for now.
qc: change default value of pr_gc_threaded to 1.
qcext: add the '__deprecated' keyword to various symbols in fteextensions.qc, now that fteqcc supports it.
ssqc: spit out a more readable error for WriteByte(MSG_CSQC,...) outside of SendEntity.
ssqc: add registercommand builtin, for consistency with menuqc and csqc (though only one can register any single command).
sv: report userinfo/serverinfo sizes (some clients still have arbitrary limits, plus its nice to see how abusive things are)
sv: try to optimise sv_cullentities_trace a little.
movechain: relink moved ents.
csqc: add spriteframe builtin, for freecs to use instead of more ugly less reliable hacks.
menuqc: fopen("tls://host:port", FILE_STREAM) should now open a tls stream. tcp:// should also work.



git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5703 fc73d0e0-1445-4013-8a0c-d673dee63da5
2020-06-12 23:29:58 +00:00

260 lines
5.9 KiB
C

#ifndef CL_MASTER_H
#define CL_MASTER_H
enum masterprotocol_e
{
MP_UNSPECIFIED,
MP_QUAKEWORLD,
#if defined(Q2CLIENT) || defined(Q2SERVER)
MP_QUAKE2,
#endif
#if defined(Q3CLIENT) || defined(Q3SERVER)
MP_QUAKE3,
#endif
#ifdef NQPROT
MP_NETQUAKE,
#endif
MP_DPMASTER
};
#if defined(CL_MASTER) && defined(HAVE_CLIENT)
#define SS_PROTOCOLMASK 0xf
#define SS_UNKNOWN 0
#define SS_QUAKEWORLD 1
#define SS_NETQUAKE 2
#define SS_DARKPLACES 3
#define SS_QUAKE2 4
#define SS_QUAKE3 5
//#define SS_UNUSED 6
//#define SS_UNUSED 7
#define SS_LOCAL (1<<3u) //local servers are ones we detected without being listed on a master server (masters will report public ips, so these may appear as dupes if they're also public)
#define SS_FTESERVER (1<<4u) //hehehe...
#define SS_FAVORITE (1<<5u) //filter all others.
#define SS_KEEPINFO (1<<6u)
#define SS_PROXY (1<<7u)
#define PING_DEAD 0xffff //default ping value to denote servers that are not responding.
#define PING_UNKNOWN 0xfffe //these servers are considered up, but we can't query them directly so can't determine the final ping from here.
#define PING_MAX 0xfffd //highest 'valid' ping value.
//despite not supporting nq or q2, we still load them. We just filter them. This is to make sure we properly write the listing files.
enum mastertype_e
{
MT_BAD, //this would be an error
// MT_MASTERHTTPJSON,
MT_MASTERHTTP,
MT_MASTERUDP,
MT_BCAST,
MT_SINGLE,
};
typedef enum hostcachekey_e
{
SLKEY_PING,
SLKEY_MAP,
SLKEY_NAME,
SLKEY_ADDRESS,
SLKEY_NUMPLAYERS,
SLKEY_MAXPLAYERS,
SLKEY_GAMEDIR,
SLKEY_FREEPLAYERS,
SLKEY_BASEGAME,
SLKEY_FLAGS,
SLKEY_TIMELIMIT,
SLKEY_FRAGLIMIT,
SLKEY_MOD,
SLKEY_PROTOCOL,
SLKEY_NUMBOTS, //uninteresting bots that will presumably get kicked if people join.
SLKEY_NUMSPECTATORS,//spectators
SLKEY_NUMHUMANS, //actual players
SLKEY_QCSTATUS,
SLKEY_CATEGORY, //urgh, hideous shite.
// SLKEY_PLAYERS, //eep!
SLKEY_ISFAVORITE,//eep!
SLKEY_ISLOCAL,
SLKEY_ISPROXY,
SLKEY_SERVERINFO,
SLKEY_TOOMANY,
SLKEY_PLAYER0,
SLKEY_CUSTOM = SLKEY_PLAYER0+MAX_CLIENTS
} hostcachekey_t;
typedef enum slist_test_e
{
SLIST_TEST_CONTAINS,
SLIST_TEST_NOTCONTAIN,
SLIST_TEST_LESSEQUAL,
SLIST_TEST_LESS,
SLIST_TEST_EQUAL,
SLIST_TEST_GREATER,
SLIST_TEST_GREATEREQUAL,
SLIST_TEST_NOTEQUAL,
SLIST_TEST_STARTSWITH,
SLIST_TEST_NOTSTARTSWITH
} slist_test_t;
//contains info about a server in greater detail. Could be too mem intensive.
typedef struct serverdetailedinfo_s
{
char info[MAX_SERVERINFO_STRING];
int numplayers;
struct serverdetailedplayerinfo_s
{
int userid;
int frags;
float time;
int ping;
char name[64];
char skin[16]; //is this even useful?
char team[16];
char topc;
char botc;
qbyte isspec;
} players[MAX_CLIENTS];
} serverdetailedinfo_t;
//hold minimum info.
typedef struct serverinfo_s
{
char name[80]; //hostname.
netadr_t adr;
char brokerid[64]; //'rtc[s]://adr//brokerid'
short special; //flags
short protocol;
qbyte players;
qbyte maxplayers;
qbyte sends;
qbyte status;
#define SRVSTATUS_ALIVE 1u //server is responding to pings
#define SRVSTATUS_DISPLAYED 2u //server passed all filters
#define SRVSTATUS_GLOBAL 4u //server was reported by one of the master servers (ie: global and not local)
qbyte numspectators;
qbyte numhumans;
qbyte numbots;
qbyte freeslots;
int qccategory; //urgh
char qcstatus[128];
char modname[8+1];
char gamedir[8+1];
char map[16];
unsigned short gameversion;
unsigned short ping;
short tl;
short fl;
float refreshtime;
serverdetailedinfo_t *moreinfo;
struct serverinfo_s *prevpeer;
unsigned short cost;
unsigned short numpeers;
struct peers_s
{
struct serverinfo_s *peer;
unsigned short ping;
} *peers;
struct serverinfo_s *next;
} serverinfo_t;
typedef struct master_s
{
struct master_s *next;
netadr_t adr;
char *address; //text based address (http servers)
struct dl_download *dl;
qbyte nosave;
qbyte mastertype;
qbyte protocoltype;
int sends; /*needs to resend?*/
char name[1];
} master_t;
extern struct selectedserver_s
{
qboolean inuse;
netadr_t adr;
char brokerid[64];
float refreshtime;
int lastplayer;
char lastrule[64];
serverdetailedinfo_t *detail;
int linenum;
} selectedserver;
typedef struct player_s
{
char name[16];
int frags;
int colour;
char skin[8];
char team[8];
netadr_t adr;
struct player_s *next;
} player_t;
void SListOptionChanged(serverinfo_t *newserver);
extern serverinfo_t *firstserver;
extern master_t *master;
extern player_t *mplayers;
extern qboolean sb_favouriteschanged;
void Master_SetupSockets(void);
qboolean CL_QueryServers(void);
int Master_CheckPollSockets(void);
void MasterInfo_Shutdown(void);
void MasterInfo_WriteServers(void);
serverinfo_t *Master_InfoForServer (netadr_t *addr, const char *brokerid);
serverinfo_t *Master_InfoForNum (int num);
unsigned int Master_TotalCount(void);
unsigned int Master_NumPolled(void); //progress indicator
unsigned int Master_NumAlive(void);
void Master_SetupSockets(void);
void MasterInfo_Refresh(qboolean doreset);
void Master_QueryServer(serverinfo_t *server);
void MasterInfo_WriteServers(void);
char *Master_ServerToString (char *s, int len, serverinfo_t *a); //like NET_AdrToString, but handles more complex addresses.
hostcachekey_t Master_KeyForName(const char *keyname);
float Master_ReadKeyFloat(serverinfo_t *server, hostcachekey_t keynum);
char *Master_ReadKeyString(serverinfo_t *server, hostcachekey_t keynum);
int Master_SortServers(void);
void Master_SetSortField(hostcachekey_t field, qboolean descending);
hostcachekey_t Master_GetSortField(void);
qboolean Master_GetSortDescending(void);
int Master_NumSorted(void);
void Master_ClearMasks(void);
serverinfo_t *Master_SortedServer(int idx);
void Master_SetMaskString(qboolean or_, hostcachekey_t field, const char *param, slist_test_t testop);
void Master_SetMaskInteger(qboolean or_, hostcachekey_t field, int param, slist_test_t testop);
serverinfo_t *Master_FindRoute(netadr_t target);
#endif
#endif