2014-03-15 16:59:03 +00:00
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1998-2000 by DooM Legacy Team.
2018-11-25 12:35:38 +00:00
// Copyright (C) 1999-2018 by Sonic Team Junior.
2014-03-15 16:59:03 +00:00
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file d_clisrv.h
/// \brief high level networking stuff
# ifndef __D_CLISRV__
# define __D_CLISRV__
2019-03-07 04:45:02 +00:00
# include "d_event.h"
2014-03-15 16:59:03 +00:00
# include "d_ticcmd.h"
# include "d_netcmd.h"
# include "tables.h"
# include "d_player.h"
2019-03-09 22:49:23 +00:00
# include "md5.h"
2014-03-15 16:59:03 +00:00
// Network play related stuff.
// There is a data struct that stores network
// communication related stuff, and another
// one that defines the actual packets to
// be transmitted.
2018-11-17 15:48:10 +00:00
// SOME numpty changed all the gametype constants and it fell out of sync with vanilla and now we have to pretend to be vanilla when talking to the master server...
# define VANILLA_GT_RACE 2
2018-11-28 17:37:36 +00:00
# if VERSION < 210
# define VANILLA_GT_MATCH 1
# else
2018-11-17 15:48:10 +00:00
# define VANILLA_GT_MATCH 3
2018-11-28 17:37:36 +00:00
# endif
2018-11-17 15:48:10 +00:00
2014-03-15 16:59:03 +00:00
// Networking and tick handling related.
# define BACKUPTICS 32
# define MAXTEXTCMD 256
//
// Packet structure
//
typedef enum
{
PT_NOTHING , // To send a nop through the network. ^_~
PT_SERVERCFG , // Server config used in start game
// (must stay 1 for backwards compatibility).
// This is a positive response to a CLIENTJOIN request.
PT_CLIENTCMD , // Ticcmd of the client.
PT_CLIENTMIS , // Same as above with but saying resend from.
PT_CLIENT2CMD , // 2 cmds in the packet for splitscreen.
PT_CLIENT2MIS , // Same as above with but saying resend from
PT_NODEKEEPALIVE , // Same but without ticcmd and consistancy
PT_NODEKEEPALIVEMIS ,
PT_SERVERTICS , // All cmds for the tic.
PT_SERVERREFUSE , // Server refuses joiner (reason inside).
PT_SERVERSHUTDOWN ,
PT_CLIENTQUIT , // Client closes the connection.
PT_ASKINFO , // Anyone can ask info of the server.
PT_SERVERINFO , // Send game & server info (gamespy).
PT_PLAYERINFO , // Send information for players in game (gamespy).
PT_REQUESTFILE , // Client requests a file transfer
PT_ASKINFOVIAMS , // Packet from the MS requesting info be sent to new client.
// If this ID changes, update masterserver definition.
2014-03-21 18:42:55 +00:00
PT_RESYNCHEND , // Player is now resynched and is being requested to remake the gametic
PT_RESYNCHGET , // Player got resynch packet
2014-03-15 16:59:03 +00:00
// Add non-PT_CANFAIL packet types here to avoid breaking MS compatibility.
2018-11-18 12:32:59 +00:00
// Kart-specific packets
PT_CLIENT3CMD , // 3P
PT_CLIENT3MIS ,
PT_CLIENT4CMD , // 4P
PT_CLIENT4MIS ,
2019-02-02 21:53:27 +00:00
PT_BASICKEEPALIVE , // Keep the network alive during wipes, as tics aren't advanced and NetUpdate isn't called
2018-11-18 12:32:59 +00:00
2019-03-06 04:27:25 +00:00
PT_JOINCHALLENGE , // You must give a password to joinnnnn
2019-03-09 19:30:22 +00:00
PT_DOWNLOADFILESOKAY , // You can download files from the server....
2019-03-06 04:27:25 +00:00
2014-03-15 16:59:03 +00:00
PT_CANFAIL , // This is kind of a priority. Anything bigger than CANFAIL
2016-12-31 18:26:33 +00:00
// allows HSendPacket(*, true, *, *) to return false.
2014-03-15 16:59:03 +00:00
// In addition, this packet can't occupy all the available slots.
PT_FILEFRAGMENT = PT_CANFAIL , // A part of a file.
PT_TEXTCMD , // Extra text commands from the client.
PT_TEXTCMD2 , // Splitscreen text commands.
2017-12-17 19:17:07 +00:00
PT_TEXTCMD3 , // 3P
PT_TEXTCMD4 , // 4P
2014-03-15 16:59:03 +00:00
PT_CLIENTJOIN , // Client wants to join; used in start game.
PT_NODETIMEOUT , // Packet sent to self if the connection times out.
2014-03-21 18:42:55 +00:00
PT_RESYNCHING , // Packet sent to resync players.
// Blocks game advance until synched.
2014-03-15 16:59:03 +00:00
# ifdef NEWPING
PT_PING , // Packet sent to tell clients the other client's latency to server.
# endif
NUMPACKETTYPE
} packettype_t ;
2016-12-31 18:26:33 +00:00
# ifdef PACKETDROP
void Command_Drop ( void ) ;
void Command_Droprate ( void ) ;
# endif
2017-01-14 18:24:22 +00:00
# ifdef _DEBUG
2017-01-13 19:53:52 +00:00
void Command_Numnodes ( void ) ;
# endif
2016-12-31 18:26:33 +00:00
2014-03-15 16:59:03 +00:00
# if defined(_MSC_VER)
# pragma pack(1)
# endif
2016-12-31 18:26:33 +00:00
// Client to server packet
2014-03-15 16:59:03 +00:00
typedef struct
{
UINT8 client_tic ;
UINT8 resendfrom ;
INT16 consistancy ;
ticcmd_t cmd ;
} ATTRPACK clientcmd_pak ;
2016-12-31 18:26:33 +00:00
// Splitscreen packet
2014-03-15 16:59:03 +00:00
// WARNING: must have the same format of clientcmd_pak, for more easy use
typedef struct
{
UINT8 client_tic ;
UINT8 resendfrom ;
INT16 consistancy ;
ticcmd_t cmd , cmd2 ;
} ATTRPACK client2cmd_pak ;
2017-12-19 01:59:04 +00:00
// 3P Splitscreen packet
2017-12-17 03:32:43 +00:00
// WARNING: must have the same format of clientcmd_pak, for more easy use
typedef struct
{
UINT8 client_tic ;
UINT8 resendfrom ;
INT16 consistancy ;
ticcmd_t cmd , cmd2 , cmd3 ;
} ATTRPACK client3cmd_pak ;
2017-12-19 01:59:04 +00:00
// 4P Splitscreen packet
2017-12-17 03:32:43 +00:00
// WARNING: must have the same format of clientcmd_pak, for more easy use
typedef struct
{
UINT8 client_tic ;
UINT8 resendfrom ;
INT16 consistancy ;
ticcmd_t cmd , cmd2 , cmd3 , cmd4 ;
} ATTRPACK client4cmd_pak ;
2014-03-15 16:59:03 +00:00
# ifdef _MSC_VER
# pragma warning(disable : 4200)
# endif
// Server to client packet
// this packet is too large
typedef struct
{
UINT8 starttic ;
UINT8 numtics ;
UINT8 numslots ; // "Slots filled": Highest player number in use plus one.
2016-12-31 18:26:33 +00:00
ticcmd_t cmds [ 45 ] ; // Normally [BACKUPTIC][MAXPLAYERS] but too large
2014-03-15 16:59:03 +00:00
} ATTRPACK servertics_pak ;
2016-12-31 18:26:33 +00:00
// Sent to client when all consistency data
2014-03-21 18:42:55 +00:00
// for players has been restored
2014-03-15 16:59:03 +00:00
typedef struct
{
UINT32 randomseed ;
2016-12-31 18:26:33 +00:00
// CTF flag stuff
2014-03-21 18:42:55 +00:00
SINT8 flagplayer [ 2 ] ;
INT32 flagloose [ 2 ] ;
INT32 flagflags [ 2 ] ;
fixed_t flagx [ 2 ] ;
fixed_t flagy [ 2 ] ;
fixed_t flagz [ 2 ] ;
2016-12-31 18:26:33 +00:00
UINT32 ingame ; // Spectator bit for each player
2017-01-03 22:43:46 +00:00
INT32 ctfteam [ MAXPLAYERS ] ; // Which team? (can't be 1 bit, since in regular Match there are no teams)
2014-03-21 18:42:55 +00:00
// Resynch game scores and the like all at once
2016-12-31 18:26:33 +00:00
UINT32 score [ MAXPLAYERS ] ; // Everyone's score
2018-10-30 20:24:27 +00:00
UINT32 marescore [ MAXPLAYERS ] ; // SRB2kart: Battle score
2014-03-21 18:42:55 +00:00
tic_t realtime [ MAXPLAYERS ] ;
UINT8 laps [ MAXPLAYERS ] ;
} ATTRPACK resynchend_pak ;
2014-03-15 16:59:03 +00:00
2014-03-21 18:42:55 +00:00
typedef struct
{
2016-12-31 18:26:33 +00:00
// Player stuff
2014-03-15 16:59:03 +00:00
UINT8 playernum ;
2014-03-21 18:42:55 +00:00
// Do not send anything visual related.
// Only send data that we need to know for physics.
2016-12-31 18:26:33 +00:00
UINT8 playerstate ; // playerstate_t
UINT32 pflags ; // pflags_t
UINT8 panim ; // panim_t
2014-03-21 18:42:55 +00:00
2014-03-15 16:59:03 +00:00
angle_t aiming ;
2018-10-30 21:03:11 +00:00
INT32 currentweapon ;
INT32 ringweapons ;
2018-10-30 05:23:21 +00:00
2014-03-15 16:59:03 +00:00
UINT16 powers [ NUMPOWERS ] ;
2014-03-21 18:42:55 +00:00
2016-08-12 01:42:11 +00:00
INT32 kartstuff [ NUMKARTSTUFF ] ; // SRB2kart
2017-11-05 21:34:12 +00:00
angle_t frameangle ; // SRB2kart
2016-08-12 01:42:11 +00:00
2014-03-21 18:42:55 +00:00
// Score is resynched in the confirm resync packet
INT32 health ;
SINT8 lives ;
2018-10-30 21:03:11 +00:00
SINT8 continues ;
UINT8 scoreadd ;
SINT8 xtralife ;
SINT8 pity ;
2014-03-21 18:42:55 +00:00
2014-03-15 16:59:03 +00:00
UINT8 skincolor ;
INT32 skin ;
2014-03-21 18:42:55 +00:00
// Just in case Lua does something like
// modify these at runtime
2017-02-07 22:19:04 +00:00
// SRB2kart
UINT8 kartspeed ;
UINT8 kartweight ;
2018-10-30 21:03:11 +00:00
//
fixed_t normalspeed ;
fixed_t runspeed ;
UINT8 thrustfactor ;
UINT8 accelstart ;
UINT8 acceleration ;
UINT8 charability ;
UINT8 charability2 ;
UINT32 charflags ;
UINT32 thokitem ; // mobjtype_t
UINT32 spinitem ; // mobjtype_t
UINT32 revitem ; // mobjtype_t
fixed_t actionspd ;
fixed_t mindash ;
fixed_t maxdash ;
fixed_t jumpfactor ;
2014-03-21 18:42:55 +00:00
2014-03-15 16:59:03 +00:00
fixed_t speed ;
2018-10-30 21:03:11 +00:00
UINT8 jumping ;
UINT8 secondjump ;
UINT8 fly1 ;
tic_t glidetime ;
UINT8 climbing ;
2014-03-15 16:59:03 +00:00
INT32 deadtimer ;
tic_t exiting ;
2018-10-30 21:03:11 +00:00
UINT8 homing ;
2016-07-06 04:09:17 +00:00
tic_t skidtime ;
2014-03-15 16:59:03 +00:00
fixed_t cmomx ;
fixed_t cmomy ;
fixed_t rmomx ;
fixed_t rmomy ;
2014-03-21 18:42:55 +00:00
2018-10-30 21:03:11 +00:00
INT32 weapondelay ;
INT32 tossdelay ;
2014-03-15 16:59:03 +00:00
INT16 starpostx ;
INT16 starposty ;
INT16 starpostz ;
INT32 starpostnum ;
tic_t starposttime ;
angle_t starpostangle ;
2014-03-21 18:42:55 +00:00
2018-10-30 21:03:11 +00:00
INT32 maxlink ;
fixed_t dashspeed ;
INT32 dashtime ;
angle_t angle_pos ;
angle_t old_angle_pos ;
tic_t bumpertime ;
INT32 flyangle ;
tic_t drilltimer ;
INT32 linkcount ;
tic_t linktimer ;
INT32 anotherflyangle ;
tic_t nightstime ;
INT32 drillmeter ;
UINT8 drilldelay ;
UINT8 bonustime ;
UINT8 mare ;
INT16 lastsidehit , lastlinehit ;
2014-03-15 16:59:03 +00:00
tic_t losstime ;
UINT8 timeshit ;
INT32 onconveyor ;
2018-10-30 05:23:21 +00:00
tic_t jointime ;
2019-02-22 23:57:44 +00:00
UINT8 splitscreenindex ;
2019-02-17 07:25:50 +00:00
2014-03-15 16:59:03 +00:00
//player->mo stuff
2016-12-31 18:26:33 +00:00
UINT8 hasmo ; // Boolean
2014-03-15 16:59:03 +00:00
angle_t angle ;
fixed_t x ;
fixed_t y ;
fixed_t z ;
fixed_t momx ;
fixed_t momy ;
fixed_t momz ;
fixed_t friction ;
fixed_t movefactor ;
2016-07-06 04:09:17 +00:00
INT32 tics ;
2014-03-15 16:59:03 +00:00
statenum_t statenum ;
UINT32 flags ;
UINT32 flags2 ;
2016-07-06 04:09:17 +00:00
UINT16 eflags ;
2014-03-15 16:59:03 +00:00
fixed_t radius ;
fixed_t height ;
fixed_t scale ;
fixed_t destscale ;
fixed_t scalespeed ;
2014-03-21 18:42:55 +00:00
} ATTRPACK resynch_pak ;
typedef struct
{
2016-12-31 18:26:33 +00:00
UINT8 version ; // Different versions don't work
UINT8 subversion ; // Contains build version
2014-03-21 18:42:55 +00:00
2016-12-31 18:26:33 +00:00
// Server launch stuffs
2014-03-21 18:42:55 +00:00
UINT8 serverplayer ;
UINT8 totalslotnum ; // "Slots": highest player number in use plus one.
tic_t gametic ;
UINT8 clientnode ;
UINT8 gamestate ;
2014-08-04 03:49:33 +00:00
// 0xFF == not in game; else player skin num
UINT8 playerskins [ MAXPLAYERS ] ;
UINT8 playercolor [ MAXPLAYERS ] ;
2014-03-21 18:42:55 +00:00
UINT8 gametype ;
UINT8 modifiedgame ;
2017-12-08 04:45:39 +00:00
SINT8 adminplayers [ MAXPLAYERS ] ; // Needs to be signed
2014-03-21 18:42:55 +00:00
2016-12-31 18:26:33 +00:00
char server_context [ 8 ] ; // Unique context id, generated at server startup.
2014-03-21 18:42:55 +00:00
2016-12-31 18:26:33 +00:00
UINT8 varlengthinputs [ 0 ] ; // Playernames and netvars
2014-03-21 18:42:55 +00:00
} ATTRPACK serverconfig_pak ;
typedef struct {
UINT8 fileid ;
UINT32 position ;
UINT16 size ;
2016-12-31 18:26:33 +00:00
UINT8 data [ 0 ] ; // Size is variable using hardware_MAXPACKETLENGTH
2014-03-21 18:42:55 +00:00
} ATTRPACK filetx_pak ;
# ifdef _MSC_VER
# pragma warning(default : 4200)
# endif
typedef struct
{
2016-12-31 18:26:33 +00:00
UINT8 version ; // Different versions don't work
UINT8 subversion ; // Contains build version
2014-03-21 18:42:55 +00:00
UINT8 localplayers ;
2019-03-09 19:30:22 +00:00
UINT8 needsdownload ;
2019-03-06 04:27:25 +00:00
UINT8 challengenum ; // Non-zero if trying to join with a password attempt
2019-03-09 22:46:55 +00:00
UINT8 challengeanswer [ MD5_LEN ] ; // Join challenge
2014-03-21 18:42:55 +00:00
} ATTRPACK clientconfig_pak ;
2019-03-06 04:27:25 +00:00
typedef struct
{
UINT8 challengenum ; // Number to send back in join attempt
2019-03-09 22:46:55 +00:00
UINT8 question [ MD5_LEN ] ; // Challenge data to be manipulated and answered with
2019-03-06 04:27:25 +00:00
} ATTRPACK joinchallenge_pak ;
2019-03-09 20:30:04 +00:00
# define SV_SPEEDMASK 0x03
# define SV_DEDICATED 0x40
# define SV_PASSWORD 0x80
2014-03-21 18:42:55 +00:00
# define MAXSERVERNAME 32
2018-08-28 20:08:47 +00:00
# define MAXFILENEEDED 915
2016-12-31 18:26:33 +00:00
// This packet is too large
2014-03-21 18:42:55 +00:00
typedef struct
{
UINT8 version ;
UINT8 subversion ;
UINT8 numberofplayer ;
UINT8 maxplayer ;
UINT8 gametype ;
UINT8 modifiedgame ;
UINT8 cheatsenabled ;
2019-03-09 20:30:04 +00:00
UINT8 kartvars ; // Previously isdedicated, now appropriated for our own nefarious purposes
2014-03-21 18:42:55 +00:00
UINT8 fileneedednum ;
2018-11-16 17:01:57 +00:00
SINT8 adminplayer ;
2014-03-21 18:42:55 +00:00
tic_t time ;
tic_t leveltime ;
char servername [ MAXSERVERNAME ] ;
char mapname [ 8 ] ;
char maptitle [ 33 ] ;
unsigned char mapmd5 [ 16 ] ;
UINT8 actnum ;
UINT8 iszone ;
2018-08-28 20:08:47 +00:00
UINT8 fileneeded [ MAXFILENEEDED ] ; // is filled with writexxx (byteptr.h)
2014-03-21 18:42:55 +00:00
} ATTRPACK serverinfo_pak ;
typedef struct
{
char reason [ 255 ] ;
} ATTRPACK serverrefuse_pak ;
typedef struct
{
UINT8 version ;
tic_t time ; // used for ping evaluation
} ATTRPACK askinfo_pak ;
typedef struct
{
char clientaddr [ 22 ] ;
tic_t time ; // used for ping evaluation
} ATTRPACK msaskinfo_pak ;
2014-03-15 16:59:03 +00:00
// Shorter player information for external use.
typedef struct
{
UINT8 node ;
char name [ MAXPLAYERNAME + 1 ] ;
UINT8 address [ 4 ] ; // sending another string would run us up against MAXPACKETLENGTH
UINT8 team ;
UINT8 skin ;
UINT8 data ; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused.
UINT32 score ;
UINT16 timeinserver ; // In seconds.
} ATTRPACK plrinfo ;
// Shortest player information for join during intermission.
typedef struct
{
char name [ MAXPLAYERNAME + 1 ] ;
UINT8 skin ;
UINT8 color ;
UINT32 pflags ;
UINT32 score ;
UINT8 ctfteam ;
} ATTRPACK plrconfig ;
//
2016-12-31 18:26:33 +00:00
// Network packet data
2014-03-15 16:59:03 +00:00
//
typedef struct
{
UINT32 checksum ;
2016-12-31 18:26:33 +00:00
UINT8 ack ; // If not zero the node asks for acknowledgement, the receiver must resend the ack
UINT8 ackreturn ; // The return of the ack number
2014-03-15 16:59:03 +00:00
UINT8 packettype ;
2016-12-31 18:26:33 +00:00
UINT8 reserved ; // Padding
2014-03-15 16:59:03 +00:00
union
{
2019-01-05 04:27:09 +00:00
clientcmd_pak clientpak ; // 145 bytes
client2cmd_pak client2pak ; // 202 bytes
client3cmd_pak client3pak ; // 258 bytes(?)
client4cmd_pak client4pak ; // 316 bytes(?)
2016-12-31 18:26:33 +00:00
servertics_pak serverpak ; // 132495 bytes (more around 360, no?)
serverconfig_pak servercfg ; // 773 bytes
resynchend_pak resynchend ; //
resynch_pak resynchpak ; //
UINT8 resynchgot ; //
UINT8 textcmd [ MAXTEXTCMD + 1 ] ; // 66049 bytes (wut??? 64k??? More like 257 bytes...)
filetx_pak filetxpak ; // 139 bytes
2019-03-06 04:27:25 +00:00
clientconfig_pak clientcfg ; // 153 bytes
joinchallenge_pak joinchallenge ; // 17 bytes
2016-12-31 18:26:33 +00:00
serverinfo_pak serverinfo ; // 1024 bytes
serverrefuse_pak serverrefuse ; // 65025 bytes (somehow I feel like those values are garbage...)
askinfo_pak askinfo ; // 61 bytes
msaskinfo_pak msaskinfo ; // 22 bytes
2019-02-26 22:44:35 +00:00
plrinfo playerinfo [ MAXPLAYERS ] ; // 576 bytes(?)
plrconfig playerconfig [ MAXPLAYERS ] ; // (up to) 528 bytes(?)
2014-03-15 16:59:03 +00:00
# ifdef NEWPING
2019-02-26 22:44:35 +00:00
UINT32 pingtable [ MAXPLAYERS + 1 ] ; // 68 bytes
2014-03-15 16:59:03 +00:00
# endif
2016-12-31 18:26:33 +00:00
} u ; // This is needed to pack diff packet types data together
2014-03-15 16:59:03 +00:00
} ATTRPACK doomdata_t ;
# if defined(_MSC_VER)
# pragma pack()
# endif
2016-12-31 18:26:33 +00:00
# define MAXSERVERLIST 64 // Depends only on the display
2014-03-15 16:59:03 +00:00
typedef struct
{
SINT8 node ;
serverinfo_pak info ;
} serverelem_t ;
extern serverelem_t serverlist [ MAXSERVERLIST ] ;
extern UINT32 serverlistcount ;
extern INT32 mapchangepending ;
2016-12-31 18:26:33 +00:00
// Points inside doomcom
2014-03-15 16:59:03 +00:00
extern doomdata_t * netbuffer ;
2018-11-27 17:10:46 +00:00
extern consvar_t cv_showjoinaddress ;
2014-03-15 16:59:03 +00:00
extern consvar_t cv_playbackspeed ;
2018-12-14 23:56:11 +00:00
# define BASEPACKETSIZE offsetof(doomdata_t, u)
# define FILETXHEADER offsetof(filetx_pak, data)
# define BASESERVERTICSSIZE offsetof(doomdata_t, u.serverpak.cmds[0])
2014-03-15 16:59:03 +00:00
# define KICK_MSG_GO_AWAY 1
# define KICK_MSG_CON_FAIL 2
# define KICK_MSG_PLAYER_QUIT 3
# define KICK_MSG_TIMEOUT 4
# define KICK_MSG_BANNED 5
# ifdef NEWPING
# define KICK_MSG_PING_HIGH 6
# endif
# define KICK_MSG_CUSTOM_KICK 7
# define KICK_MSG_CUSTOM_BAN 8
2016-10-21 20:25:07 +00:00
typedef enum
{
KR_KICK = 1 , //Kicked by server
KR_PINGLIMIT = 2 , //Broke Ping Limit
KR_SYNCH = 3 , //Synch Failure
2018-11-18 12:32:59 +00:00
KR_TIMEOUT = 4 , //Connection Timeout
2016-10-21 20:25:07 +00:00
KR_BAN = 5 , //Banned by server
KR_LEAVE = 6 , //Quit the game
2018-11-18 12:32:59 +00:00
2016-10-21 20:25:07 +00:00
} kickreason_t ;
2014-03-15 16:59:03 +00:00
extern boolean server ;
2017-01-13 19:53:52 +00:00
# define client (!server)
2016-12-31 18:26:33 +00:00
extern boolean dedicated ; // For dedicated server
2014-03-15 16:59:03 +00:00
extern UINT16 software_MAXPACKETLENGTH ;
extern boolean acceptnewnode ;
extern SINT8 servernode ;
void Command_Ping_f ( void ) ;
extern tic_t connectiontimeout ;
2017-01-13 19:53:52 +00:00
extern tic_t jointimeout ;
2014-03-15 16:59:03 +00:00
# ifdef NEWPING
extern UINT16 pingmeasurecount ;
extern UINT32 realpingtable [ MAXPLAYERS ] ;
extern UINT32 playerpingtable [ MAXPLAYERS ] ;
2019-02-16 02:51:44 +00:00
extern tic_t servermaxping ;
2014-03-15 16:59:03 +00:00
# endif
2018-09-27 20:38:19 +00:00
extern consvar_t
# ifdef VANILLAJOINNEXTROUND
cv_joinnextround ,
# endif
2019-01-18 09:30:38 +00:00
cv_netticbuffer , cv_allownewplayer , cv_maxplayers , cv_resynchattempts , cv_blamecfail , cv_maxsend , cv_noticedownload , cv_downloadspeed ;
2014-03-15 16:59:03 +00:00
2016-12-31 18:26:33 +00:00
// Used in d_net, the only dependence
2014-03-15 16:59:03 +00:00
tic_t ExpandTics ( INT32 low ) ;
void D_ClientServerInit ( void ) ;
2016-12-31 18:26:33 +00:00
// Initialise the other field
2014-03-15 16:59:03 +00:00
void RegisterNetXCmd ( netxcmd_t id , void ( * cmd_f ) ( UINT8 * * p , INT32 playernum ) ) ;
void SendNetXCmd ( netxcmd_t id , const void * param , size_t nparam ) ;
void SendNetXCmd2 ( netxcmd_t id , const void * param , size_t nparam ) ; // splitsreen player
2017-12-17 19:17:07 +00:00
void SendNetXCmd3 ( netxcmd_t id , const void * param , size_t nparam ) ; // splitsreen3 player
void SendNetXCmd4 ( netxcmd_t id , const void * param , size_t nparam ) ; // splitsreen4 player
2014-03-15 16:59:03 +00:00
// Create any new ticcmds and broadcast to other players.
2019-01-30 19:18:51 +00:00
void NetKeepAlive ( void ) ;
2014-03-15 16:59:03 +00:00
void NetUpdate ( void ) ;
void SV_StartSinglePlayerServer ( void ) ;
boolean SV_SpawnServer ( void ) ;
void SV_SpawnPlayer ( INT32 playernum , INT32 x , INT32 y , angle_t angle ) ;
void SV_StopServer ( void ) ;
void SV_ResetServer ( void ) ;
void CL_AddSplitscreenPlayer ( void ) ;
2017-12-17 03:32:43 +00:00
void CL_RemoveSplitscreenPlayer ( UINT8 p ) ;
2014-03-15 16:59:03 +00:00
void CL_Reset ( void ) ;
void CL_ClearPlayer ( INT32 playernum ) ;
void CL_UpdateServerList ( boolean internetsearch , INT32 room ) ;
2019-03-07 04:07:28 +00:00
boolean CL_Responder ( event_t * ev ) ;
2016-12-31 18:26:33 +00:00
// Is there a game running
2014-03-15 16:59:03 +00:00
boolean Playing ( void ) ;
// Broadcasts special packets to other players
// to notify of game exit
void D_QuitNetGame ( void ) ;
2016-12-31 18:26:33 +00:00
//? How many ticks to run?
2014-03-15 16:59:03 +00:00
void TryRunTics ( tic_t realtic ) ;
// extra data for lmps
// these functions scare me. they contain magic.
/*boolean AddLmpExtradata(UINT8 **demo_p, INT32 playernum);
void ReadLmpExtraData ( UINT8 * * demo_pointer , INT32 playernum ) ; */
# ifndef NONET
// translate a playername in a player number return -1 if not found and
// print a error message in the console
SINT8 nametonum ( const char * name ) ;
# endif
extern char motd [ 254 ] , server_context [ 8 ] ;
extern UINT8 playernode [ MAXPLAYERS ] ;
INT32 D_NumPlayers ( void ) ;
void D_ResetTiccmds ( void ) ;
tic_t GetLag ( INT32 node ) ;
UINT8 GetFreeXCmdSize ( void ) ;
2014-03-21 18:42:55 +00:00
extern UINT8 hu_resynching ;
2018-01-19 02:47:10 +00:00
extern UINT8 hu_stopped ; // kart, true when the game is stopped for players due to a disconnecting or connecting player
2014-03-15 16:59:03 +00:00
# endif