Ok I think this is everything. This is a small command to go through the pfile to show all last logins from a certain site. I found I wanted this with a few problem players it made them very easy to track. A few improvents could be made I admit. Like it totally lacks a site all command but that can be easily added if you want it and you need to search for an EXACT site rather than just a certain string. Any improvements please send them. The standard if it breaks anything I am not responsible applies. Feel free to use it if you want although it is not a proper patch I marked the lines to add with +'s. If you need help I will do what I can no promises. Also its only been tested on a Linux box no idea of how it would work on any other OS. I want no credit of any kind dont think I need or deserve any. Special thanks to George Greer && Sean Butler for their help. Enjoy! Rich DeWitt/ Boru Imp Beyond Exiled exiled@nni.com shark.dls.net 500 in db.c for (; !feof(player_fl);) { fread(&dummy, sizeof(struct char_file_u), 1, player_fl); if (!feof(player_fl)) { /* new record */ nr++; CREATE(player_table[nr].name, char, strlen(dummy.name) + 1); for (i = 0; (*(player_table[nr].name + i) = LOWER(*(dummy.name + i))); i++); + CREATE(player_table[nr].unix_name, char, strlen(dummy.unix_name) + 1); + for (i = 0; + (*(player_table[nr].unix_name + i) = LOWER(*(dummy.unix_name + i))); i++); + player_table[nr].last_logon = dummy.last_logon; + CREATE(player_table[nr].host, char, strlen(dummy.host) + 1); + for (i = 0; + (*(player_table[nr].host + i) = LOWER(*(dummy.host + i))); i++); player_table[nr].id = dummy.char_specials_saved.idnum; top_idnum = MAX(top_idnum, dummy.char_specials_saved.idnum); } } in db.h struct player_index_element { char *name; long id; + char *host; + char *unix_name; + time_t last_logon; }; in act.wizard.c ACMD(do_site) { extern struct player_index_element *player_table; long count = 0; int i; one_argument(argument, arg); buf[0] = '\0'; buf2[0] = '\0'; if (!*arg) { send_to_char("For what site do you wish to search?\r\n", ch); return; } send_to_char("Player: Time: Site:\r\n", ch); send_to_char("-------------------------------------------------------------\r\n", ch); for (i = 0;i <= top_of_p_table; i++) { if (!str_cmp(player_table[i].host, arg)) { if (player_table[i].unix_name) { sprintf(buf, "%s%s %s %s@%s\r\n", buf, player_table[i].name, asctime(localtime(&player_table[i].last_logon)), player_table[i].unix_name, player_table[i].host); count ++; } } } sprintf(buf2, "%ld Matches found.", count); strcat(buf, buf2); page_string(ch->desc, buf, 1); } in interpreter.c with the rest of the acmds add: ACMD(do_site); with the rest of the commands add: { "site" , POS_DEAD , do_site , LVL_IMPL, 0},