1 /* 2 Copyright (C) 1996-1997 Id Software, Inc. 3 4 This program is free software; you can redistribute it and/or 5 modify it under the terms of the GNU General Public License 6 as published by the Free Software Foundation; either version 2 7 of the License, or (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13 See the GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 */ 20 // sv_main.c -- server main program 21 22 #include "quakedef.h" 23 24 server_t sv; 25 server_static_t svs; 26 27 char localmodels[MAX_MODELS][5]; // inline model names for precache 28 29 //============================================================================ 30 31 /* 32 =============== 33 SV_Init 34 =============== 35 */ 36 void SV_Init (void) 37 { 38 int i; 39 extern cvar_t sv_maxvelocity; 40 extern cvar_t sv_gravity; 41 extern cvar_t sv_nostep; 42 extern cvar_t sv_friction; 43 extern cvar_t sv_edgefriction; 44 extern cvar_t sv_stopspeed; 45 extern cvar_t sv_maxspeed; 46 extern cvar_t sv_accelerate; 47 extern cvar_t sv_idealpitchscale; 48 extern cvar_t sv_aim; 49 50 Cvar_RegisterVariable (&sv_maxvelocity); 51 Cvar_RegisterVariable (&sv_gravity); 52 Cvar_RegisterVariable (&sv_friction); 53 Cvar_RegisterVariable (&sv_edgefriction); 54 Cvar_RegisterVariable (&sv_stopspeed); 55 Cvar_RegisterVariable (&sv_maxspeed); 56 Cvar_RegisterVariable (&sv_accelerate); 57 Cvar_RegisterVariable (&sv_idealpitchscale); 58 Cvar_RegisterVariable (&sv_aim); 59 Cvar_RegisterVariable (&sv_nostep); 60 61 for (i=0 ; i<MAX_MODELS ; i++) 62 sprintf (localmodels[i], "*%i", i); 63 } 64 65 /* 66 ============================================================================= 67 68 EVENT MESSAGES 69 70 ============================================================================= 71 */ 72 73 /* 74 ================== 75 SV_StartParticle 76 77 Make sure the event gets sent to all clients 78 ================== 79 */ 80 void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count) 81 { 82 int i, v; 83 84 if (sv.datagram.cursize > MAX_DATAGRAM-16) 85 return; 86 MSG_WriteByte (&sv.datagram, svc_particle); 87 MSG_WriteCoord (&sv.datagram, org[0]); 88 MSG_WriteCoord (&sv.datagram, org[1]); 89 MSG_WriteCoord (&sv.datagram, org[2]); 90 for (i=0 ; i<3 ; i++) 91 { 92 v = (int)(dir[i]*16); 93 if (v > 127) 94 v = 127; 95 else if (v < -128) 96 v = -128; 97 MSG_WriteChar (&sv.datagram, v); 98 } 99 MSG_WriteByte (&sv.datagram, count); 100 MSG_WriteByte (&sv.datagram, color); 101 } 102 103 /* 104 ================== 105 SV_StartSound 106 107 Each entity can have eight independant sound sources, like voice, 108 weapon, feet, etc. 109 110 Channel 0 is an auto-allocate channel, the others override anything 111 allready running on that entity/channel pair. 112 113 An attenuation of 0 will play full volume everywhere in the level. 114 Larger attenuations will drop off. (max 4 attenuation) 115 116 ================== 117 */ 118 void SV_StartSound (edict_t *entity, int channel, const char *sample, int volume, 119 float attenuation) 120 { 121 int sound_num; 122 int field_mask; 123 int i; 124 int ent; 125 126 if (volume < 0 || volume > 255) 127 Sys_Error ("SV_StartSound: volume = %i", volume); 128 129 if (attenuation < 0 || attenuation > 4) 130 Sys_Error ("SV_StartSound: attenuation = %f", attenuation); 131 132 if (channel < 0 || channel > 7) 133 Sys_Error ("SV_StartSound: channel = %i", channel); 134 135 if (sv.datagram.cursize > MAX_DATAGRAM-16) 136 return; 137 138 // find precache number for sound 139 for (sound_num=1 ; sound_num<MAX_SOUNDS 140 && sv.sound_precache[sound_num] ; sound_num++) 141 if (!strcmp(sample, sv.sound_precache[sound_num])) 142 break; 143 144 if ( sound_num == MAX_SOUNDS || !sv.sound_precache[sound_num] ) 145 { 146 Con_Printf ("SV_StartSound: %s not precacheed\n", sample); 147 return; 148 } 149 150 ent = NUM_FOR_EDICT(entity); 151 152 channel = (ent<<3) | channel; 153 154 field_mask = 0; 155 if (volume != DEFAULT_SOUND_PACKET_VOLUME) 156 field_mask |= SND_VOLUME; 157 if (attenuation != DEFAULT_SOUND_PACKET_ATTENUATION) 158 field_mask |= SND_ATTENUATION; 159 160 // directed messages go only to the entity the are targeted on 161 MSG_WriteByte (&sv.datagram, svc_sound); 162 MSG_WriteByte (&sv.datagram, field_mask); 163 if (field_mask & SND_VOLUME) 164 MSG_WriteByte (&sv.datagram, volume); 165 if (field_mask & SND_ATTENUATION) 166 MSG_WriteByte (&sv.datagram, (int) (attenuation*64)); 167 MSG_WriteShort (&sv.datagram, channel); 168 MSG_WriteByte (&sv.datagram, sound_num); 169 for (i=0 ; i<3 ; i++) 170 MSG_WriteCoord (&sv.datagram, entity->u.v.origin[i]+0.5*(entity->u.v.mins[i]+entity->u.v.maxs[i])); 171 } 172 173 /* 174 ============================================================================== 175 176 CLIENT SPAWNING 177 178 ============================================================================== 179 */ 180 181 /* 182 ================ 183 SV_SendServerinfo 184 185 Sends the first message from the server to a connected client. 186 This will be sent on the initial connection and upon each server load. 187 ================ 188 */ 189 void SV_SendServerinfo (client_t *client) 190 { 191 char **s; 192 char message[2048]; 193 194 MSG_WriteByte (&client->message, svc_print); 195 sprintf (message, "%c\nVERSION %4.2f SERVER (%i CRC)", 2, VERSION, pr_crc); 196 MSG_WriteString (&client->message,message); 197 198 MSG_WriteByte (&client->message, svc_serverinfo); 199 MSG_WriteLong (&client->message, PROTOCOL_VERSION); 200 MSG_WriteByte (&client->message, svs.maxclients); 201 202 if (!coop.value && deathmatch.value) 203 MSG_WriteByte (&client->message, GAME_DEATHMATCH); 204 else 205 MSG_WriteByte (&client->message, GAME_COOP); 206 207 sprintf (message, pr_strings+sv.edicts->u.v.message); 208 209 MSG_WriteString (&client->message,message); 210 211 for (s = sv.model_precache+1 ; *s ; s++) 212 MSG_WriteString (&client->message, *s); 213 MSG_WriteByte (&client->message, 0); 214 215 for (s = sv.sound_precache+1 ; *s ; s++) 216 MSG_WriteString (&client->message, *s); 217 MSG_WriteByte (&client->message, 0); 218 219 // send music 220 MSG_WriteByte (&client->message, svc_cdtrack); 221 MSG_WriteByte (&client->message, (int) sv.edicts->u.v.sounds); 222 MSG_WriteByte (&client->message, (int) sv.edicts->u.v.sounds); 223 224 // set view 225 MSG_WriteByte (&client->message, svc_setview); 226 MSG_WriteShort (&client->message, NUM_FOR_EDICT(client->edict)); 227 228 MSG_WriteByte (&client->message, svc_signonnum); 229 MSG_WriteByte (&client->message, 1); 230 231 client->sendsignon = true; 232 client->spawned = false; // need prespawn, spawn, etc 233 } 234 235 /* 236 ================ 237 SV_ConnectClient 238 239 Initializes a client_t for a new net connection. This will only be called 240 once for a player each game, not once for each level change. 241 ================ 242 */ 243 void SV_ConnectClient (int clientnum) 244 { 245 edict_t *ent; 246 client_t *client; 247 int edictnum; 248 struct qsocket_s *netconnection; 249 int i; 250 float spawn_parms[NUM_SPAWN_PARMS]; 251 252 client = svs.clients + clientnum; 253 254 Con_DPrintf ("Client %s connected\n", client->netconnection->address); 255 256 edictnum = clientnum+1; 257 258 ent = EDICT_NUM(edictnum); 259 260 // set up the client_t 261 netconnection = client->netconnection; 262 263 if (sv.loadgame) 264 memcpy (spawn_parms, client->spawn_parms, sizeof(spawn_parms)); 265 memset (client, 0, sizeof(*client)); 266 client->netconnection = netconnection; 267 268 strcpy (client->name, "unconnected"); 269 client->active = true; 270 client->spawned = false; 271 client->edict = ent; 272 client->message.data = client->msgbuf; 273 client->message.maxsize = sizeof(client->msgbuf); 274 client->message.allowoverflow = true; // we can catch it 275 276 #ifdef IDGODS 277 client->privileged = IsID(&client->netconnection->addr); 278 #else 279 client->privileged = false; 280 #endif 281 282 if (sv.loadgame) 283 memcpy (client->spawn_parms, spawn_parms, sizeof(spawn_parms)); 284 else 285 { 286 // call the progs to get default spawn parms for the new client 287 PR_ExecuteProgram (pr_global_struct->SetNewParms); 288 for (i=0 ; i<NUM_SPAWN_PARMS ; i++) 289 client->spawn_parms[i] = (&pr_global_struct->parm1)[i]; 290 } 291 292 SV_SendServerinfo (client); 293 } 294 295 296 /* 297 =================== 298 SV_CheckForNewClients 299 300 =================== 301 */ 302 void SV_CheckForNewClients (void) 303 { 304 struct qsocket_s *ret; 305 int i; 306 307 // 308 // check for new connections 309 // 310 while (1) 311 { 312 ret = NET_CheckNewConnections (); 313 if (!ret) 314 break; 315 316 // 317 // init a new client structure 318 // 319 for (i=0 ; i<svs.maxclients ; i++) 320 if (!svs.clients[i].active) 321 break; 322 if (i == svs.maxclients) 323 Sys_Error ("Host_CheckForNewClients: no free clients"); 324 325 svs.clients[i].netconnection = ret; 326 SV_ConnectClient (i); 327 328 net_activeconnections++; 329 } 330 } 331 332 333 334 /* 335 =============================================================================== 336 337 FRAME UPDATES 338 339 =============================================================================== 340 */ 341 342 /* 343 ================== 344 SV_ClearDatagram 345 346 ================== 347 */ 348 void SV_ClearDatagram (void) 349 { 350 SZ_Clear (&sv.datagram); 351 } 352 353 /* 354 ============================================================================= 355 356 The PVS must include a small area around the client to allow head bobbing 357 or other small motion on the client side. Otherwise, a bob might cause an 358 entity that should be visible to not show up, especially when the bob 359 crosses a waterline. 360 361 ============================================================================= 362 */ 363 364 int fatbytes; 365 byte fatpvs[MAX_MAP_LEAFS/8]; 366 367 void SV_AddToFatPVS (vec3_t org, mnode_t *node) 368 { 369 int i; 370 byte *pvs; 371 mplane_t *plane; 372 float d; 373 374 while (1) 375 { 376 // if this is a leaf, accumulate the pvs bits 377 if (node->contents < 0) 378 { 379 if (node->contents != CONTENTS_SOLID) 380 { 381 pvs = Mod_LeafPVS ( (mleaf_t *)node, sv.worldmodel); 382 for (i=0 ; i<fatbytes ; i++) 383 fatpvs[i] |= pvs[i]; 384 } 385 return; 386 } 387 388 plane = node->plane; 389 d = DotProduct (org, plane->normal) - plane->dist; 390 if (d > 8) 391 node = node->children[0]; 392 else if (d < -8) 393 node = node->children[1]; 394 else 395 { // go down both 396 SV_AddToFatPVS (org, node->children[0]); 397 node = node->children[1]; 398 } 399 } 400 } 401 402 /* 403 ============= 404 SV_FatPVS 405 406 Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the 407 given point. 408 ============= 409 */ 410 byte *SV_FatPVS (vec3_t org) 411 { 412 fatbytes = (sv.worldmodel->numleafs+31)>>3; 413 Q_memset (fatpvs, 0, fatbytes); 414 SV_AddToFatPVS (org, sv.worldmodel->nodes); 415 return fatpvs; 416 } 417 418 //============================================================================= 419 420 421 /* 422 ============= 423 SV_WriteEntitiesToClient 424 425 ============= 426 */ 427 void SV_WriteEntitiesToClient (edict_t *clent, sizebuf_t *msg) 428 { 429 int e, i; 430 int bits; 431 byte *pvs; 432 vec3_t org; 433 float miss; 434 edict_t *ent; 435 436 // find the client's PVS 437 VectorAdd (clent->u.v.origin, clent->u.v.view_ofs, org); 438 pvs = SV_FatPVS (org); 439 440 // send over all entities (excpet the client) that touch the pvs 441 ent = NEXT_EDICT(sv.edicts); 442 for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent)) 443 { 444 #ifdef QUAKE2 445 // don't send if flagged for NODRAW and there are no lighting effects 446 if (ent->u.v.effects == EF_NODRAW) 447 continue; 448 #endif 449 450 // ignore if not touching a PV leaf 451 if (ent != clent) // clent is ALLWAYS sent 452 { 453 // ignore ents without visible models 454 if (!ent->u.v.modelindex || !pr_strings[ent->u.v.model]) 455 continue; 456 457 for (i=0 ; i < ent->num_leafs ; i++) 458 if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) )) 459 break; 460 461 if (i == ent->num_leafs) 462 continue; // not visible 463 } 464 465 if (msg->maxsize - msg->cursize < 16) 466 { 467 Con_Printf ("packet overflow\n"); 468 return; 469 } 470 471 // send an update 472 bits = 0; 473 474 for (i=0 ; i<3 ; i++) 475 { 476 miss = ent->u.v.origin[i] - ent->baseline.origin[i]; 477 if ( miss < -0.1 || miss > 0.1 ) 478 bits |= U_ORIGIN1<<i; 479 } 480 481 if ( ent->u.v.angles[0] != ent->baseline.angles[0] ) 482 bits |= U_ANGLE1; 483 484 if ( ent->u.v.angles[1] != ent->baseline.angles[1] ) 485 bits |= U_ANGLE2; 486 487 if ( ent->u.v.angles[2] != ent->baseline.angles[2] ) 488 bits |= U_ANGLE3; 489 490 if (ent->u.v.movetype == MOVETYPE_STEP) 491 bits |= U_NOLERP; // don't mess up the step animation 492 493 if (ent->baseline.colormap != ent->u.v.colormap) 494 bits |= U_COLORMAP; 495 496 if (ent->baseline.skin != ent->u.v.skin) 497 bits |= U_SKIN; 498 499 if (ent->baseline.frame != ent->u.v.frame) 500 bits |= U_FRAME; 501 502 if (ent->baseline.effects != ent->u.v.effects) 503 bits |= U_EFFECTS; 504 505 if (ent->baseline.modelindex != ent->u.v.modelindex) 506 bits |= U_MODEL; 507 508 if (e >= 256) 509 bits |= U_LONGENTITY; 510 511 if (bits >= 256) 512 bits |= U_MOREBITS; 513 514 // 515 // write the message 516 // 517 MSG_WriteByte (msg,bits | U_SIGNAL); 518 519 if (bits & U_MOREBITS) 520 MSG_WriteByte (msg, bits>>8); 521 if (bits & U_LONGENTITY) 522 MSG_WriteShort (msg,e); 523 else 524 MSG_WriteByte (msg,e); 525 526 if (bits & U_MODEL) 527 MSG_WriteByte (msg, (int) ent->u.v.modelindex); 528 if (bits & U_FRAME) 529 MSG_WriteByte (msg, (int) ent->u.v.frame); 530 if (bits & U_COLORMAP) 531 MSG_WriteByte (msg, (int) ent->u.v.colormap); 532 if (bits & U_SKIN) 533 MSG_WriteByte (msg, (int) ent->u.v.skin); 534 if (bits & U_EFFECTS) 535 MSG_WriteByte (msg, (int) ent->u.v.effects); 536 if (bits & U_ORIGIN1) 537 MSG_WriteCoord (msg, ent->u.v.origin[0]); 538 if (bits & U_ANGLE1) 539 MSG_WriteAngle(msg, ent->u.v.angles[0]); 540 if (bits & U_ORIGIN2) 541 MSG_WriteCoord (msg, ent->u.v.origin[1]); 542 if (bits & U_ANGLE2) 543 MSG_WriteAngle(msg, ent->u.v.angles[1]); 544 if (bits & U_ORIGIN3) 545 MSG_WriteCoord (msg, ent->u.v.origin[2]); 546 if (bits & U_ANGLE3) 547 MSG_WriteAngle(msg, ent->u.v.angles[2]); 548 } 549 } 550 551 /* 552 ============= 553 SV_CleanupEnts 554 555 ============= 556 */ 557 void SV_CleanupEnts (void) 558 { 559 int e; 560 edict_t *ent; 561 562 ent = NEXT_EDICT(sv.edicts); 563 for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent)) 564 { 565 ent->u.v.effects = (int)ent->u.v.effects & ~EF_MUZZLEFLASH; 566 } 567 568 } 569 570 /* 571 ================== 572 SV_WriteClientdataToMessage 573 574 ================== 575 */ 576 void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) 577 { 578 int bits; 579 int i; 580 edict_t *other; 581 int items; 582 #ifndef QUAKE2 583 eval_t *val; 584 #endif 585 586 // 587 // send a damage message 588 // 589 if (ent->u.v.dmg_take || ent->u.v.dmg_save) 590 { 591 other = PROG_TO_EDICT(ent->u.v.dmg_inflictor); 592 MSG_WriteByte (msg, svc_damage); 593 MSG_WriteByte (msg, (int) ent->u.v.dmg_save); 594 MSG_WriteByte (msg, (int) ent->u.v.dmg_take); 595 for (i=0 ; i<3 ; i++) 596 MSG_WriteCoord (msg, other->u.v.origin[i] + 0.5*(other->u.v.mins[i] + other->u.v.maxs[i])); 597 598 ent->u.v.dmg_take = 0; 599 ent->u.v.dmg_save = 0; 600 } 601 602 // 603 // send the current viewpos offset from the view entity 604 // 605 SV_SetIdealPitch (); // how much to look up / down ideally 606 607 // a fixangle might get lost in a dropped packet. Oh well. 608 if ( ent->u.v.fixangle ) 609 { 610 MSG_WriteByte (msg, svc_setangle); 611 for (i=0 ; i < 3 ; i++) 612 MSG_WriteAngle (msg, ent->u.v.angles[i] ); 613 ent->u.v.fixangle = 0; 614 } 615 616 bits = 0; 617 618 if (ent->u.v.view_ofs[2] != DEFAULT_VIEWHEIGHT) 619 bits |= SU_VIEWHEIGHT; 620 621 if (ent->u.v.idealpitch) 622 bits |= SU_IDEALPITCH; 623 624 // stuff the sigil bits into the high bits of items for sbar, or else 625 // mix in items2 626 #ifdef QUAKE2 627 items = (int)ent->u.v.items | ((int)ent->u.v.items2 << 23); 628 #else 629 val = GetEdictFieldValue(ent, "items2"); 630 631 if (val) 632 items = (int)ent->u.v.items | ((int)val->_float << 23); 633 else 634 items = (int)ent->u.v.items | ((int)pr_global_struct->serverflags << 28); 635 #endif 636 637 bits |= SU_ITEMS; 638 639 if ( (int)ent->u.v.flags & FL_ONGROUND) 640 bits |= SU_ONGROUND; 641 642 if ( ent->u.v.waterlevel >= 2) 643 bits |= SU_INWATER; 644 645 for (i=0 ; i<3 ; i++) 646 { 647 if (ent->u.v.punchangle[i]) 648 bits |= (SU_PUNCH1<<i); 649 if (ent->u.v.velocity[i]) 650 bits |= (SU_VELOCITY1<<i); 651 } 652 653 if (ent->u.v.weaponframe) 654 bits |= SU_WEAPONFRAME; 655 656 if (ent->u.v.armorvalue) 657 bits |= SU_ARMOR; 658 659 // if (ent->u.v.weapon) 660 bits |= SU_WEAPON; 661 662 // send the data 663 664 MSG_WriteByte (msg, svc_clientdata); 665 MSG_WriteShort (msg, bits); 666 667 if (bits & SU_VIEWHEIGHT) 668 MSG_WriteChar (msg, (int) ent->u.v.view_ofs[2]); 669 670 if (bits & SU_IDEALPITCH) 671 MSG_WriteChar (msg, (int) ent->u.v.idealpitch); 672 673 for (i=0 ; i<3 ; i++) 674 { 675 if (bits & (SU_PUNCH1<<i)) 676 MSG_WriteChar (msg, (int) ent->u.v.punchangle[i]); 677 if (bits & (SU_VELOCITY1<<i)) 678 MSG_WriteChar (msg, (int) ent->u.v.velocity[i]/16); 679 } 680 681 // [always sent] if (bits & SU_ITEMS) 682 MSG_WriteLong (msg, items); 683 684 if (bits & SU_WEAPONFRAME) 685 MSG_WriteByte (msg, (int) ent->u.v.weaponframe); 686 if (bits & SU_ARMOR) 687 MSG_WriteByte (msg, (int) ent->u.v.armorvalue); 688 if (bits & SU_WEAPON) 689 MSG_WriteByte (msg, SV_ModelIndex(pr_strings+ent->u.v.weaponmodel)); 690 691 MSG_WriteShort (msg, (int) ent->u.v.health); 692 MSG_WriteByte (msg, (int) ent->u.v.currentammo); 693 MSG_WriteByte (msg, (int) ent->u.v.ammo_shells); 694 MSG_WriteByte (msg, (int) ent->u.v.ammo_nails); 695 MSG_WriteByte (msg, (int) ent->u.v.ammo_rockets); 696 MSG_WriteByte (msg, (int) ent->u.v.ammo_cells); 697 698 if (standard_quake) 699 { 700 MSG_WriteByte (msg, (int) ent->u.v.weapon); 701 } 702 else 703 { 704 for(i=0;i<32;i++) 705 { 706 if ( ((int)ent->u.v.weapon) & (1<<i) ) 707 { 708 MSG_WriteByte (msg, i); 709 break; 710 } 711 } 712 } 713 } 714 715 /* 716 ======================= 717 SV_SendClientDatagram 718 ======================= 719 */ 720 qboolean SV_SendClientDatagram (client_t *client) 721 { 722 byte buf[MAX_DATAGRAM]; 723 sizebuf_t msg; 724 725 msg.data = buf; 726 msg.maxsize = sizeof(buf); 727 msg.cursize = 0; 728 729 MSG_WriteByte (&msg, svc_time); 730 MSG_WriteFloat (&msg, sv.time); 731 732 // add the client specific data to the datagram 733 SV_WriteClientdataToMessage (client->edict, &msg); 734 735 SV_WriteEntitiesToClient (client->edict, &msg); 736 737 // copy the server datagram if there is space 738 if (msg.cursize + sv.datagram.cursize < msg.maxsize) 739 SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize); 740 741 // send the datagram 742 if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1) 743 { 744 SV_DropClient (true);// if the message couldn't send, kick off 745 return false; 746 } 747 748 return true; 749 } 750 751 /* 752 ======================= 753 SV_UpdateToReliableMessages 754 ======================= 755 */ 756 void SV_UpdateToReliableMessages (void) 757 { 758 int i, j; 759 client_t *client; 760 761 // check for changes to be sent over the reliable streams 762 for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 763 { 764 if (host_client->old_frags != host_client->edict->u.v.frags) 765 { 766 for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++) 767 { 768 if (!client->active) 769 continue; 770 MSG_WriteByte (&client->message, svc_updatefrags); 771 MSG_WriteByte (&client->message, i); 772 MSG_WriteShort (&client->message, (int) host_client->edict->u.v.frags); 773 } 774 775 host_client->old_frags = (int) host_client->edict->u.v.frags; 776 } 777 } 778 779 for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++) 780 { 781 if (!client->active) 782 continue; 783 SZ_Write (&client->message, sv.reliable_datagram.data, sv.reliable_datagram.cursize); 784 } 785 786 SZ_Clear (&sv.reliable_datagram); 787 } 788 789 790 /* 791 ======================= 792 SV_SendNop 793 794 Send a nop message without trashing or sending the accumulated client 795 message buffer 796 ======================= 797 */ 798 void SV_SendNop (client_t *client) 799 { 800 sizebuf_t msg; 801 byte buf[4]; 802 803 msg.data = buf; 804 msg.maxsize = sizeof(buf); 805 msg.cursize = 0; 806 807 MSG_WriteChar (&msg, svc_nop); 808 809 if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1) 810 SV_DropClient (true); // if the message couldn't send, kick off 811 client->last_message = realtime; 812 } 813 814 /* 815 ======================= 816 SV_SendClientMessages 817 ======================= 818 */ 819 void SV_SendClientMessages (void) 820 { 821 int i; 822 823 // update frags, names, etc 824 SV_UpdateToReliableMessages (); 825 826 // build individual updates 827 for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 828 { 829 if (!host_client->active) 830 continue; 831 832 if (host_client->spawned) 833 { 834 if (!SV_SendClientDatagram (host_client)) 835 continue; 836 } 837 else 838 { 839 // the player isn't totally in the game yet 840 // send small keepalive messages if too much time has passed 841 // send a full message when the next signon stage has been requested 842 // some other message data (name changes, etc) may accumulate 843 // between signon stages 844 if (!host_client->sendsignon) 845 { 846 if (realtime - host_client->last_message > 5) 847 SV_SendNop (host_client); 848 continue; // don't send out non-signon messages 849 } 850 } 851 852 // check for an overflowed message. Should only happen 853 // on a very fucked up connection that backs up a lot, then 854 // changes level 855 if (host_client->message.overflowed) 856 { 857 SV_DropClient (true); 858 host_client->message.overflowed = false; 859 continue; 860 } 861 862 if (host_client->message.cursize || host_client->dropasap) 863 { 864 if (!NET_CanSendMessage (host_client->netconnection)) 865 { 866 // I_Printf ("can't write\n"); 867 continue; 868 } 869 870 if (host_client->dropasap) 871 SV_DropClient (false); // went to another level 872 else 873 { 874 if (NET_SendMessage (host_client->netconnection 875 , &host_client->message) == -1) 876 SV_DropClient (true); // if the message couldn't send, kick off 877 SZ_Clear (&host_client->message); 878 host_client->last_message = realtime; 879 host_client->sendsignon = false; 880 } 881 } 882 } 883 884 885 // clear muzzle flashes 886 SV_CleanupEnts (); 887 } 888 889 890 /* 891 ============================================================================== 892 893 SERVER SPAWNING 894 895 ============================================================================== 896 */ 897 898 /* 899 ================ 900 SV_ModelIndex 901 902 ================ 903 */ 904 int SV_ModelIndex (const char *name) 905 { 906 int i; 907 908 if (!name || !name[0]) 909 return 0; 910 911 for (i=0 ; i<MAX_MODELS && sv.model_precache[i] ; i++) 912 if (!strcmp(sv.model_precache[i], name)) 913 return i; 914 if (i==MAX_MODELS || !sv.model_precache[i]) 915 Sys_Error ("SV_ModelIndex: model %s not precached", name); 916 return i; 917 } 918 919 /* 920 ================ 921 SV_CreateBaseline 922 923 ================ 924 */ 925 void SV_CreateBaseline (void) 926 { 927 int i; 928 edict_t *svent; 929 int entnum; 930 931 for (entnum = 0; entnum < sv.num_edicts ; entnum++) 932 { 933 // get the current server version 934 svent = EDICT_NUM(entnum); 935 if (svent->free) 936 continue; 937 if (entnum > svs.maxclients && !svent->u.v.modelindex) 938 continue; 939 940 // 941 // create entity baseline 942 // 943 VectorCopy (svent->u.v.origin, svent->baseline.origin); 944 VectorCopy (svent->u.v.angles, svent->baseline.angles); 945 svent->baseline.frame = (int) svent->u.v.frame; 946 svent->baseline.skin = (int) svent->u.v.skin; 947 if (entnum > 0 && entnum <= svs.maxclients) 948 { 949 svent->baseline.colormap = entnum; 950 svent->baseline.modelindex = SV_ModelIndex("progs/player.mdl"); 951 } 952 else 953 { 954 svent->baseline.colormap = 0; 955 svent->baseline.modelindex = 956 SV_ModelIndex(pr_strings + svent->u.v.model); 957 } 958 959 // 960 // add to the message 961 // 962 MSG_WriteByte (&sv.signon,svc_spawnbaseline); 963 MSG_WriteShort (&sv.signon,entnum); 964 965 MSG_WriteByte (&sv.signon, svent->baseline.modelindex); 966 MSG_WriteByte (&sv.signon, svent->baseline.frame); 967 MSG_WriteByte (&sv.signon, svent->baseline.colormap); 968 MSG_WriteByte (&sv.signon, svent->baseline.skin); 969 for (i=0 ; i<3 ; i++) 970 { 971 MSG_WriteCoord(&sv.signon, svent->baseline.origin[i]); 972 MSG_WriteAngle(&sv.signon, svent->baseline.angles[i]); 973 } 974 } 975 } 976 977 978 /* 979 ================ 980 SV_SendReconnect 981 982 Tell all the clients that the server is changing levels 983 ================ 984 */ 985 void SV_SendReconnect (void) 986 { 987 char data[128]; 988 sizebuf_t msg; 989 990 msg.data = (byte*) data; 991 msg.cursize = 0; 992 msg.maxsize = sizeof(data); 993 994 MSG_WriteChar (&msg, svc_stufftext); 995 MSG_WriteString (&msg, "reconnect\n"); 996 NET_SendToAll (&msg, 5); 997 998 if (cls.state != ca_dedicated) 999 #ifdef QUAKE2 1000 Cbuf_InsertText ("reconnect\n"); 1001 #else 1002 Cmd_ExecuteString2 ("reconnect\n", src_command); 1003 #endif 1004 } 1005 1006 1007 /* 1008 ================ 1009 SV_SaveSpawnparms 1010 1011 Grabs the current state of each client for saving across the 1012 transition to another level 1013 ================ 1014 */ 1015 void SV_SaveSpawnparms (void) 1016 { 1017 int i, j; 1018 1019 svs.serverflags = (int) pr_global_struct->serverflags; 1020 1021 for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 1022 { 1023 if (!host_client->active) 1024 continue; 1025 1026 // call the progs to get default spawn parms for the new client 1027 pr_global_struct->self = EDICT_TO_PROG(host_client->edict); 1028 PR_ExecuteProgram (pr_global_struct->SetChangeParms); 1029 for (j=0 ; j<NUM_SPAWN_PARMS ; j++) 1030 host_client->spawn_parms[j] = (&pr_global_struct->parm1)[j]; 1031 } 1032 } 1033 1034 1035 /* 1036 ================ 1037 SV_SpawnServer 1038 1039 This is called at the start of each level 1040 ================ 1041 */ 1042 extern float scr_centertime_off; 1043 1044 #ifdef QUAKE2 1045 void SV_SpawnServer (char *server, char *startspot) 1046 #else 1047 void SV_SpawnServer (char *server) 1048 #endif 1049 { 1050 edict_t *ent; 1051 int i; 1052 1053 // let's not have any servers with no name 1054 if (hostname.string[0] == 0) 1055 Cvar_Set ("hostname", "UNNAMED"); 1056 scr_centertime_off = 0; 1057 1058 Con_DPrintf ("SpawnServer: %s\n",server); 1059 svs.changelevel_issued = false; // now safe to issue another 1060 1061 // 1062 // tell all connected clients that we are going to a new level 1063 // 1064 if (sv.active) 1065 { 1066 SV_SendReconnect (); 1067 } 1068 1069 // 1070 // make cvars consistant 1071 // 1072 if (coop.value) 1073 Cvar_SetValue ("deathmatch", 0); 1074 current_skill = (int)(skill.value + 0.5); 1075 if (current_skill < 0) 1076 current_skill = 0; 1077 if (current_skill > 3) 1078 current_skill = 3; 1079 1080 Cvar_SetValue ("skill", (float)current_skill); 1081 1082 // 1083 // set up the new server 1084 // 1085 Host_ClearMemory (); 1086 1087 memset (&sv, 0, sizeof(sv)); 1088 1089 strcpy (sv.name, server); 1090 #ifdef QUAKE2 1091 if (startspot) 1092 strcpy(sv.startspot, startspot); 1093 #endif 1094 1095 // load progs to get entity field count 1096 PR_LoadProgs (); 1097 1098 // allocate server memory 1099 sv.max_edicts = MAX_EDICTS; 1100 1101 sv.edicts = (edict_t*) Hunk_AllocName (sv.max_edicts*pr_edict_size, "edicts"); 1102 1103 sv.datagram.maxsize = sizeof(sv.datagram_buf); 1104 sv.datagram.cursize = 0; 1105 sv.datagram.data = sv.datagram_buf; 1106 1107 sv.reliable_datagram.maxsize = sizeof(sv.reliable_datagram_buf); 1108 sv.reliable_datagram.cursize = 0; 1109 sv.reliable_datagram.data = sv.reliable_datagram_buf; 1110 1111 sv.signon.maxsize = sizeof(sv.signon_buf); 1112 sv.signon.cursize = 0; 1113 sv.signon.data = sv.signon_buf; 1114 1115 // leave slots at start for clients only 1116 sv.num_edicts = svs.maxclients+1; 1117 for (i=0 ; i<svs.maxclients ; i++) 1118 { 1119 ent = EDICT_NUM(i+1); 1120 svs.clients[i].edict = ent; 1121 } 1122 1123 sv.state = ss_loading; 1124 sv.paused = false; 1125 1126 sv.time = 1.0; 1127 1128 strcpy (sv.name, server); 1129 sprintf (sv.modelname,"maps/%s.bsp", server); 1130 sv.worldmodel = Mod_ForName (sv.modelname, false); 1131 if (!sv.worldmodel) 1132 { 1133 Con_Printf ("Couldn't spawn server %s\n", sv.modelname); 1134 sv.active = false; 1135 return; 1136 } 1137 sv.models[1] = sv.worldmodel; 1138 1139 // 1140 // clear world interaction links 1141 // 1142 SV_ClearWorld (); 1143 1144 sv.sound_precache[0] = pr_strings; 1145 1146 sv.model_precache[0] = pr_strings; 1147 sv.model_precache[1] = sv.modelname; 1148 for (i=1 ; i<sv.worldmodel->numsubmodels ; i++) 1149 { 1150 sv.model_precache[1+i] = localmodels[i]; 1151 sv.models[i+1] = Mod_ForName (localmodels[i], false); 1152 } 1153 1154 // 1155 // load the rest of the entities 1156 // 1157 ent = EDICT_NUM(0); 1158 memset (&ent->u.v, 0, progs->entityfields * 4); 1159 ent->free = false; 1160 ent->u.v.model = sv.worldmodel->name - pr_strings; 1161 ent->u.v.modelindex = 1; // world model 1162 ent->u.v.solid = SOLID_BSP; 1163 ent->u.v.movetype = MOVETYPE_PUSH; 1164 1165 if (coop.value) 1166 pr_global_struct->coop = coop.value; 1167 else 1168 pr_global_struct->deathmatch = deathmatch.value; 1169 1170 pr_global_struct->mapname = sv.name - pr_strings; 1171 #ifdef QUAKE2 1172 pr_global_struct->startspot = sv.startspot - pr_strings; 1173 #endif 1174 1175 // serverflags are for cross level information (sigils) 1176 pr_global_struct->serverflags = svs.serverflags; 1177 1178 ED_LoadFromFile (sv.worldmodel->entities); 1179 1180 sv.active = true; 1181 1182 // all setup is completed, any further precache statements are errors 1183 sv.state = ss_active; 1184 1185 // run two frames to allow everything to settle 1186 host_frametime = 0.1; 1187 SV_Physics (); 1188 SV_Physics (); 1189 1190 // create a baseline for more efficient communications 1191 SV_CreateBaseline (); 1192 1193 // send serverinfo to all connected clients 1194 for (i=0,host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) 1195 if (host_client->active) 1196 SV_SendServerinfo (host_client); 1197 1198 Con_DPrintf ("Server spawned.\n"); 1199 } 1200 1201