simply remove your old do_get, do_put, do_drop and do_give!
replace with these in act_obj.c


/***************************************************************************
 * (c) 2000 TAKA and the GHOST DANCER MUD PROJECT TEAM
 *
 * You may use this code provided you accept it's usage agreements
 *
 *  Usage agreement
 *  1) Is that you do not remove or modify this comment block.             
 *  2) You must give due credit in the help files
 *  3) You email me at a_ghost_dancer@excite.com
 *     this helps me judge what snippets are popular and i welcome
 *     any ideas and if i find them worthy i may decide to code them
 *     for GHOST and distribute them on our page.
 *  4) You must abid by all other ROM and MERC licences                    
 *  5) Finally any improvements/bugs you find or make please share them
 *     so we can continue to put out quality snippets.
 *                                                                         
 *  Last thank you to all the ROM amd MERC folks for this wounderful code  
 *  base know as ROM.                                                      
 *                                                                      
 *          The Ghost Dancer MUD Project Team and me TAKA thank you
 *          for your interest.
 *
 *          You can email me at:   
 *          TAKA                                                      
 *          a_ghost_dancer@excite.com                                      
 *
 * The following code adds the ability to get x*item, put x*item
 * drop x*item, and give x*item. The old functionality to get, put
 * drop, and give an item and/or all items and/or all.items is still
 * available.
 *
 * so	get cigar, get 2*cigar, get all, get all.cigar
 *	get cigar humidor, get all.cigar humidor, get all humidor, get 2*cigar humidor
 * same type of functionality is now in put, give, and drop.
 * 
 * This idea is from a few of the Ghost Dancer MUD staff PYROX and AZASH
 * drop on in and pay us a visit if you like
 * 209.84.132.85 port 3333 
 *                                                                         
 ***************************************************************************/
void do_get( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
	char rest[MAX_INPUT_LENGTH];/**/
	OBJ_DATA *obj;
    OBJ_DATA *obj_next;
    OBJ_DATA *container;
    bool found;
	int number, i = 0;/**/

    number = mult_argument(argument,rest);/**/
	strcpy(argument, rest);
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if (!str_cmp(arg2,"from"))
	argument = one_argument(rest,arg2);

    /* Get type. */
    if ( arg1[0] == '\0' )
    {
		send_to_char( "Get what?\n\r", ch );
		return;
    }

    if ((number < 1) || (number > 64 ))
    {
        send_to_char( "Number must be between 1 and 64.\n\r", ch );
		return;
    }

    if ( arg2[0] == '\0' )
    {
		if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 )
			&& (number == 1) )
		{
		    /* 'get obj' */
		    obj = get_obj_list( ch, arg1, ch->in_room->contents );
			if ( obj == NULL )
			{
			act( "I see no $T here.", ch, NULL, arg1, TO_CHAR );
			return;
			}

		    get_obj( ch, obj, NULL );
		}
		else if ( str_cmp( arg1, "all" )
			&& str_prefix( "all.", arg1 )
			&& (number >= 2) )
		{
			found = FALSE;
		    for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
			{
			obj_next = obj->next_content;
			if ( is_name( &arg1[0], obj->name ) && can_see_obj( ch, obj ) )
			{
				found = TRUE;
				get_obj( ch, obj, NULL );
				i++;
				if (i >= number)
					return;
			}
	    }

	    if ( !found )
	    {
			if ( arg1[3] == '\0' )
			    send_to_char( "I see nothing here.\n\r", ch );
			else
			    act( "I see no $T here.", ch, NULL, &arg1[0], TO_CHAR );
	    }

	}
	else
	{
	    /* 'get all' or 'get all.obj' */
	    found = FALSE;
	    for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
	    {
		obj_next = obj->next_content;
		if ( ( arg1[3] == '\0' || is_name( &arg1[4], obj->name ) )
		&&   can_see_obj( ch, obj ) )
		{
		    found = TRUE;
		    get_obj( ch, obj, NULL );
		}
	    }

	    if ( !found )
	    {
		if ( arg1[3] == '\0' )
		    send_to_char( "I see nothing here.\n\r", ch );
		else
		    act( "I see no $T here.", ch, NULL, &arg1[4], TO_CHAR );
	    }
	}
    }
    else
    {
	/* 'get ... container' */
	if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
	{
	    send_to_char( "You can't do that.\n\r", ch );
	    return;
	}

	if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
	{
	    act( "I see no $T here.", ch, NULL, arg2, TO_CHAR );
	    return;
	}

	switch ( container->item_type )
	{
	default:
	    send_to_char( "That's not a container.\n\r", ch );
	    return;

	case ITEM_CONTAINER:
	case ITEM_CORPSE_NPC:
	    break;

	case ITEM_CORPSE_PC:
	    {

		if (!can_loot(ch,container))
		{
		    send_to_char( "You can't do that.\n\r", ch );
		    return;
		}
	    }
	}

	if ( IS_SET(container->value[1], CONT_CLOSED) )
	{
	    act( "The $d is closed.", ch, NULL, container->name, TO_CHAR );
	    return;
	}

	if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 )
			&& (number == 1) )
	{
	    /* 'get obj container' */
	    obj = get_obj_list( ch, arg1, container->contains );
	    if ( obj == NULL )
	    {
		act( "I see nothing like that in the $T.",
		    ch, NULL, arg2, TO_CHAR );
		return;
	    }
	    get_obj( ch, obj, container );
	}
	else if ( str_cmp( arg1, "all" )
		&& str_prefix( "all.", arg1 )
		&& (number >= 2) )
	{
		found = FALSE;
	    for ( obj = container->contains; obj != NULL; obj = obj_next )
		{
		obj_next = obj->next_content;
		if ( is_name( &arg1[0], obj->name ) && can_see_obj( ch, obj ) )
		{
			found = TRUE;
			get_obj( ch, obj, container );
			i++;
			if (i >= number)
				return;
		}
	   }

	   if ( !found )
	   {
		if ( arg1[3] == '\0' )
		    act( "I see nothing in the $T.",
			ch, NULL, arg2, TO_CHAR );
		else
		    act( "I see nothing like that in the $T.",
			ch, NULL, arg2, TO_CHAR );
	   }

	}
	else
	{
	    /* 'get all container' or 'get all.obj container' */
	    found = FALSE;
	    for ( obj = container->contains; obj != NULL; obj = obj_next )
	    {
		obj_next = obj->next_content;
		if ( ( arg1[3] == '\0' || is_name( &arg1[4], obj->name ) )
		&&   can_see_obj( ch, obj ) )
		{
		    found = TRUE;
		    if (container->pIndexData->vnum == OBJ_VNUM_PIT
		    &&  !IS_IMMORTAL(ch))
		    {
			send_to_char("Don't be so greedy!\n\r",ch);
			return;
		    }
		    get_obj( ch, obj, container );
		}
	    }

	    if ( !found )
	    {
		if ( arg1[3] == '\0' )
		    act( "I see nothing in the $T.",
			ch, NULL, arg2, TO_CHAR );
		else
		    act( "I see nothing like that in the $T.",
			ch, NULL, arg2, TO_CHAR );
	    }
	}
    }

    return;
}

void do_put( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char rest[MAX_INPUT_LENGTH];
    OBJ_DATA *container;
    OBJ_DATA *obj;
    OBJ_DATA *obj_next;
	int number, i = 0;/**/

    number = mult_argument(argument,rest);/**/
	strcpy(argument, rest);
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if (!str_cmp(arg2,"in") || !str_cmp(arg2,"on"))
	argument = one_argument(argument,arg2);

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Put what in what?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "all" ) || !str_prefix( "all.", arg2 ) )
    {
	send_to_char( "You can't do that.\n\r", ch );
	return;
    }

    if ( ( container = get_obj_here( ch, arg2 ) ) == NULL )
    {
	act( "I see no $T here.", ch, NULL, arg2, TO_CHAR );
	return;
    }

    if ( container->item_type != ITEM_CONTAINER )
    {
	send_to_char( "That's not a container.\n\r", ch );
	return;
    }

    if ( IS_SET(container->value[1], CONT_CLOSED) )
    {
	act( "The $d is closed.", ch, NULL, container->name, TO_CHAR );
	return;
    }

    if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 )
		&& (number == 1) )
    {
		/* 'put obj container' */
		if ( ( obj = get_obj_carry( ch, arg1, ch ) ) == NULL )
		{
		    send_to_char( "You do not have that item.\n\r", ch );
			return;
		}

		if ( obj == container )
		{
		    send_to_char( "You can't fold it into itself.\n\r", ch );
			return;
		}

		if ( !can_drop_obj( ch, obj ) )
		{
		    send_to_char( "You can't let go of it.\n\r", ch );
			return;
		}

    	if (WEIGHT_MULT(obj) != 100)
    	{
           send_to_char("You have a feeling that would be a bad idea.\n\r",ch);
           return;
        }

		if (get_obj_weight( obj ) + get_true_weight( container )
		     > (container->value[0] * 10)
			||  get_obj_weight(obj) > (container->value[3] * 10))
		{
			send_to_char( "It won't fit.\n\r", ch );
		    return;
		}

		if (container->pIndexData->vnum == OBJ_VNUM_PIT
			&& !CAN_WEAR(container,ITEM_TAKE))
		{
			if (obj->timer)
				SET_BIT(obj->extra_flags,ITEM_HAD_TIMER);
		    else
		        obj->timer = number_range(100,200);
		}

		obj_from_char( obj );
		obj_to_obj( obj, container );

		if (IS_SET(container->value[1],CONT_PUT_ON))
		{
		    act("$n puts $p on $P.",ch,obj,container, TO_ROOM);
		    act("You put $p on $P.",ch,obj,container, TO_CHAR);
		}
		else
		{
			act( "$n puts $p in $P.", ch, obj, container, TO_ROOM );
		    act( "You put $p in $P.", ch, obj, container, TO_CHAR );
		}
    }

    else if ( str_cmp( arg1, "all" ) && str_prefix( "all.", arg1 )
		&& (number >= 2) )
    {
		/* 'put all container' or 'put all.obj container' */
		for ( obj = ch->carrying; obj != NULL; obj = obj_next )
		{
		    obj_next = obj->next_content;

		    if ( ( is_name( &arg1[0], obj->name ) )
				&& can_see_obj( ch, obj )
				&& WEIGHT_MULT(obj) == 100
				&& obj->wear_loc == WEAR_NONE
				&& obj != container
			    && can_drop_obj( ch, obj )
				&& get_obj_weight( obj ) + get_true_weight( container )
					<= (container->value[0] * 10)
			    && get_obj_weight(obj) < (container->value[3] * 10))
		    {
				if (container->pIndexData->vnum == OBJ_VNUM_PIT
	    			&& !CAN_WEAR(obj, ITEM_TAKE) )
	    		{
			 	    if (obj->timer)
						SET_BIT(obj->extra_flags,ITEM_HAD_TIMER);
				    else
	    		    	obj->timer = number_range(100,200);
				}

				obj_from_char( obj );
				obj_to_obj( obj, container );
				i++;
	        	if (IS_SET(container->value[1],CONT_PUT_ON))
		    	{
		    	    act("$n puts $p on $P.",ch,obj,container, TO_ROOM);
				    act("You put $p on $P.",ch,obj,container, TO_CHAR);
		    	}
				else
				{
				    act( "$n puts $p in $P.", ch, obj, container, TO_ROOM );
				    act( "You put $p in $P.", ch, obj, container, TO_CHAR );
				}

				if (i >= number)
					return;
		    }
		}
		return;
	}
    else
    {
	/* 'put all container' or 'put all.obj container' */
	for ( obj = ch->carrying; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_content;

	    if ( ( arg1[3] == '\0' || is_name( &arg1[4], obj->name ) )
	    &&   can_see_obj( ch, obj )
	    &&   WEIGHT_MULT(obj) == 100
	    &&   obj->wear_loc == WEAR_NONE
	    &&   obj != container
	    &&   can_drop_obj( ch, obj )
	    &&   get_obj_weight( obj ) + get_true_weight( container )
		 <= (container->value[0] * 10)
	    &&   get_obj_weight(obj) < (container->value[3] * 10))
	    {
	    	if (container->pIndexData->vnum == OBJ_VNUM_PIT
	    	&&  !CAN_WEAR(obj, ITEM_TAKE) )
	    	{
	    	    if (obj->timer)
					SET_BIT(obj->extra_flags,ITEM_HAD_TIMER);
	    	    else
	    	    	obj->timer = number_range(100,200);
			}

			obj_from_char( obj );
			obj_to_obj( obj, container );

        	if (IS_SET(container->value[1],CONT_PUT_ON))
        	{
            	    act("$n puts $p on $P.",ch,obj,container, TO_ROOM);
            	    act("You put $p on $P.",ch,obj,container, TO_CHAR);
        	}
		else
		{
		    act( "$n puts $p in $P.", ch, obj, container, TO_ROOM );
		    act( "You put $p in $P.", ch, obj, container, TO_CHAR );
		}
	    }
	}
    }

    return;
}



void do_drop( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char rest[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
    OBJ_DATA *obj_next;
    bool found;
	int number, i = 0;/**/

    number = mult_argument(argument,rest);/**/
	strcpy(argument, rest);
    argument = one_argument( argument, arg );

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

    if ( is_number( arg ) )
    {
	/* 'drop NNNN coins' */
	int amount, gold = 0, silver = 0;

	amount   = atoi(arg);
	argument = one_argument( argument, arg );
	if ( amount <= 0
	|| ( str_cmp( arg, "coins" ) && str_cmp( arg, "coin" ) &&
	     str_cmp( arg, "gold"  ) && str_cmp( arg, "silver") ) )
	{
	    send_to_char( "Sorry, you can't do that.\n\r", ch );
	    return;
	}

	if ( !str_cmp( arg, "coins") || !str_cmp(arg,"coin")
	||   !str_cmp( arg, "silver"))
	{
	    if (ch->silver < amount)
	    {
		send_to_char("You don't have that much silver.\n\r",ch);
		return;
	    }

	    ch->silver -= amount;
	    silver = amount;
	}

	else
	{
	    if (ch->gold < amount)
	    {
		send_to_char("You don't have that much gold.\n\r",ch);
		return;
	    }

	    ch->gold -= amount;
  	    gold = amount;
	}

	for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_content;

	    switch ( obj->pIndexData->vnum )
	    {
	    case OBJ_VNUM_SILVER_ONE:
		silver += 1;
		extract_obj(obj);
		break;

	    case OBJ_VNUM_GOLD_ONE:
		gold += 1;
		extract_obj( obj );
		break;

	    case OBJ_VNUM_SILVER_SOME:
		silver += obj->value[0];
		extract_obj(obj);
		break;

	    case OBJ_VNUM_GOLD_SOME:
		gold += obj->value[1];
		extract_obj( obj );
		break;

	    case OBJ_VNUM_COINS:
		silver += obj->value[0];
		gold += obj->value[1];
		extract_obj(obj);
		break;
	    }
	}

	obj_to_room( create_money( gold, silver ), ch->in_room );
	act( "$n drops some coins.", ch, NULL, NULL, TO_ROOM );
	send_to_char( "OK.\n\r", ch );
	return;
    }

    if ( str_cmp( arg, "all" ) && str_prefix( "all.", arg )
		&& (number == 1) )
    {
	/* 'drop obj' */
	if ( ( obj = get_obj_carry( ch, arg, ch ) ) == NULL )
	{
	    send_to_char( "You do not have that item.\n\r", ch );
	    return;
	}

	if ( !can_drop_obj( ch, obj ) )
	{
	    send_to_char( "You can't let go of it.\n\r", ch );
	    return;
	}

	obj_from_char( obj );
	obj_to_room( obj, ch->in_room );
	act( "$n drops $p.", ch, obj, NULL, TO_ROOM );
	act( "You drop $p.", ch, obj, NULL, TO_CHAR );
	if (IS_OBJ_STAT(obj,ITEM_MELT_DROP))
	{
	    act("$p dissolves into smoke.",ch,obj,NULL,TO_ROOM);
	    act("$p dissolves into smoke.",ch,obj,NULL,TO_CHAR);
	    extract_obj(obj);
	}
    }
	else if ( str_cmp( arg, "all" ) && str_prefix( "all.", arg )
		&& (number >= 2) )
    {
		/* 'drop all' or 'drop all.obj' */
		found = FALSE;
		for ( obj = ch->carrying; obj != NULL; obj = obj_next )
		{
			obj_next = obj->next_content;

		    if ( ( is_name( &arg[0], obj->name ) )
			    &&   can_see_obj( ch, obj )
				&&   obj->wear_loc == WEAR_NONE
			    &&   can_drop_obj( ch, obj ) )
			{
				found = TRUE;
				obj_from_char( obj );
				obj_to_room( obj, ch->in_room );
				act( "$n drops $p.", ch, obj, NULL, TO_ROOM );
				act( "You drop $p.", ch, obj, NULL, TO_CHAR );

				if (IS_OBJ_STAT(obj,ITEM_MELT_DROP))
	        	{
             	    act("$p dissolves into smoke.",ch,obj,NULL,TO_ROOM);
            	    act("$p dissolves into smoke.",ch,obj,NULL,TO_CHAR);
					extract_obj(obj);
				}

				i++;

				if (i >= number)
					return;

			}
		}

		if ( !found )
		{
			if ( arg[3] == '\0' )
				act( "You are not carrying anything.",ch, NULL, arg, TO_CHAR );
			else
				act( "You are not carrying any $T.",ch, NULL, &arg[4], TO_CHAR );
		}
    }
    else
    {
	/* 'drop all' or 'drop all.obj' */
	found = FALSE;
	for ( obj = ch->carrying; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_content;

	    if ( ( arg[3] == '\0' || is_name( &arg[4], obj->name ) )
	    &&   can_see_obj( ch, obj )
	    &&   obj->wear_loc == WEAR_NONE
	    &&   can_drop_obj( ch, obj ) )
	    {
		found = TRUE;
		obj_from_char( obj );
		obj_to_room( obj, ch->in_room );
		act( "$n drops $p.", ch, obj, NULL, TO_ROOM );
		act( "You drop $p.", ch, obj, NULL, TO_CHAR );
        	if (IS_OBJ_STAT(obj,ITEM_MELT_DROP))
        	{
             	    act("$p dissolves into smoke.",ch,obj,NULL,TO_ROOM);
            	    act("$p dissolves into smoke.",ch,obj,NULL,TO_CHAR);
            	    extract_obj(obj);
        	}
	    }
	}

	if ( !found )
	{
	    if ( arg[3] == '\0' )
		act( "You are not carrying anything.",
		    ch, NULL, arg, TO_CHAR );
	    else
		act( "You are not carrying any $T.",
		    ch, NULL, &arg[4], TO_CHAR );
	}
    }

    return;
}



void do_give( CHAR_DATA *ch, char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char rest[MAX_INPUT_LENGTH];
	char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA  *obj;
	int number, i = 0;/**/

    number = mult_argument(argument,rest);/**/
	strcpy(argument, rest);
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Give what to whom?\n\r", ch );
	return;
    }

    if ( is_number( arg1 ) )
    {
		/* 'give NNNN coins victim' */
		int amount;
		bool silver;

		amount   = atoi(arg1);
		if ( amount <= 0
		|| ( str_cmp( arg2, "coins" ) && str_cmp( arg2, "coin" ) &&
		     str_cmp( arg2, "gold"  ) && str_cmp( arg2, "silver")) )
		{
		    send_to_char( "Sorry, you can't do that.\n\r", ch );
		    return;
		}

		silver = str_cmp(arg2,"gold");

		argument = one_argument( argument, arg2 );
		if ( arg2[0] == '\0' )
		{
			send_to_char( "Give what to whom?\n\r", ch );
		    return;
		}

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

		if ( (!silver && ch->gold < amount) || (silver && ch->silver < amount) )
		{
			send_to_char( "You haven't got that much.\n\r", ch );
		    return;
		}

		if (silver)
		{
		    ch->silver		-= amount;
		    victim->silver 	+= amount;
		}
		else
		{
			ch->gold		-= amount;
		    victim->gold	+= amount;
		}

		sprintf(buf,"$n gives you %d %s.",amount, silver ? "silver" : "gold");
		act( buf, ch, NULL, victim, TO_VICT    );
		act( "$n gives $N some coins.",  ch, NULL, victim, TO_NOTVICT );
		sprintf(buf,"You give $N %d %s.",amount, silver ? "silver" : "gold");
		act( buf, ch, NULL, victim, TO_CHAR    );

		if (IS_NPC(victim) && IS_SET(victim->act,ACT_IS_CHANGER))
		{
			int change;

			change = (silver ? 95 * amount / 100 / 100
		 	     : 95 * amount);


		    if (!silver && change > victim->silver)
		    	victim->silver += change;

			if (silver && change > victim->gold)
				victim->gold += change;

		    if (change < 1 && can_see(victim,ch))
		    {
				act("$n tells you 'I'm sorry, you did not give me enough to change.'"
				    ,victim,NULL,ch,TO_VICT);
				ch->reply = victim;
				sprintf(buf,"%d %s %s",
				amount, silver ? "silver" : "gold",ch->name);
				do_give(victim,buf);
		    }
		    else if (can_see(victim,ch))
		    {
				sprintf(buf,"%d %s %s",
				change, silver ? "gold" : "silver",ch->name);
				do_give(victim,buf);
				if (silver)
				{
				    sprintf(buf,"%d silver %s",
						(95 * amount / 100 - change * 100),ch->name);
				    do_give(victim,buf);
				}
				act("$n tells you 'Thank you, come again.'",
				    victim,NULL,ch,TO_VICT);
				ch->reply = victim;
			}
		}
		/*
		 * Bribe trigger   -------REMOVED TAKA     to compile once-----------
		 */
		if ( IS_NPC(victim) && HAS_TRIGGER( victim, TRIG_BRIBE ) )
			mp_bribe_trigger( victim, ch, silver ? amount : amount * 100 );

		return;
    }

    if ( ( obj = get_obj_carry( ch, arg1, ch ) ) == NULL )
    {
	send_to_char( "You do not have that item.\n\r", ch );
	return;
    }
	/*
	 * Bribe trigger   -------REMOVED TAKA     to compile once-----------
	 */

    if ( obj->wear_loc != WEAR_NONE )
    {
	send_to_char( "You must remove it first.\n\r", ch );
	return;
    }

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

    if (IS_NPC(victim) && victim->pIndexData->pShop != NULL)
    {
	act("$N tells you 'Sorry, you'll have to sell that.'",
	    ch,NULL,victim,TO_CHAR);
	ch->reply = victim;
	return;
    }

    if ( !can_drop_obj( ch, obj ) )
    {
	send_to_char( "You can't let go of it.\n\r", ch );
	return;
    }

    if ( victim->carry_number + get_obj_number( obj ) > can_carry_n( victim ) )
    {
	act( "$N has $S hands full.", ch, NULL, victim, TO_CHAR );
	return;
    }

    if (get_carry_weight(victim) + get_obj_weight(obj) > can_carry_w( victim ) )
    {
	act( "$N can't carry that much weight.", ch, NULL, victim, TO_CHAR );
	return;
    }

    if ( !can_see_obj( victim, obj ) )
    {
	act( "$N can't see it.", ch, NULL, victim, TO_CHAR );
	return;
    }

	if (number == 1)
	{
		obj_from_char( obj );
		obj_to_char( obj, victim );
		MOBtrigger = FALSE;
		act( "$n gives $p to $N.", ch, obj, victim, TO_NOTVICT );
		act( "$n gives you $p.",   ch, obj, victim, TO_VICT    );
		act( "You give $p to $N.", ch, obj, victim, TO_CHAR    );
		MOBtrigger = TRUE;
	}
	else
	{
		for (;;)
		{
		obj_from_char( obj );
		obj_to_char( obj, victim );
		i++;

		if (i >= number)
		{
			MOBtrigger = FALSE;
			act( "$n gives some $p to $N.", ch, obj, victim, TO_NOTVICT );
			act( "$n gives you some $p.",   ch, obj, victim, TO_VICT    );
			act( "You give some $p to $N.", ch, obj, victim, TO_CHAR    );
			MOBtrigger = TRUE;
			return;
		}

		if ( ( obj = get_obj_carry( ch, arg1, ch ) ) == NULL )
	    {
			send_to_char( "You do not have that item.\n\r", ch );
			MOBtrigger = FALSE;
			act( "$n gives somr $p to $N.", ch, obj, victim, TO_NOTVICT );
		    act( "$n gives you some $p.",   ch, obj, victim, TO_VICT    );
			act( "You give some $p to $N.", ch, obj, victim, TO_CHAR    );
			MOBtrigger = TRUE;
			return;
		}
		}
	}

	/*
	 * Give trigger
	 */
	if ( IS_NPC(victim) && HAS_TRIGGER( victim, TRIG_GIVE ) )
		mp_give_trigger( victim, ch, obj );

    return;
}

/* 
 * end of TAKA mods
 */