|
|
1.1.1.4 ! root 1: /* ! 2: Copyright (C) 1997-2001 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: */ 1.1 root 20: #include "g_local.h" 21: #include "m_player.h" 22: 23: 24: char *ClientTeam (edict_t *ent) 25: { 26: char *p; 27: static char value[512]; 28: 29: value[0] = 0; 30: 31: if (!ent->client) 32: return value; 33: 34: strcpy(value, Info_ValueForKey (ent->client->pers.userinfo, "skin")); 35: p = strchr(value, '/'); 36: if (!p) 37: return value; 38: 39: if ((int)(dmflags->value) & DF_MODELTEAMS) 40: { 41: *p = 0; 42: return value; 43: } 44: 45: // if ((int)(dmflags->value) & DF_SKINTEAMS) 46: return ++p; 47: } 48: 49: qboolean OnSameTeam (edict_t *ent1, edict_t *ent2) 50: { 51: char ent1Team [512]; 52: char ent2Team [512]; 53: 54: if (!((int)(dmflags->value) & (DF_MODELTEAMS | DF_SKINTEAMS))) 55: return false; 56: 57: strcpy (ent1Team, ClientTeam (ent1)); 58: strcpy (ent2Team, ClientTeam (ent2)); 59: 60: if (strcmp(ent1Team, ent2Team) == 0) 61: return true; 62: return false; 63: } 64: 65: 66: void SelectNextItem (edict_t *ent, int itflags) 67: { 68: gclient_t *cl; 69: int i, index; 70: gitem_t *it; 71: 72: cl = ent->client; 73: 1.1.1.3 root 74: if (cl->chase_target) { 75: ChaseNext(ent); 76: return; 77: } 78: 1.1 root 79: // scan for the next valid one 80: for (i=1 ; i<=MAX_ITEMS ; i++) 81: { 82: index = (cl->pers.selected_item + i)%MAX_ITEMS; 83: if (!cl->pers.inventory[index]) 84: continue; 85: it = &itemlist[index]; 86: if (!it->use) 87: continue; 88: if (!(it->flags & itflags)) 89: continue; 90: 91: cl->pers.selected_item = index; 92: return; 93: } 94: 95: cl->pers.selected_item = -1; 96: } 97: 98: void SelectPrevItem (edict_t *ent, int itflags) 99: { 100: gclient_t *cl; 101: int i, index; 102: gitem_t *it; 103: 104: cl = ent->client; 105: 1.1.1.3 root 106: if (cl->chase_target) { 107: ChasePrev(ent); 108: return; 109: } 110: 1.1 root 111: // scan for the next valid one 112: for (i=1 ; i<=MAX_ITEMS ; i++) 113: { 114: index = (cl->pers.selected_item + MAX_ITEMS - i)%MAX_ITEMS; 115: if (!cl->pers.inventory[index]) 116: continue; 117: it = &itemlist[index]; 118: if (!it->use) 119: continue; 120: if (!(it->flags & itflags)) 121: continue; 122: 123: cl->pers.selected_item = index; 124: return; 125: } 126: 127: cl->pers.selected_item = -1; 128: } 129: 130: void ValidateSelectedItem (edict_t *ent) 131: { 132: gclient_t *cl; 133: 134: cl = ent->client; 135: 136: if (cl->pers.inventory[cl->pers.selected_item]) 137: return; // valid 138: 139: SelectNextItem (ent, -1); 140: } 141: 142: 143: //================================================================================= 144: 145: /* 146: ================== 147: Cmd_Give_f 148: 149: Give items to a client 150: ================== 151: */ 152: void Cmd_Give_f (edict_t *ent) 153: { 154: char *name; 155: gitem_t *it; 156: int index; 157: int i; 158: qboolean give_all; 159: edict_t *it_ent; 160: 161: if (deathmatch->value && !sv_cheats->value) 162: { 163: gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n"); 164: return; 165: } 166: 167: name = gi.args(); 168: 169: if (Q_stricmp(name, "all") == 0) 170: give_all = true; 171: else 172: give_all = false; 173: 174: if (give_all || Q_stricmp(gi.argv(1), "health") == 0) 175: { 176: if (gi.argc() == 3) 177: ent->health = atoi(gi.argv(2)); 178: else 179: ent->health = ent->max_health; 180: if (!give_all) 181: return; 182: } 183: 184: if (give_all || Q_stricmp(name, "weapons") == 0) 185: { 186: for (i=0 ; i<game.num_items ; i++) 187: { 188: it = itemlist + i; 189: if (!it->pickup) 190: continue; 191: if (!(it->flags & IT_WEAPON)) 192: continue; 193: ent->client->pers.inventory[i] += 1; 194: } 195: if (!give_all) 196: return; 197: } 198: 199: if (give_all || Q_stricmp(name, "ammo") == 0) 200: { 201: for (i=0 ; i<game.num_items ; i++) 202: { 203: it = itemlist + i; 204: if (!it->pickup) 205: continue; 206: if (!(it->flags & IT_AMMO)) 207: continue; 208: Add_Ammo (ent, it, 1000); 209: } 210: if (!give_all) 211: return; 212: } 213: 214: if (give_all || Q_stricmp(name, "armor") == 0) 215: { 216: gitem_armor_t *info; 217: 218: it = FindItem("Jacket Armor"); 219: ent->client->pers.inventory[ITEM_INDEX(it)] = 0; 220: 221: it = FindItem("Combat Armor"); 222: ent->client->pers.inventory[ITEM_INDEX(it)] = 0; 223: 224: it = FindItem("Body Armor"); 225: info = (gitem_armor_t *)it->info; 226: ent->client->pers.inventory[ITEM_INDEX(it)] = info->max_count; 227: 228: if (!give_all) 229: return; 230: } 231: 232: if (give_all || Q_stricmp(name, "Power Shield") == 0) 233: { 234: it = FindItem("Power Shield"); 235: it_ent = G_Spawn(); 236: it_ent->classname = it->classname; 237: SpawnItem (it_ent, it); 238: Touch_Item (it_ent, ent, NULL, NULL); 239: if (it_ent->inuse) 240: G_FreeEdict(it_ent); 241: 242: if (!give_all) 243: return; 244: } 245: 246: if (give_all) 247: { 248: for (i=0 ; i<game.num_items ; i++) 249: { 250: it = itemlist + i; 251: if (!it->pickup) 252: continue; 253: if (it->flags & (IT_ARMOR|IT_WEAPON|IT_AMMO)) 254: continue; 255: ent->client->pers.inventory[i] = 1; 256: } 257: return; 258: } 259: 260: it = FindItem (name); 261: if (!it) 262: { 263: name = gi.argv(1); 264: it = FindItem (name); 265: if (!it) 266: { 1.1.1.2 root 267: gi.cprintf (ent, PRINT_HIGH, "unknown item\n"); 1.1 root 268: return; 269: } 270: } 271: 272: if (!it->pickup) 273: { 1.1.1.2 root 274: gi.cprintf (ent, PRINT_HIGH, "non-pickup item\n"); 1.1 root 275: return; 276: } 277: 278: index = ITEM_INDEX(it); 279: 280: if (it->flags & IT_AMMO) 281: { 282: if (gi.argc() == 3) 283: ent->client->pers.inventory[index] = atoi(gi.argv(2)); 284: else 285: ent->client->pers.inventory[index] += it->quantity; 286: } 287: else 288: { 289: it_ent = G_Spawn(); 290: it_ent->classname = it->classname; 291: SpawnItem (it_ent, it); 292: Touch_Item (it_ent, ent, NULL, NULL); 293: if (it_ent->inuse) 294: G_FreeEdict(it_ent); 295: } 296: } 297: 298: 299: /* 300: ================== 301: Cmd_God_f 302: 303: Sets client to godmode 304: 305: argv(0) god 306: ================== 307: */ 308: void Cmd_God_f (edict_t *ent) 309: { 310: char *msg; 311: 312: if (deathmatch->value && !sv_cheats->value) 313: { 314: gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n"); 315: return; 316: } 317: 318: ent->flags ^= FL_GODMODE; 319: if (!(ent->flags & FL_GODMODE) ) 320: msg = "godmode OFF\n"; 321: else 322: msg = "godmode ON\n"; 323: 324: gi.cprintf (ent, PRINT_HIGH, msg); 325: } 326: 327: 328: /* 329: ================== 330: Cmd_Notarget_f 331: 332: Sets client to notarget 333: 334: argv(0) notarget 335: ================== 336: */ 337: void Cmd_Notarget_f (edict_t *ent) 338: { 339: char *msg; 340: 341: if (deathmatch->value && !sv_cheats->value) 342: { 343: gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n"); 344: return; 345: } 346: 347: ent->flags ^= FL_NOTARGET; 348: if (!(ent->flags & FL_NOTARGET) ) 349: msg = "notarget OFF\n"; 350: else 351: msg = "notarget ON\n"; 352: 353: gi.cprintf (ent, PRINT_HIGH, msg); 354: } 355: 356: 357: /* 358: ================== 359: Cmd_Noclip_f 360: 361: argv(0) noclip 362: ================== 363: */ 364: void Cmd_Noclip_f (edict_t *ent) 365: { 366: char *msg; 367: 368: if (deathmatch->value && !sv_cheats->value) 369: { 370: gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n"); 371: return; 372: } 373: 374: if (ent->movetype == MOVETYPE_NOCLIP) 375: { 376: ent->movetype = MOVETYPE_WALK; 377: msg = "noclip OFF\n"; 378: } 379: else 380: { 381: ent->movetype = MOVETYPE_NOCLIP; 382: msg = "noclip ON\n"; 383: } 384: 385: gi.cprintf (ent, PRINT_HIGH, msg); 386: } 387: 388: 389: /* 390: ================== 391: Cmd_Use_f 392: 393: Use an inventory item 394: ================== 395: */ 396: void Cmd_Use_f (edict_t *ent) 397: { 398: int index; 399: gitem_t *it; 400: char *s; 401: 402: s = gi.args(); 403: it = FindItem (s); 404: if (!it) 405: { 406: gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s); 407: return; 408: } 409: if (!it->use) 410: { 411: gi.cprintf (ent, PRINT_HIGH, "Item is not usable.\n"); 412: return; 413: } 414: index = ITEM_INDEX(it); 415: if (!ent->client->pers.inventory[index]) 416: { 417: gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s); 418: return; 419: } 420: 421: it->use (ent, it); 422: } 423: 424: 425: /* 426: ================== 427: Cmd_Drop_f 428: 429: Drop an inventory item 430: ================== 431: */ 432: void Cmd_Drop_f (edict_t *ent) 433: { 434: int index; 435: gitem_t *it; 436: char *s; 437: 438: s = gi.args(); 439: it = FindItem (s); 440: if (!it) 441: { 442: gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s); 443: return; 444: } 445: if (!it->drop) 446: { 447: gi.cprintf (ent, PRINT_HIGH, "Item is not dropable.\n"); 448: return; 449: } 450: index = ITEM_INDEX(it); 451: if (!ent->client->pers.inventory[index]) 452: { 453: gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s); 454: return; 455: } 456: 457: it->drop (ent, it); 458: } 459: 460: 461: /* 462: ================= 463: Cmd_Inven_f 464: ================= 465: */ 466: void Cmd_Inven_f (edict_t *ent) 467: { 468: int i; 469: gclient_t *cl; 470: 471: cl = ent->client; 472: 473: cl->showscores = false; 474: cl->showhelp = false; 475: 476: if (cl->showinventory) 477: { 478: cl->showinventory = false; 479: return; 480: } 481: 482: cl->showinventory = true; 483: 484: gi.WriteByte (svc_inventory); 485: for (i=0 ; i<MAX_ITEMS ; i++) 486: { 487: gi.WriteShort (cl->pers.inventory[i]); 488: } 489: gi.unicast (ent, true); 490: } 491: 492: /* 493: ================= 494: Cmd_InvUse_f 495: ================= 496: */ 497: void Cmd_InvUse_f (edict_t *ent) 498: { 499: gitem_t *it; 500: 501: ValidateSelectedItem (ent); 502: 503: if (ent->client->pers.selected_item == -1) 504: { 505: gi.cprintf (ent, PRINT_HIGH, "No item to use.\n"); 506: return; 507: } 508: 509: it = &itemlist[ent->client->pers.selected_item]; 510: if (!it->use) 511: { 512: gi.cprintf (ent, PRINT_HIGH, "Item is not usable.\n"); 513: return; 514: } 515: it->use (ent, it); 516: } 517: 518: /* 519: ================= 520: Cmd_WeapPrev_f 521: ================= 522: */ 523: void Cmd_WeapPrev_f (edict_t *ent) 524: { 525: gclient_t *cl; 526: int i, index; 527: gitem_t *it; 528: int selected_weapon; 529: 530: cl = ent->client; 531: 532: if (!cl->pers.weapon) 533: return; 534: 535: selected_weapon = ITEM_INDEX(cl->pers.weapon); 536: 537: // scan for the next valid one 538: for (i=1 ; i<=MAX_ITEMS ; i++) 539: { 540: index = (selected_weapon + i)%MAX_ITEMS; 541: if (!cl->pers.inventory[index]) 542: continue; 543: it = &itemlist[index]; 544: if (!it->use) 545: continue; 546: if (! (it->flags & IT_WEAPON) ) 547: continue; 548: it->use (ent, it); 549: if (cl->pers.weapon == it) 550: return; // successful 551: } 552: } 553: 554: /* 555: ================= 556: Cmd_WeapNext_f 557: ================= 558: */ 559: void Cmd_WeapNext_f (edict_t *ent) 560: { 561: gclient_t *cl; 562: int i, index; 563: gitem_t *it; 564: int selected_weapon; 565: 566: cl = ent->client; 567: 568: if (!cl->pers.weapon) 569: return; 570: 571: selected_weapon = ITEM_INDEX(cl->pers.weapon); 572: 573: // scan for the next valid one 574: for (i=1 ; i<=MAX_ITEMS ; i++) 575: { 576: index = (selected_weapon + MAX_ITEMS - i)%MAX_ITEMS; 577: if (!cl->pers.inventory[index]) 578: continue; 579: it = &itemlist[index]; 580: if (!it->use) 581: continue; 582: if (! (it->flags & IT_WEAPON) ) 583: continue; 584: it->use (ent, it); 585: if (cl->pers.weapon == it) 586: return; // successful 587: } 588: } 589: 590: /* 591: ================= 592: Cmd_WeapLast_f 593: ================= 594: */ 595: void Cmd_WeapLast_f (edict_t *ent) 596: { 597: gclient_t *cl; 598: int index; 599: gitem_t *it; 600: 601: cl = ent->client; 602: 603: if (!cl->pers.weapon || !cl->pers.lastweapon) 604: return; 605: 606: index = ITEM_INDEX(cl->pers.lastweapon); 607: if (!cl->pers.inventory[index]) 608: return; 609: it = &itemlist[index]; 610: if (!it->use) 611: return; 612: if (! (it->flags & IT_WEAPON) ) 613: return; 614: it->use (ent, it); 615: } 616: 617: /* 618: ================= 619: Cmd_InvDrop_f 620: ================= 621: */ 622: void Cmd_InvDrop_f (edict_t *ent) 623: { 624: gitem_t *it; 625: 626: ValidateSelectedItem (ent); 627: 628: if (ent->client->pers.selected_item == -1) 629: { 630: gi.cprintf (ent, PRINT_HIGH, "No item to drop.\n"); 631: return; 632: } 633: 634: it = &itemlist[ent->client->pers.selected_item]; 635: if (!it->drop) 636: { 637: gi.cprintf (ent, PRINT_HIGH, "Item is not dropable.\n"); 638: return; 639: } 640: it->drop (ent, it); 641: } 642: 643: /* 644: ================= 645: Cmd_Kill_f 646: ================= 647: */ 648: void Cmd_Kill_f (edict_t *ent) 649: { 650: if((level.time - ent->client->respawn_time) < 5) 651: return; 652: ent->flags &= ~FL_GODMODE; 653: ent->health = 0; 654: meansOfDeath = MOD_SUICIDE; 655: player_die (ent, ent, ent, 100000, vec3_origin); 656: } 657: 658: /* 659: ================= 660: Cmd_PutAway_f 661: ================= 662: */ 663: void Cmd_PutAway_f (edict_t *ent) 664: { 665: ent->client->showscores = false; 666: ent->client->showhelp = false; 667: ent->client->showinventory = false; 668: } 669: 670: 671: int PlayerSort (void const *a, void const *b) 672: { 673: int anum, bnum; 674: 675: anum = *(int *)a; 676: bnum = *(int *)b; 677: 678: anum = game.clients[anum].ps.stats[STAT_FRAGS]; 679: bnum = game.clients[bnum].ps.stats[STAT_FRAGS]; 680: 681: if (anum < bnum) 682: return -1; 683: if (anum > bnum) 684: return 1; 685: return 0; 686: } 687: 688: /* 689: ================= 690: Cmd_Players_f 691: ================= 692: */ 693: void Cmd_Players_f (edict_t *ent) 694: { 695: int i; 696: int count; 697: char small[64]; 698: char large[1280]; 699: int index[256]; 700: 701: count = 0; 702: for (i = 0 ; i < maxclients->value ; i++) 703: if (game.clients[i].pers.connected) 704: { 705: index[count] = i; 706: count++; 707: } 708: 709: // sort by frags 710: qsort (index, count, sizeof(index[0]), PlayerSort); 711: 712: // print information 713: large[0] = 0; 714: 715: for (i = 0 ; i < count ; i++) 716: { 717: Com_sprintf (small, sizeof(small), "%3i %s\n", 718: game.clients[index[i]].ps.stats[STAT_FRAGS], 719: game.clients[index[i]].pers.netname); 720: if (strlen (small) + strlen(large) > sizeof(large) - 100 ) 721: { // can't print all of them in one packet 722: strcat (large, "...\n"); 723: break; 724: } 725: strcat (large, small); 726: } 727: 728: gi.cprintf (ent, PRINT_HIGH, "%s\n%i players\n", large, count); 729: } 730: 731: /* 732: ================= 733: Cmd_Wave_f 734: ================= 735: */ 736: void Cmd_Wave_f (edict_t *ent) 737: { 738: int i; 739: 740: i = atoi (gi.argv(1)); 741: 742: // can't wave when ducked 743: if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) 744: return; 745: 746: if (ent->client->anim_priority > ANIM_WAVE) 747: return; 748: 749: ent->client->anim_priority = ANIM_WAVE; 750: 751: switch (i) 752: { 753: case 0: 754: gi.cprintf (ent, PRINT_HIGH, "flipoff\n"); 755: ent->s.frame = FRAME_flip01-1; 756: ent->client->anim_end = FRAME_flip12; 757: break; 758: case 1: 759: gi.cprintf (ent, PRINT_HIGH, "salute\n"); 760: ent->s.frame = FRAME_salute01-1; 761: ent->client->anim_end = FRAME_salute11; 762: break; 763: case 2: 764: gi.cprintf (ent, PRINT_HIGH, "taunt\n"); 765: ent->s.frame = FRAME_taunt01-1; 766: ent->client->anim_end = FRAME_taunt17; 767: break; 768: case 3: 769: gi.cprintf (ent, PRINT_HIGH, "wave\n"); 770: ent->s.frame = FRAME_wave01-1; 771: ent->client->anim_end = FRAME_wave11; 772: break; 773: case 4: 774: default: 775: gi.cprintf (ent, PRINT_HIGH, "point\n"); 776: ent->s.frame = FRAME_point01-1; 777: ent->client->anim_end = FRAME_point12; 778: break; 779: } 780: } 781: 782: /* 783: ================== 784: Cmd_Say_f 785: ================== 786: */ 787: void Cmd_Say_f (edict_t *ent, qboolean team, qboolean arg0) 788: { 1.1.1.2 root 789: int i, j; 1.1 root 790: edict_t *other; 791: char *p; 792: char text[2048]; 1.1.1.2 root 793: gclient_t *cl; 1.1 root 794: 795: if (gi.argc () < 2 && !arg0) 796: return; 797: 798: if (!((int)(dmflags->value) & (DF_MODELTEAMS | DF_SKINTEAMS))) 799: team = false; 800: 801: if (team) 802: Com_sprintf (text, sizeof(text), "(%s): ", ent->client->pers.netname); 803: else 804: Com_sprintf (text, sizeof(text), "%s: ", ent->client->pers.netname); 805: 806: if (arg0) 807: { 808: strcat (text, gi.argv(0)); 809: strcat (text, " "); 810: strcat (text, gi.args()); 811: } 812: else 813: { 814: p = gi.args(); 815: 816: if (*p == '"') 817: { 818: p++; 819: p[strlen(p)-1] = 0; 820: } 821: strcat(text, p); 822: } 823: 824: // don't let text be too long for malicious reasons 825: if (strlen(text) > 150) 826: text[150] = 0; 827: 828: strcat(text, "\n"); 829: 1.1.1.2 root 830: if (flood_msgs->value) { 831: cl = ent->client; 832: 833: if (level.time < cl->flood_locktill) { 834: gi.cprintf(ent, PRINT_HIGH, "You can't talk for %d more seconds\n", 835: (int)(cl->flood_locktill - level.time)); 836: return; 837: } 838: i = cl->flood_whenhead - flood_msgs->value + 1; 839: if (i < 0) 840: i = (sizeof(cl->flood_when)/sizeof(cl->flood_when[0])) + i; 841: if (cl->flood_when[i] && 842: level.time - cl->flood_when[i] < flood_persecond->value) { 843: cl->flood_locktill = level.time + flood_waitdelay->value; 844: gi.cprintf(ent, PRINT_CHAT, "Flood protection: You can't talk for %d seconds.\n", 845: (int)flood_waitdelay->value); 846: return; 847: } 848: cl->flood_whenhead = (cl->flood_whenhead + 1) % 849: (sizeof(cl->flood_when)/sizeof(cl->flood_when[0])); 850: cl->flood_when[cl->flood_whenhead] = level.time; 851: } 852: 1.1 root 853: if (dedicated->value) 854: gi.cprintf(NULL, PRINT_CHAT, "%s", text); 855: 856: for (j = 1; j <= game.maxclients; j++) 857: { 858: other = &g_edicts[j]; 859: if (!other->inuse) 860: continue; 861: if (!other->client) 862: continue; 863: if (team) 864: { 865: if (!OnSameTeam(ent, other)) 866: continue; 867: } 868: gi.cprintf(other, PRINT_CHAT, "%s", text); 869: } 870: } 871: 1.1.1.3 root 872: void Cmd_PlayerList_f(edict_t *ent) 873: { 874: int i; 875: char st[80]; 876: char text[1400]; 877: edict_t *e2; 878: 879: // connect time, ping, score, name 880: *text = 0; 881: for (i = 0, e2 = g_edicts + 1; i < maxclients->value; i++, e2++) { 882: if (!e2->inuse) 883: continue; 884: 1.1.1.4 ! root 885: Com_sprintf(st, sizeof(st), "%02d:%02d %4d %3d %s%s\n", 1.1.1.3 root 886: (level.framenum - e2->client->resp.enterframe) / 600, 887: ((level.framenum - e2->client->resp.enterframe) % 600)/10, 888: e2->client->ping, 889: e2->client->resp.score, 890: e2->client->pers.netname, 891: e2->client->resp.spectator ? " (spectator)" : ""); 892: if (strlen(text) + strlen(st) > sizeof(text) - 50) { 893: sprintf(text+strlen(text), "And more...\n"); 894: gi.cprintf(ent, PRINT_HIGH, "%s", text); 895: return; 896: } 897: strcat(text, st); 898: } 899: gi.cprintf(ent, PRINT_HIGH, "%s", text); 900: } 901: 902: 1.1 root 903: /* 904: ================= 905: ClientCommand 906: ================= 907: */ 908: void ClientCommand (edict_t *ent) 909: { 910: char *cmd; 911: 912: if (!ent->client) 913: return; // not fully in game yet 914: 915: cmd = gi.argv(0); 916: 917: if (Q_stricmp (cmd, "players") == 0) 918: { 919: Cmd_Players_f (ent); 920: return; 921: } 922: if (Q_stricmp (cmd, "say") == 0) 923: { 924: Cmd_Say_f (ent, false, false); 925: return; 926: } 927: if (Q_stricmp (cmd, "say_team") == 0) 928: { 929: Cmd_Say_f (ent, true, false); 930: return; 931: } 932: if (Q_stricmp (cmd, "score") == 0) 933: { 934: Cmd_Score_f (ent); 935: return; 936: } 937: if (Q_stricmp (cmd, "help") == 0) 938: { 939: Cmd_Help_f (ent); 940: return; 941: } 942: 943: if (level.intermissiontime) 944: return; 945: 946: if (Q_stricmp (cmd, "use") == 0) 947: Cmd_Use_f (ent); 948: else if (Q_stricmp (cmd, "drop") == 0) 949: Cmd_Drop_f (ent); 950: else if (Q_stricmp (cmd, "give") == 0) 951: Cmd_Give_f (ent); 952: else if (Q_stricmp (cmd, "god") == 0) 953: Cmd_God_f (ent); 954: else if (Q_stricmp (cmd, "notarget") == 0) 955: Cmd_Notarget_f (ent); 956: else if (Q_stricmp (cmd, "noclip") == 0) 957: Cmd_Noclip_f (ent); 958: else if (Q_stricmp (cmd, "inven") == 0) 959: Cmd_Inven_f (ent); 960: else if (Q_stricmp (cmd, "invnext") == 0) 961: SelectNextItem (ent, -1); 962: else if (Q_stricmp (cmd, "invprev") == 0) 963: SelectPrevItem (ent, -1); 964: else if (Q_stricmp (cmd, "invnextw") == 0) 965: SelectNextItem (ent, IT_WEAPON); 966: else if (Q_stricmp (cmd, "invprevw") == 0) 967: SelectPrevItem (ent, IT_WEAPON); 968: else if (Q_stricmp (cmd, "invnextp") == 0) 969: SelectNextItem (ent, IT_POWERUP); 970: else if (Q_stricmp (cmd, "invprevp") == 0) 971: SelectPrevItem (ent, IT_POWERUP); 972: else if (Q_stricmp (cmd, "invuse") == 0) 973: Cmd_InvUse_f (ent); 974: else if (Q_stricmp (cmd, "invdrop") == 0) 975: Cmd_InvDrop_f (ent); 976: else if (Q_stricmp (cmd, "weapprev") == 0) 977: Cmd_WeapPrev_f (ent); 978: else if (Q_stricmp (cmd, "weapnext") == 0) 979: Cmd_WeapNext_f (ent); 980: else if (Q_stricmp (cmd, "weaplast") == 0) 981: Cmd_WeapLast_f (ent); 982: else if (Q_stricmp (cmd, "kill") == 0) 983: Cmd_Kill_f (ent); 984: else if (Q_stricmp (cmd, "putaway") == 0) 985: Cmd_PutAway_f (ent); 986: else if (Q_stricmp (cmd, "wave") == 0) 987: Cmd_Wave_f (ent); 1.1.1.3 root 988: else if (Q_stricmp(cmd, "playerlist") == 0) 989: Cmd_PlayerList_f(ent); 1.1 root 990: else // anything that doesn't match a command will be a chat 991: Cmd_Say_f (ent, false, true); 992: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.