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