(act_comm.c) ---void talk_channel before: actoverride = FALSE; add: if ( channel != CHANNEL_GLOSOCIAL && channel != CHANNEL_SCOUTER ) { CHAN_HISTORY_DATA *history; CREATE( history, CHAN_HISTORY_DATA, 1 ); history->channel = channel; history->player = STRALLOC( ch->name ); history->verb = str_dup( verb ); history->text = STRALLOC( argument ); if ( IS_NPC(ch) ) history->invis_level = 0; else if ( xIS_SET(ch->act, PLR_WIZINVIS) ) history->invis_level = ch->pcdata->wizinvis; else if ( IS_AFFECTED(ch,AFF_INVISIBLE) ) history->invis_level = LEVEL_IMMORTAL-1; else history->invis_level = 0; history->race = ch->race; if ( (channel == CHANNEL_CLAN || channel == CHANNEL_ALLY) && !IS_NPC(ch) ) history->clan = ch->pcdata->clan; else history->clan = NULL; LINK( history, first_history, last_history, next, prev ); } void do_history( CHAR_DATA *ch, char *argument ) { CHAN_HISTORY_DATA *history, *history_prev; char arg[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int channel, count, count2, num; if ( !str_cmp(argument,"syntax") ) { stc( "&YSyntax&w: history \n\r", ch ); stc( " history \n\r", ch ); stc( "\n\rAvailable Channel Names:\n\r", ch ); stc( " newbie, music, ask, answer, swear, ooc, rp, glosocial, clan,\n\r", ch ); stc( " ally, wartalk, racetalk", ch ); if ( get_trust(ch) >= LEVEL_IMMORTAL ) { if ( get_trust(ch) >= 62 ) stc( ", admin", ch ); if ( get_trust(ch) >= 62 ) stc( ", supervisor", ch ); stc( ", immtalk", ch ); } stc( "\n\r", ch ); return; } argument = one_argument(argument,arg); argument = one_argument(argument,arg2); num = 25; if ( arg[0] == '\0' ) channel = -1; else if ( !str_cmp( arg, "immtalk" ) ) channel = CHANNEL_IMMTALK; else if ( !str_cmp( arg, "admin" ) ) channel = CHANNEL_ADMIN; else if ( !str_cmp( arg, "supervisor" ) ) channel = CHANNEL_SUPERVISOR; else if ( !str_cmp( arg, "newbie" ) ) channel = CHANNEL_NEWBIE; else if ( !str_cmp( arg, "music" ) ) channel = CHANNEL_MUSIC; else if ( !str_cmp( arg, "ask" ) ) channel = CHANNEL_ASK; else if ( !str_cmp( arg, "answer" ) ) channel = CHANNEL_ANSWER; else if ( !str_cmp( arg, "swear" ) ) channel = CHANNEL_SWEAR; else if ( !str_cmp( arg, "ooc" ) ) channel = CHANNEL_OOC; else if ( !str_cmp( arg, "rp" ) ) channel = CHANNEL_RP; else if ( !str_cmp( arg, "glosocial" ) ) channel = CHANNEL_GLOSOCIAL; else if ( !str_cmp( arg, "wartalk" ) ) channel = CHANNEL_WARTALK; else if ( !str_cmp( arg, "racetalk" ) ) channel = CHANNEL_RACETALK; else if ( !str_cmp( arg, "clan" ) ) channel = CHANNEL_CLAN; else if ( !str_cmp( arg, "ally" ) ) channel = CHANNEL_ALLY; else if ( atoi(arg) > 0 ) { num = atoi(arg); channel = -1; } else { do_history( ch, "syntax" ); return; } if ( channel != -1 ) { if ( argument[0] != '\0' && atoi(arg2) > 0 ) { num = atoi(arg2); } } count = 1000; for ( history = last_history; history; history = history_prev ) { history_prev = history->prev; if ( --count <= 0 ) { UNLINK( history, first_history, last_history, next, prev ); if ( history->player ) DISPOSE( history->player ); if ( history->verb ) DISPOSE( history->verb ); if ( history->text ) DISPOSE( history->text ); if ( history->clan ) history->clan = NULL; DISPOSE( history ); } } count = 0; count2 = 0; for ( history = first_history; history; history = history->next ) { if ( history->channel == channel || channel == -1 ) { if ( history->channel == CHANNEL_RACETALK ) { if ( history->race != ch->race ) { if ( !IS_IMMORTAL(ch) ) continue; if ( argument[0] != '\0' && (get_npc_race(argument) == -1 || history->race != get_npc_race(argument)) ) continue; } } if ( history->channel == CHANNEL_CLAN ) { if ( !ch->pcdata->clan || (history->clan != ch->pcdata->clan) ) { if ( !IS_IMMORTAL(ch) ) continue; if ( argument[0] != '\0' && (get_clan(argument) == NULL || history->clan != get_clan(argument)) ) continue; } } if ( history->channel == CHANNEL_IMMTALK ) { if ( get_trust(ch) < LEVEL_IMMORTAL ) continue; } if ( history->channel == CHANNEL_ADMIN ) { if ( get_trust(ch) < 64 ) continue; } if ( history->channel == CHANNEL_SUPERVISOR ) { if ( get_trust(ch) < 60 ) continue; } if ( history->channel == CHANNEL_ALLY ) { if ( !ch->pcdata->clan || !history->clan || alliancestatus(ch->pcdata->clan,history->clan) != ALLIANCE_ALLIED ) { if ( !IS_IMMORTAL(ch) ) continue; if ( !history->clan || (argument[0] != '\0' && get_clan(argument) != NULL && alliancestatus(get_clan(argument),history$ continue; } } count2++; } } SET_BIT( ch->pcdata->flags, PCFLAG_PAGERON ); pager_printf( ch, "&GChannel History for %s&w:\n\r", channel == -1 ? "All Channels" : strupper(arg) ); for ( history = first_history; history; history = history->next ) { if ( history->channel == channel || channel == -1 ) { if ( history->channel == CHANNEL_RACETALK ) { if ( history->race != ch->race ) { if ( !IS_IMMORTAL(ch) ) continue; if ( argument[0] != '\0' && (get_npc_race(argument) == -1 || history->race != get_npc_race(argument)) ) continue; } } if ( history->channel == CHANNEL_CLAN ) { if ( !ch->pcdata->clan || (history->clan != ch->pcdata->clan) ) { if ( !IS_IMMORTAL(ch) ) continue; if ( argument[0] != '\0' && (get_clan(argument) == NULL || history->clan != get_clan(argument)) ) continue; } } if ( history->channel == CHANNEL_IMMTALK ) { if ( get_trust(ch) < LEVEL_IMMORTAL ) continue; } if ( history->channel == CHANNEL_ADMIN ) { if ( get_trust(ch) < 64 ) continue; } if ( history->channel == CHANNEL_SUPERVISOR ) { if ( get_trust(ch) < 60 ) continue; } if ( history->channel == CHANNEL_ALLY ) { if ( !ch->pcdata->clan || !history->clan || alliancestatus(ch->pcdata->clan,history->clan) != ALLIANCE_ALLIED ) { if ( !IS_IMMORTAL(ch) ) continue; if ( !history->clan || (argument[0] != '\0' && get_clan(argument) && alliancestatus(get_clan(argument),history->clan))$ continue; } } count++; if ( count > (count2-num) ) { sprintf( buf, "'%s'", history->text ); if ( history->invis_level > get_trust(ch) ) { pager_printf( ch, "&w[&W%s&w] Invis %s", strupper(history->verb), act_string(buf, NULL, ch, NULL, NULL, STRING_NONE) ); } else { pager_printf( ch, "&w[&W%s&w] %s %s", strupper(history->verb), history->player, act_string(buf, NULL, ch, NULL, NULL, $ } } } } REMOVE_BIT( ch->pcdata->flags, PCFLAG_PAGERON ); if ( count2 == 0 ) stc( "&wNo history for that channel.\n\r", ch ); return; } in mud.h: after: typedef struct skill_data SKILL_DATA; add: typedef struct chan_history_data CHAN_HISTORY_DATA; after: extern PROJECT_DATA * first_project; extern PROJECT_DATA * last_project; add: extern CHAN_HISTORY_DATA * first_history; extern CHAN_HISTORY_DATA * last_history; add where all the structs are" struct chan_history_data { CHAN_HISTORY_DATA * next; CHAN_HISTORY_DATA * prev; int channel; char * text; char * verb; char * player; int invis_level; int race; CLAN_DATA * clan; }; in db.c: after: PROJECT_DATA * first_project; PROJECT_DATA * last_project; add: CHAN_HISTORY_DATA * first_history; CHAN_HISTORY_DATA * last_history; as for the history command you would obviously have to edit it, i didn't feel like stripping out channels i have that other muds dont, plus i don't remember all of the original stock channels anyways, i could guess, but you can do that yourself! This will get you more than the last 8 chats, plus every channel is in the history, immortals can view em all (requires setting of race/clan to view specific chans), and takes invis/imm invis into account.