]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - netconn.h
new tokenizer tokenize_console that matches the console tokenizing
[xonotic/darkplaces.git] / netconn.h
index cd44ab16403eaa870a784f54b012f5f49098d2a0..5e6f4ad7906762ed351b94070fbcb1f428d47754 100755 (executable)
--- a/netconn.h
+++ b/netconn.h
@@ -37,6 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 
 #define NET_PROTOCOL_VERSION   3
+#define NET_EXTRESPONSE_MAX 16
 
 // This is the network info/connection protocol.  It is used to find Quake
 // servers, get info about them, and connect to them.  Once connected, the
@@ -125,8 +126,6 @@ typedef struct netconn_s
        double lastMessageTime;
        double lastSendTime;
 
-       qboolean canSend;
-
        // writing buffer to send to peer as the next reliable message
        // can be added to at any time, copied into sendMessage buffer when it is
        // possible to send a reliable message and then cleared
@@ -135,19 +134,73 @@ typedef struct netconn_s
 
        // reliable message that is currently sending
        // (for building fragments)
-       unsigned int ackSequence;
-       unsigned int sendSequence;
-       unsigned int unreliableSendSequence;
        int sendMessageLength;
        unsigned char sendMessage[NET_MAXMESSAGE];
 
        // reliable message that is currently being received
        // (for putting together fragments)
-       unsigned int receiveSequence;
-       unsigned int unreliableReceiveSequence;
        int receiveMessageLength;
        unsigned char receiveMessage[NET_MAXMESSAGE];
 
+       // used by both NQ and QW protocols
+       unsigned int outgoing_unreliable_sequence;
+
+       struct netconn_nq_s
+       {
+               unsigned int ackSequence;
+               unsigned int sendSequence;
+
+               unsigned int receiveSequence;
+               unsigned int unreliableReceiveSequence;
+       }
+       nq;
+       struct netconn_qw_s
+       {
+               // QW protocol
+               qboolean        fatal_error;
+
+               float           last_received;          // for timeouts
+
+       // the statistics are cleared at each client begin, because
+       // the server connecting process gives a bogus picture of the data
+               float           frame_latency;          // rolling average
+               float           frame_rate;
+
+               int                     drop_count;                     // dropped packets, cleared each level
+               int                     good_count;                     // cleared each level
+
+               int                     qport;
+
+       // sequencing variables
+               int                     incoming_sequence;
+               int                     incoming_acknowledged;
+               int                     incoming_reliable_acknowledged; // single bit
+
+               int                     incoming_reliable_sequence;             // single bit, maintained local
+
+               int                     reliable_sequence;                      // single bit
+               int                     last_reliable_sequence;         // sequence number of last send
+       }
+       qw;
+
+       // bandwidth estimator
+       double          cleartime;                      // if realtime > nc->cleartime, free to go
+
+       // this tracks packet loss and packet sizes on the most recent packets
+       // used by shownetgraph feature
+#define NETGRAPH_PACKETS 100
+#define NETGRAPH_NOPACKET 0
+#define NETGRAPH_LOSTPACKET -1
+#define NETGRAPH_CHOKEDPACKET -2
+       int incoming_packetcounter;
+       int incoming_reliablesize[NETGRAPH_PACKETS];
+       int incoming_unreliablesize[NETGRAPH_PACKETS];
+       int incoming_acksize[NETGRAPH_PACKETS];
+       int outgoing_packetcounter;
+       int outgoing_reliablesize[NETGRAPH_PACKETS];
+       int outgoing_unreliablesize[NETGRAPH_PACKETS];
+       int outgoing_acksize[NETGRAPH_PACKETS];
+
        char address[128];
 } netconn_t;
 
@@ -156,8 +209,6 @@ extern mempool_t *netconn_mempool;
 
 extern cvar_t hostname;
 extern cvar_t developer_networking;
-extern char playername[];
-extern int playercolor;
 
 #define SERVERLIST_TOTALSIZE           2048
 #define SERVERLIST_VIEWLISTSIZE                SERVERLIST_TOTALSIZE
@@ -176,7 +227,9 @@ typedef enum serverlist_maskop_e
        SLMO_EQUAL,
        SLMO_GREATER,
        SLMO_GREATEREQUAL,
-       SLMO_NOTEQUAL
+       SLMO_NOTEQUAL,
+       SLMO_STARTSWITH,
+       SLMO_NOTSTARTSWITH
 } serverlist_maskop_t;
 
 // struct with all fields that you can search for or sort by
@@ -194,12 +247,28 @@ typedef struct serverlist_info_s
        char map[32];
        // name of the session
        char name[128];
+       // qc-defined short status string
+       char qcstatus[128];
+       // frags/ping/name list (if they fit in the packet)
+       char players[1400];
        // max client number
        int maxplayers;
-       // number of currently connected players
+       // number of currently connected players (including bots)
        int numplayers;
+       // number of currently connected players that are bots
+       int numbots;
+       // number of currently connected players that are not bots
+       int numhumans;
+       // number of free slots
+       int freeslots;
        // protocol version
        int protocol;
+       // game data version
+       // (an integer that is used for filtering incompatible servers,
+       //  not filterable by QC)
+       int gameversion;
+       // favorite server flag
+       qboolean isfavorite;
 } serverlist_info_t;
 
 typedef enum
@@ -213,15 +282,28 @@ typedef enum
        SLIF_MAXPLAYERS,
        SLIF_NUMPLAYERS,
        SLIF_PROTOCOL,
+       SLIF_NUMBOTS,
+       SLIF_NUMHUMANS,
+       SLIF_FREESLOTS,
+       SLIF_QCSTATUS,
+       SLIF_PLAYERS,
+       SLIF_ISFAVORITE,
        SLIF_COUNT
 } serverlist_infofield_t;
 
+typedef enum
+{
+       SLSF_DESCENDING = 1,
+       SLSF_FAVORITESFIRST = 2
+} serverlist_sortflags_t;
+
 typedef enum
 {
        SQS_NONE = 0,
        SQS_QUERYING,
        SQS_QUERIED,
-       SQS_TIMEDOUT
+       SQS_TIMEDOUT,
+       SQS_REFRESHING
 } serverlist_query_state;
 
 typedef struct serverlist_entry_s
@@ -232,6 +314,8 @@ typedef struct serverlist_entry_s
        unsigned querycounter;
        // used to calculate ping when update comes in
        double querytime;
+   // query protocol to use on this server
+       int protocol; // may be PROTOCOL_QUAKEWORLD or PROTOCOL_DARKPLACES7
 
        serverlist_info_t info;
 
@@ -251,7 +335,7 @@ extern serverlist_mask_t serverlist_andmasks[SERVERLIST_ANDMASKCOUNT];
 extern serverlist_mask_t serverlist_ormasks[SERVERLIST_ORMASKCOUNT];
 
 extern serverlist_infofield_t serverlist_sortbyfield;
-extern qboolean serverlist_sortdescending;
+extern int serverlist_sortflags; // not using the enum, as it is a bitmask
 
 extern int serverlist_viewcount;
 extern serverlist_entry_t *serverlist_viewlist[SERVERLIST_VIEWLISTSIZE];
@@ -260,20 +344,7 @@ extern int serverlist_cachecount;
 
 extern qboolean serverlist_consoleoutput;
 
-#if !defined(_WIN32) && !defined(__linux__) && !defined(SUNOS)
-#ifndef htonl
-extern unsigned long htonl (unsigned long hostlong);
-#endif
-#ifndef htons
-extern unsigned short htons (unsigned short hostshort);
-#endif
-#ifndef ntohl
-extern unsigned long ntohl (unsigned long netlong);
-#endif
-#ifndef ntohs
-extern unsigned short ntohs (unsigned short netshort);
-#endif
-#endif
+void ServerList_GetPlayerStatistics(int *numplayerspointer, int *maxplayerspointer);
 
 //============================================================================
 //
@@ -281,6 +352,10 @@ extern unsigned short ntohs (unsigned short netshort);
 //
 //============================================================================
 
+extern char net_extresponse[NET_EXTRESPONSE_MAX][1400];
+extern int net_extresponse_count;
+extern int net_extresponse_last;
+
 extern double masterquerytime;
 extern int masterquerycount;
 extern int masterreplycount;
@@ -289,6 +364,8 @@ extern int serverreplycount;
 
 extern sizebuf_t net_message;
 
+extern cvar_t sv_public;
+
 extern cvar_t cl_netlocalping;
 
 extern cvar_t cl_netport;
@@ -296,7 +373,10 @@ extern cvar_t sv_netport;
 extern cvar_t net_address;
 //extern cvar_t net_netaddress_ipv6;
 
-int NetConn_SendUnreliableMessage(netconn_t *conn, sizebuf_t *data);
+qboolean NetConn_CanSend(netconn_t *conn);
+int NetConn_SendUnreliableMessage(netconn_t *conn, sizebuf_t *data, protocolversion_t protocol, int rate, qboolean quakesignon_suppressreliables);
+qboolean NetConn_HaveClientPorts(void);
+qboolean NetConn_HaveServerPorts(void);
 void NetConn_CloseClientPorts(void);
 void NetConn_OpenClientPorts(void);
 void NetConn_CloseServerPorts(void);
@@ -315,17 +395,20 @@ int NetConn_WriteString(lhnetsocket_t *mysocket, const char *string, const lhnet
 int NetConn_IsLocalGame(void);
 void NetConn_ClientFrame(void);
 void NetConn_ServerFrame(void);
-void NetConn_QueryMasters(void);
+void NetConn_SleepMicroseconds(int microseconds);
+void NetConn_QueryMasters(qboolean querydp, qboolean queryqw);
 void NetConn_Heartbeat(int priority);
 void NetConn_QueryQueueFrame(void);
 void Net_Stats_f(void);
 void Net_Slist_f(void);
+void Net_SlistQW_f(void);
+void Net_Refresh_f(void);
 
 // ServerList interface (public)
 // manually refresh the view set, do this after having changed the mask or any other flag
 void ServerList_RebuildViewList(void);
 void ServerList_ResetMasks(void);
-void ServerList_QueryList(void);
+void ServerList_QueryList(qboolean resetcache, qboolean querydp, qboolean queryqw, qboolean consoleoutput);
 
 #endif