//credits to the guy who wrote snoop btw -orlis
//interp.h:
	DECLARE_DO_FUN(	do_mimic	);

//interp.c:
    	{ "mimic",		do_mimic,	POS_DEAD,	L4,  1,  LOG_ALWAYS, 1 },

	//make the part after(and including) this(the end of void interpret(), 
	//its also the second and last occurence in the file ):
    /*
     * Dispatch the command.
     */

	//look like this:
    /*
     * Dispatch the command.
     */
	if ( ch->desc != NULL 
		&& ch->desc->mimic_by != NULL 
		&& cmd_table[cmd].do_fun != do_delete
		&& cmd_table[cmd].level < LEVEL_IMMORTAL )
		ptc(ch->desc->mimic_by->character,"{!You are mimic-ing {#%s{! doing {5[{x%s{5] {x%s{x\n\r",ch->name,cmd_table[cmd].name, argument[0] != '\0' ? argument : "" );

	(*cmd_table[cmd].do_fun) ( ch, argument );

	if ( ch->desc != NULL 
		&& ch->desc->mimic_by != NULL 
		&& cmd_table[cmd].do_fun != do_delete
		&& cmd_table[cmd].level < LEVEL_IMMORTAL )
		(*cmd_table[cmd].do_fun) ( ch->desc->mimic_by->character, argument );

    tail_chain( );
    return;
}


//merc.h in descriptor_data:
	DESCRIPTOR_DATA *	mimic_by;

/*act_wiz.c
(after do_snoop because i pretty much copied and 
pasted the entire thing, so credits to him lol, btw protect 
will also do this, i changed the sent_to_chars() to say 
that, perhaps you should do the same):
*/
void do_mimic( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;
    char buf[MAX_STRING_LENGTH];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Mimic whom?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim->desc == NULL )
    {
	send_to_char( "No descriptor to mimic.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
		send_to_char( "Cancelling all mimics.\n\r", ch );
		if (!IS_TRUSTED(ch,IMPLEMENTOR))
		{
			wiznet("$N stops being such a copy-cat.",
			ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));
		}
		for ( d = descriptor_list; d != NULL; d = d->next )
		{
			if ( d->mimic_by == ch->desc )
				d->mimic_by = NULL;
		}
		return;
    }

    if ( victim->desc->mimic_by != NULL )
    {
		send_to_char( "Busy already.\n\r", ch );
		return;
    }

    if (!is_room_owner(ch,victim->in_room) && ch->in_room != victim->in_room 
    &&  room_is_private(ch,victim->in_room) && !IS_TRUSTED(ch,IMPLEMENTOR))
    {
        send_to_char("That character is in a private room.\n\r",ch);
        return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) 
    || ( IS_SET(&victim->comm,COMM_SNOOP_PROOF) && !IS_TRUSTED(ch,IMPLEMENTOR)))
    {
		send_to_char( "You failed.\n\r", ch );
		return;
    }

    if ( ch->desc != NULL )
    {
	for ( d = ch->desc->mimic_by; d != NULL; d = d->mimic_by )
	{
	    if ( d->character == victim || d->original == victim )
	    {
		send_to_char( "No mimic loops.\n\r", ch );
		return;
	    }
	}
    }

    victim->desc->mimic_by = ch->desc;
    if (!IS_TRUSTED(ch,IMPLEMENTOR))
    {
	sprintf(buf,"$N starts mimic-ing %s",
	    (IS_NPC(ch) ? victim->short_descr : victim->name));
	wiznet(buf,ch,NULL,WIZ_SNOOPS,WIZ_SECURE,get_trust(ch));
    }
    send_to_char( "Ok.\n\r", ch );
    return;
}