

The QuakeWorld connection process:

---------------------------------



servercount

Each time a server changes maps, it will bump the servercount variable.  The signon

messages sent from the client to the server will include a servercount, and if the

server detects that it has changed levels while the client is in the process of

connecting, the client connection process will be restarted.



svc_skinlist



MAX_SIGNON_BUFFERS...



+attack;wait  : this both does the attack and prints a chat?



put frag counts in userinfo as *frags?



no forward to server commands unless active?



changelevel / reconnect confusion



syncing the fixangle over the reliable channel with the first update

	option to put the update in the reliable message?





--------------

A "connect <server>" command is executed on the client.



CL_Connect_f() disconnects from the current server if connected, 

sets the current server to the new value, and sends the first connection packet.



The connection packet will be resent by CL_CheckForResend() every two seconds until the server connects.



A connection packet is an out of band packet containing "connect <userinfo>" with userinfo quoted.



--------------



The server receives the OOB message in SVC_DirectConnect()



It can respond with an OOB client print of "banned" or "server is full" if the client

cannot enter the game.



If the client can get in, the server will initialize a new client_t structure with a

netchan_t, and respond with an OOB message containing S2C_CONNECTION.  Further

communication will be through sequenced netchan_t messages instead of OOB messages.



The client_t->state is set to cs_connected



--------------



if S2C_CONNECTION packet is dropped, the connect message will be resent after two

seconds and the server will recognize the address and reuse the allocated client_t FIXME:bug?)			



When the client receives the S2C_CONNECTION, it initializes cls.netchan and sends

a "new" string command over the netchan to the server.



cls.state is set to ca_connected	FIXME: change to cs_connected?



--------------



The "new" usercommand on the server is issued by the client every time they enter a level,

which is why none of the information is sent in the initial S2C_CONNECTION message. 



"new" sends over 



Before the client can begin playing in the server, the following information must be sent:



gamedir

svc_serverinfo

	PROTOCOL_VERSION

	servercount		// for detecting when the server

	gamedir			// for deciding the add-on directory (qw, ctf, etc)

	playernumber	// the client will allways be in this slot

	the qc string of world.message	// usually the level's full verbose name

cdtrack

fullserverinfo



when received, the client changes state to ca_onserver.  When the client receives

all the information needed to render a frame, the state will be changed to ca_active



.....



svc_soundlist



.....



svc_modellist



.....



prespawn passes the contents of the sv.signon_buffers, which hold

static entity spawning, static sound spawning, and all the entity baselines

FIXME: don't need to pass all baselines, uninitialized probs?



.....



"spawn" sends all dynamically changing state (fullclient updates, lightmaps, frags)

and ma



FIXME: 32 clients could be up to 16k in updates, which overflows the 8k packet size



FIXME: there is an updating hole between the sending of spawn data and the client

being notified 





"begin"



Actually spawns the client into the world as a visible entity.



The client_t->state is set to cs_spawned, so normal datagram updates begin



-----------------------



When the first valid packetentities_t arrives at the client, cls.state is set

to ca_active, and rendering can begin.



FIXME: make sure player and packets are both valid

