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