Annotation of quake2/game/g_cmds.c, revision 1.1.1.3

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: 
1.1.1.3 ! root       55:        if (cl->chase_target) {
        !            56:                ChaseNext(ent);
        !            57:                return;
        !            58:        }
        !            59: 
1.1       root       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: 
1.1.1.3 ! root       87:        if (cl->chase_target) {
        !            88:                ChasePrev(ent);
        !            89:                return;
        !            90:        }
        !            91: 
1.1       root       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:                {
1.1.1.2   root      248:                        gi.cprintf (ent, PRINT_HIGH, "unknown item\n");
1.1       root      249:                        return;
                    250:                }
                    251:        }
                    252: 
                    253:        if (!it->pickup)
                    254:        {
1.1.1.2   root      255:                gi.cprintf (ent, PRINT_HIGH, "non-pickup item\n");
1.1       root      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: void Cmd_Use_f (edict_t *ent)
                    378: {
                    379:        int                     index;
                    380:        gitem_t         *it;
                    381:        char            *s;
                    382: 
                    383:        s = gi.args();
                    384:        it = FindItem (s);
                    385:        if (!it)
                    386:        {
                    387:                gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s);
                    388:                return;
                    389:        }
                    390:        if (!it->use)
                    391:        {
                    392:                gi.cprintf (ent, PRINT_HIGH, "Item is not usable.\n");
                    393:                return;
                    394:        }
                    395:        index = ITEM_INDEX(it);
                    396:        if (!ent->client->pers.inventory[index])
                    397:        {
                    398:                gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s);
                    399:                return;
                    400:        }
                    401: 
                    402:        it->use (ent, it);
                    403: }
                    404: 
                    405: 
                    406: /*
                    407: ==================
                    408: Cmd_Drop_f
                    409: 
                    410: Drop an inventory item
                    411: ==================
                    412: */
                    413: void Cmd_Drop_f (edict_t *ent)
                    414: {
                    415:        int                     index;
                    416:        gitem_t         *it;
                    417:        char            *s;
                    418: 
                    419:        s = gi.args();
                    420:        it = FindItem (s);
                    421:        if (!it)
                    422:        {
                    423:                gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s);
                    424:                return;
                    425:        }
                    426:        if (!it->drop)
                    427:        {
                    428:                gi.cprintf (ent, PRINT_HIGH, "Item is not dropable.\n");
                    429:                return;
                    430:        }
                    431:        index = ITEM_INDEX(it);
                    432:        if (!ent->client->pers.inventory[index])
                    433:        {
                    434:                gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s);
                    435:                return;
                    436:        }
                    437: 
                    438:        it->drop (ent, it);
                    439: }
                    440: 
                    441: 
                    442: /*
                    443: =================
                    444: Cmd_Inven_f
                    445: =================
                    446: */
                    447: void Cmd_Inven_f (edict_t *ent)
                    448: {
                    449:        int                     i;
                    450:        gclient_t       *cl;
                    451: 
                    452:        cl = ent->client;
                    453: 
                    454:        cl->showscores = false;
                    455:        cl->showhelp = false;
                    456: 
                    457:        if (cl->showinventory)
                    458:        {
                    459:                cl->showinventory = false;
                    460:                return;
                    461:        }
                    462: 
                    463:        cl->showinventory = true;
                    464: 
                    465:        gi.WriteByte (svc_inventory);
                    466:        for (i=0 ; i<MAX_ITEMS ; i++)
                    467:        {
                    468:                gi.WriteShort (cl->pers.inventory[i]);
                    469:        }
                    470:        gi.unicast (ent, true);
                    471: }
                    472: 
                    473: /*
                    474: =================
                    475: Cmd_InvUse_f
                    476: =================
                    477: */
                    478: void Cmd_InvUse_f (edict_t *ent)
                    479: {
                    480:        gitem_t         *it;
                    481: 
                    482:        ValidateSelectedItem (ent);
                    483: 
                    484:        if (ent->client->pers.selected_item == -1)
                    485:        {
                    486:                gi.cprintf (ent, PRINT_HIGH, "No item to use.\n");
                    487:                return;
                    488:        }
                    489: 
                    490:        it = &itemlist[ent->client->pers.selected_item];
                    491:        if (!it->use)
                    492:        {
                    493:                gi.cprintf (ent, PRINT_HIGH, "Item is not usable.\n");
                    494:                return;
                    495:        }
                    496:        it->use (ent, it);
                    497: }
                    498: 
                    499: /*
                    500: =================
                    501: Cmd_WeapPrev_f
                    502: =================
                    503: */
                    504: void Cmd_WeapPrev_f (edict_t *ent)
                    505: {
                    506:        gclient_t       *cl;
                    507:        int                     i, index;
                    508:        gitem_t         *it;
                    509:        int                     selected_weapon;
                    510: 
                    511:        cl = ent->client;
                    512: 
                    513:        if (!cl->pers.weapon)
                    514:                return;
                    515: 
                    516:        selected_weapon = ITEM_INDEX(cl->pers.weapon);
                    517: 
                    518:        // scan  for the next valid one
                    519:        for (i=1 ; i<=MAX_ITEMS ; i++)
                    520:        {
                    521:                index = (selected_weapon + i)%MAX_ITEMS;
                    522:                if (!cl->pers.inventory[index])
                    523:                        continue;
                    524:                it = &itemlist[index];
                    525:                if (!it->use)
                    526:                        continue;
                    527:                if (! (it->flags & IT_WEAPON) )
                    528:                        continue;
                    529:                it->use (ent, it);
                    530:                if (cl->pers.weapon == it)
                    531:                        return; // successful
                    532:        }
                    533: }
                    534: 
                    535: /*
                    536: =================
                    537: Cmd_WeapNext_f
                    538: =================
                    539: */
                    540: void Cmd_WeapNext_f (edict_t *ent)
                    541: {
                    542:        gclient_t       *cl;
                    543:        int                     i, index;
                    544:        gitem_t         *it;
                    545:        int                     selected_weapon;
                    546: 
                    547:        cl = ent->client;
                    548: 
                    549:        if (!cl->pers.weapon)
                    550:                return;
                    551: 
                    552:        selected_weapon = ITEM_INDEX(cl->pers.weapon);
                    553: 
                    554:        // scan  for the next valid one
                    555:        for (i=1 ; i<=MAX_ITEMS ; i++)
                    556:        {
                    557:                index = (selected_weapon + MAX_ITEMS - i)%MAX_ITEMS;
                    558:                if (!cl->pers.inventory[index])
                    559:                        continue;
                    560:                it = &itemlist[index];
                    561:                if (!it->use)
                    562:                        continue;
                    563:                if (! (it->flags & IT_WEAPON) )
                    564:                        continue;
                    565:                it->use (ent, it);
                    566:                if (cl->pers.weapon == it)
                    567:                        return; // successful
                    568:        }
                    569: }
                    570: 
                    571: /*
                    572: =================
                    573: Cmd_WeapLast_f
                    574: =================
                    575: */
                    576: void Cmd_WeapLast_f (edict_t *ent)
                    577: {
                    578:        gclient_t       *cl;
                    579:        int                     index;
                    580:        gitem_t         *it;
                    581: 
                    582:        cl = ent->client;
                    583: 
                    584:        if (!cl->pers.weapon || !cl->pers.lastweapon)
                    585:                return;
                    586: 
                    587:        index = ITEM_INDEX(cl->pers.lastweapon);
                    588:        if (!cl->pers.inventory[index])
                    589:                return;
                    590:        it = &itemlist[index];
                    591:        if (!it->use)
                    592:                return;
                    593:        if (! (it->flags & IT_WEAPON) )
                    594:                return;
                    595:        it->use (ent, it);
                    596: }
                    597: 
                    598: /*
                    599: =================
                    600: Cmd_InvDrop_f
                    601: =================
                    602: */
                    603: void Cmd_InvDrop_f (edict_t *ent)
                    604: {
                    605:        gitem_t         *it;
                    606: 
                    607:        ValidateSelectedItem (ent);
                    608: 
                    609:        if (ent->client->pers.selected_item == -1)
                    610:        {
                    611:                gi.cprintf (ent, PRINT_HIGH, "No item to drop.\n");
                    612:                return;
                    613:        }
                    614: 
                    615:        it = &itemlist[ent->client->pers.selected_item];
                    616:        if (!it->drop)
                    617:        {
                    618:                gi.cprintf (ent, PRINT_HIGH, "Item is not dropable.\n");
                    619:                return;
                    620:        }
                    621:        it->drop (ent, it);
                    622: }
                    623: 
                    624: /*
                    625: =================
                    626: Cmd_Kill_f
                    627: =================
                    628: */
                    629: void Cmd_Kill_f (edict_t *ent)
                    630: {
                    631:        if((level.time - ent->client->respawn_time) < 5)
                    632:                return;
                    633:        ent->flags &= ~FL_GODMODE;
                    634:        ent->health = 0;
                    635:        meansOfDeath = MOD_SUICIDE;
                    636:        player_die (ent, ent, ent, 100000, vec3_origin);
                    637: }
                    638: 
                    639: /*
                    640: =================
                    641: Cmd_PutAway_f
                    642: =================
                    643: */
                    644: void Cmd_PutAway_f (edict_t *ent)
                    645: {
                    646:        ent->client->showscores = false;
                    647:        ent->client->showhelp = false;
                    648:        ent->client->showinventory = false;
                    649: }
                    650: 
                    651: 
                    652: int PlayerSort (void const *a, void const *b)
                    653: {
                    654:        int             anum, bnum;
                    655: 
                    656:        anum = *(int *)a;
                    657:        bnum = *(int *)b;
                    658: 
                    659:        anum = game.clients[anum].ps.stats[STAT_FRAGS];
                    660:        bnum = game.clients[bnum].ps.stats[STAT_FRAGS];
                    661: 
                    662:        if (anum < bnum)
                    663:                return -1;
                    664:        if (anum > bnum)
                    665:                return 1;
                    666:        return 0;
                    667: }
                    668: 
                    669: /*
                    670: =================
                    671: Cmd_Players_f
                    672: =================
                    673: */
                    674: void Cmd_Players_f (edict_t *ent)
                    675: {
                    676:        int             i;
                    677:        int             count;
                    678:        char    small[64];
                    679:        char    large[1280];
                    680:        int             index[256];
                    681: 
                    682:        count = 0;
                    683:        for (i = 0 ; i < maxclients->value ; i++)
                    684:                if (game.clients[i].pers.connected)
                    685:                {
                    686:                        index[count] = i;
                    687:                        count++;
                    688:                }
                    689: 
                    690:        // sort by frags
                    691:        qsort (index, count, sizeof(index[0]), PlayerSort);
                    692: 
                    693:        // print information
                    694:        large[0] = 0;
                    695: 
                    696:        for (i = 0 ; i < count ; i++)
                    697:        {
                    698:                Com_sprintf (small, sizeof(small), "%3i %s\n",
                    699:                        game.clients[index[i]].ps.stats[STAT_FRAGS],
                    700:                        game.clients[index[i]].pers.netname);
                    701:                if (strlen (small) + strlen(large) > sizeof(large) - 100 )
                    702:                {       // can't print all of them in one packet
                    703:                        strcat (large, "...\n");
                    704:                        break;
                    705:                }
                    706:                strcat (large, small);
                    707:        }
                    708: 
                    709:        gi.cprintf (ent, PRINT_HIGH, "%s\n%i players\n", large, count);
                    710: }
                    711: 
                    712: /*
                    713: =================
                    714: Cmd_Wave_f
                    715: =================
                    716: */
                    717: void Cmd_Wave_f (edict_t *ent)
                    718: {
                    719:        int             i;
                    720: 
                    721:        i = atoi (gi.argv(1));
                    722: 
                    723:        // can't wave when ducked
                    724:        if (ent->client->ps.pmove.pm_flags & PMF_DUCKED)
                    725:                return;
                    726: 
                    727:        if (ent->client->anim_priority > ANIM_WAVE)
                    728:                return;
                    729: 
                    730:        ent->client->anim_priority = ANIM_WAVE;
                    731: 
                    732:        switch (i)
                    733:        {
                    734:        case 0:
                    735:                gi.cprintf (ent, PRINT_HIGH, "flipoff\n");
                    736:                ent->s.frame = FRAME_flip01-1;
                    737:                ent->client->anim_end = FRAME_flip12;
                    738:                break;
                    739:        case 1:
                    740:                gi.cprintf (ent, PRINT_HIGH, "salute\n");
                    741:                ent->s.frame = FRAME_salute01-1;
                    742:                ent->client->anim_end = FRAME_salute11;
                    743:                break;
                    744:        case 2:
                    745:                gi.cprintf (ent, PRINT_HIGH, "taunt\n");
                    746:                ent->s.frame = FRAME_taunt01-1;
                    747:                ent->client->anim_end = FRAME_taunt17;
                    748:                break;
                    749:        case 3:
                    750:                gi.cprintf (ent, PRINT_HIGH, "wave\n");
                    751:                ent->s.frame = FRAME_wave01-1;
                    752:                ent->client->anim_end = FRAME_wave11;
                    753:                break;
                    754:        case 4:
                    755:        default:
                    756:                gi.cprintf (ent, PRINT_HIGH, "point\n");
                    757:                ent->s.frame = FRAME_point01-1;
                    758:                ent->client->anim_end = FRAME_point12;
                    759:                break;
                    760:        }
                    761: }
                    762: 
                    763: /*
                    764: ==================
                    765: Cmd_Say_f
                    766: ==================
                    767: */
                    768: void Cmd_Say_f (edict_t *ent, qboolean team, qboolean arg0)
                    769: {
1.1.1.2   root      770:        int             i, j;
1.1       root      771:        edict_t *other;
                    772:        char    *p;
                    773:        char    text[2048];
1.1.1.2   root      774:        gclient_t *cl;
1.1       root      775: 
                    776:        if (gi.argc () < 2 && !arg0)
                    777:                return;
                    778: 
                    779:        if (!((int)(dmflags->value) & (DF_MODELTEAMS | DF_SKINTEAMS)))
                    780:                team = false;
                    781: 
                    782:        if (team)
                    783:                Com_sprintf (text, sizeof(text), "(%s): ", ent->client->pers.netname);
                    784:        else
                    785:                Com_sprintf (text, sizeof(text), "%s: ", ent->client->pers.netname);
                    786: 
                    787:        if (arg0)
                    788:        {
                    789:                strcat (text, gi.argv(0));
                    790:                strcat (text, " ");
                    791:                strcat (text, gi.args());
                    792:        }
                    793:        else
                    794:        {
                    795:                p = gi.args();
                    796: 
                    797:                if (*p == '"')
                    798:                {
                    799:                        p++;
                    800:                        p[strlen(p)-1] = 0;
                    801:                }
                    802:                strcat(text, p);
                    803:        }
                    804: 
                    805:        // don't let text be too long for malicious reasons
                    806:        if (strlen(text) > 150)
                    807:                text[150] = 0;
                    808: 
                    809:        strcat(text, "\n");
                    810: 
1.1.1.2   root      811:        if (flood_msgs->value) {
                    812:                cl = ent->client;
                    813: 
                    814:         if (level.time < cl->flood_locktill) {
                    815:                        gi.cprintf(ent, PRINT_HIGH, "You can't talk for %d more seconds\n",
                    816:                                (int)(cl->flood_locktill - level.time));
                    817:             return;
                    818:         }
                    819:         i = cl->flood_whenhead - flood_msgs->value + 1;
                    820:         if (i < 0)
                    821:             i = (sizeof(cl->flood_when)/sizeof(cl->flood_when[0])) + i;
                    822:                if (cl->flood_when[i] && 
                    823:                        level.time - cl->flood_when[i] < flood_persecond->value) {
                    824:                        cl->flood_locktill = level.time + flood_waitdelay->value;
                    825:                        gi.cprintf(ent, PRINT_CHAT, "Flood protection:  You can't talk for %d seconds.\n",
                    826:                                (int)flood_waitdelay->value);
                    827:             return;
                    828:         }
                    829:                cl->flood_whenhead = (cl->flood_whenhead + 1) %
                    830:                        (sizeof(cl->flood_when)/sizeof(cl->flood_when[0]));
                    831:                cl->flood_when[cl->flood_whenhead] = level.time;
                    832:        }
                    833: 
1.1       root      834:        if (dedicated->value)
                    835:                gi.cprintf(NULL, PRINT_CHAT, "%s", text);
                    836: 
                    837:        for (j = 1; j <= game.maxclients; j++)
                    838:        {
                    839:                other = &g_edicts[j];
                    840:                if (!other->inuse)
                    841:                        continue;
                    842:                if (!other->client)
                    843:                        continue;
                    844:                if (team)
                    845:                {
                    846:                        if (!OnSameTeam(ent, other))
                    847:                                continue;
                    848:                }
                    849:                gi.cprintf(other, PRINT_CHAT, "%s", text);
                    850:        }
                    851: }
                    852: 
1.1.1.3 ! root      853: void Cmd_PlayerList_f(edict_t *ent)
        !           854: {
        !           855:        int i;
        !           856:        char st[80];
        !           857:        char text[1400];
        !           858:        edict_t *e2;
        !           859: 
        !           860:        // connect time, ping, score, name
        !           861:        *text = 0;
        !           862:        for (i = 0, e2 = g_edicts + 1; i < maxclients->value; i++, e2++) {
        !           863:                if (!e2->inuse)
        !           864:                        continue;
        !           865: 
        !           866:                sprintf(st, "%02d:%02d %4d %3d %s%s\n",
        !           867:                        (level.framenum - e2->client->resp.enterframe) / 600,
        !           868:                        ((level.framenum - e2->client->resp.enterframe) % 600)/10,
        !           869:                        e2->client->ping,
        !           870:                        e2->client->resp.score,
        !           871:                        e2->client->pers.netname,
        !           872:                        e2->client->resp.spectator ? " (spectator)" : "");
        !           873:                if (strlen(text) + strlen(st) > sizeof(text) - 50) {
        !           874:                        sprintf(text+strlen(text), "And more...\n");
        !           875:                        gi.cprintf(ent, PRINT_HIGH, "%s", text);
        !           876:                        return;
        !           877:                }
        !           878:                strcat(text, st);
        !           879:        }
        !           880:        gi.cprintf(ent, PRINT_HIGH, "%s", text);
        !           881: }
        !           882: 
        !           883: 
1.1       root      884: /*
                    885: =================
                    886: ClientCommand
                    887: =================
                    888: */
                    889: void ClientCommand (edict_t *ent)
                    890: {
                    891:        char    *cmd;
                    892: 
                    893:        if (!ent->client)
                    894:                return;         // not fully in game yet
                    895: 
                    896:        cmd = gi.argv(0);
                    897: 
                    898:        if (Q_stricmp (cmd, "players") == 0)
                    899:        {
                    900:                Cmd_Players_f (ent);
                    901:                return;
                    902:        }
                    903:        if (Q_stricmp (cmd, "say") == 0)
                    904:        {
                    905:                Cmd_Say_f (ent, false, false);
                    906:                return;
                    907:        }
                    908:        if (Q_stricmp (cmd, "say_team") == 0)
                    909:        {
                    910:                Cmd_Say_f (ent, true, false);
                    911:                return;
                    912:        }
                    913:        if (Q_stricmp (cmd, "score") == 0)
                    914:        {
                    915:                Cmd_Score_f (ent);
                    916:                return;
                    917:        }
                    918:        if (Q_stricmp (cmd, "help") == 0)
                    919:        {
                    920:                Cmd_Help_f (ent);
                    921:                return;
                    922:        }
                    923: 
                    924:        if (level.intermissiontime)
                    925:                return;
                    926: 
                    927:        if (Q_stricmp (cmd, "use") == 0)
                    928:                Cmd_Use_f (ent);
                    929:        else if (Q_stricmp (cmd, "drop") == 0)
                    930:                Cmd_Drop_f (ent);
                    931:        else if (Q_stricmp (cmd, "give") == 0)
                    932:                Cmd_Give_f (ent);
                    933:        else if (Q_stricmp (cmd, "god") == 0)
                    934:                Cmd_God_f (ent);
                    935:        else if (Q_stricmp (cmd, "notarget") == 0)
                    936:                Cmd_Notarget_f (ent);
                    937:        else if (Q_stricmp (cmd, "noclip") == 0)
                    938:                Cmd_Noclip_f (ent);
                    939:        else if (Q_stricmp (cmd, "inven") == 0)
                    940:                Cmd_Inven_f (ent);
                    941:        else if (Q_stricmp (cmd, "invnext") == 0)
                    942:                SelectNextItem (ent, -1);
                    943:        else if (Q_stricmp (cmd, "invprev") == 0)
                    944:                SelectPrevItem (ent, -1);
                    945:        else if (Q_stricmp (cmd, "invnextw") == 0)
                    946:                SelectNextItem (ent, IT_WEAPON);
                    947:        else if (Q_stricmp (cmd, "invprevw") == 0)
                    948:                SelectPrevItem (ent, IT_WEAPON);
                    949:        else if (Q_stricmp (cmd, "invnextp") == 0)
                    950:                SelectNextItem (ent, IT_POWERUP);
                    951:        else if (Q_stricmp (cmd, "invprevp") == 0)
                    952:                SelectPrevItem (ent, IT_POWERUP);
                    953:        else if (Q_stricmp (cmd, "invuse") == 0)
                    954:                Cmd_InvUse_f (ent);
                    955:        else if (Q_stricmp (cmd, "invdrop") == 0)
                    956:                Cmd_InvDrop_f (ent);
                    957:        else if (Q_stricmp (cmd, "weapprev") == 0)
                    958:                Cmd_WeapPrev_f (ent);
                    959:        else if (Q_stricmp (cmd, "weapnext") == 0)
                    960:                Cmd_WeapNext_f (ent);
                    961:        else if (Q_stricmp (cmd, "weaplast") == 0)
                    962:                Cmd_WeapLast_f (ent);
                    963:        else if (Q_stricmp (cmd, "kill") == 0)
                    964:                Cmd_Kill_f (ent);
                    965:        else if (Q_stricmp (cmd, "putaway") == 0)
                    966:                Cmd_PutAway_f (ent);
                    967:        else if (Q_stricmp (cmd, "wave") == 0)
                    968:                Cmd_Wave_f (ent);
1.1.1.3 ! root      969:        else if (Q_stricmp(cmd, "playerlist") == 0)
        !           970:                Cmd_PlayerList_f(ent);
1.1       root      971:        else    // anything that doesn't match a command will be a chat
                    972:                Cmd_Say_f (ent, false, true);
                    973: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.