For awhile something had bugged me concerning timers. I often use timers for commands or skills to
represent an ongoing action the player was doing. Like say casting a spell or doing situps. I always
wanted a way for players in the room to look and see a player doing those actions even without constant
echoes et cetera.

Example:

Bob the Button Masher stands here chanting something from his spell book!
or
John the Jumping Kick stands here stretching out.

I coded up a simple way to handle this that is pretty simply to install without any major coding knowledge and adds that extra spice I was looking for myself.

(Step 1)
First off, look for "timer_data" in mud.h. It should look something like this:
struct timer_data
{
    TIMER  *    prev;
    TIMER  *    next;
    DO_FUN *    do_fun;
    int         value;
    sh_int      type;
    int         count;
};

Right below "count" add:
    char   *    desc;

(Step 2)
Now search for the function "add_timer" in mud.h and it should look like this:
void    add_timer       args( ( CHAR_DATA *ch, sh_int type, sh_int count, DO_FUN *fun, int value) );

We want to now change it to look like this:
void    add_timer       args( ( CHAR_DATA *ch, sh_int type, sh_int count, DO_FUN *fun, int value, char *desc ) );

(Step 3)
Now we are done with mud.h. I suggest doing make clean and compiling. All references of add_timer need to get a desc value. If you don't want it to display anything special simply make it NULL. 
Here are examples:
(With desc message)
add_timer(ch, TIMER_DO_FUN, 3, do_situp, 1, " doing situps.");
(Without desc message)
add_timer(ch, TIMER_DO_FUN, 3, do_situp, 1, NULL);

Make sure to either use NULL or something in quotes and not empty quotes( ie "").

(Step 4)
Now for the thing that truly makes it magic. Lets go to act_info.c
In the function " show_char_to_char_0" add the varriables:
    TIMER *time = NULL;
    char tdesc[MAX_STRING_LENGTH];
Then look further down the function for the switch with the victim's position.
The three cases we are interested in are POS_RESTING, POS_SITTING and POS_STANDING. If you
want to add more cases it will be apparent how to do so but I felt those three were the only ones needed.

    case POS_RESTING:
        if (ch->position == POS_RESTING)
            strcat ( buf, " is sprawled out alongside you" );
        else
        if (ch->position == POS_MOUNTED)
            strcat ( buf, " is sprawled out at the foot of your mount" );
        else
            strcat (buf, " is sprawled out here" );
	// Timers display a special message to players - Gatz (Nick Jaross)
        time = get_timerptr(victim, TIMER_DO_FUN);
        if(time && time->desc)
                sprintf(tdesc, "%s", time->desc);
        else
                sprintf(tdesc, ".");
        strcat(buf, tdesc);
        break;
    case POS_SITTING:
        if (ch->position == POS_SITTING)
            strcat( buf, " sits here with you" );
        else
        if (ch->position == POS_RESTING)
            strcat( buf, " sits nearby as you lie around" );
        else
            strcat( buf, " sits upright here" );
	// Timers display a special message to players - Gatz (Nick Jaross)
        time = get_timerptr(victim, TIMER_DO_FUN);
        if(time && time->desc)
                sprintf(tdesc, "%s", time->desc);
        else
                sprintf(tdesc, ".");
        strcat(buf, tdesc);
        break;
    case POS_STANDING:
        if ( IS_IMMORTAL(victim) )
            strcat( buf, " is here before you" );
        else
        if ( ( victim->in_room->sector_type == SECT_UNDERWATER )
        && !IS_AFFECTED(victim, AFF_AQUA_BREATH) && !IS_NPC(victim) )
            strcat( buf, " is drowning here" );
        else
        if ( victim->in_room->sector_type == SECT_UNDERWATER )
            strcat( buf, " is here in the water" );
        else
        if ( ( victim->in_room->sector_type == SECT_OCEANFLOOR )
        && !IS_AFFECTED(victim, AFF_AQUA_BREATH) && !IS_NPC(victim) )
            strcat( buf, " is drowning here" );
        else
        if ( victim->in_room->sector_type == SECT_OCEANFLOOR )
            strcat( buf, " is standing here in the water" );
        else
        if ( IS_AFFECTED(victim, AFF_FLOATING)
        || IS_AFFECTED(victim, AFF_FLYING) )
          strcat( buf, " is hovering here" );
        else
          strcat( buf, " is standing here" );
	// Timers display a special message to players - Gatz (Nick Jaross)
        time = get_timerptr(victim, TIMER_DO_FUN);
        if(time && time->desc)
                sprintf(tdesc, "%s", time->desc);
        else
                sprintf(tdesc, ".");
        strcat(buf, tdesc);
        break;

Besides the small snippet of coding to strcat tdesc, setting tdesc before, to buf I simply removed the punctuation from the strings before.

Make clean and compile, it should work cleanly. I have this installed in a SMAUG FUSS 1.5 with no errors. You can use or modifiy this code to fit your needs however I simply ask you leave my comment there and give me credit. You can add more comments in if you feel needed.
(Congratulations, you finished all the steps!)

If this snippet isn't working for you then double check that you didn't skip any of the steps. If you have any questions pertaining to this specific snippet then e-mail me at h_b_k316@hotmail.com and I hope you enjoy this snippet.