/*
* This code is was written for Dark Hope MUD by Theodryck
* Copyright 2009. You may freely use and distribute this
* code as long as the documentation remains unaltered.
*
* To install into your code simply copy the entire
* snippet and paste into the end of your act_wiz.c file,
* set DECLARE_DO_FUN( do otype ) in merc.h and add the
* command table in interp.c. That should be all you need.
*/
/*
* Code that searches for an item based on wear type using
* struct wear_flags as a guide (arms, wield, legs, etc). This
* is mainly for builders who are looking for eq consistancy.
* --Theo
*/
void do_otype( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
OBJ_INDEX_DATA *pObjIndex;
AREA_DATA *pArea;
char buf [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
char arg1 [ MAX_INPUT_LENGTH ];
char type [ MAX_STRING_LENGTH ];
extern int top_vnum_obj;
int vnum;
int bottom;
int top;
int count = 0;
bool fWorld;
bool found;
rch = get_char( ch );
type[0] = '\0';
pArea = ch->in_room->area;
if ( !authorized( rch, "otype" ) )
return;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg1 );
if ( arg[0] == '\0' ||
( str_cmp( arg, "world" ) && str_cmp( arg, "area" ) ) )
{
send_to_char( "Syntax: otype world <object type>\n\r", ch );
send_to_char( "or: otype area <object type>\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Otype what?\n\r", ch );
return;
}
found = FALSE;
fWorld = !str_cmp( arg, "world" );
/* To keep silly people from intentionally causing a buffer overflow */
if( ( !str_cmp( arg1, "take" )
|| !str_cmp( arg1, "wield" )
|| !str_cmp( arg1, "hold" ) )
&& ( fWorld ) )
{
send_to_char( "Don't be silly. That'll cause an overflow.\n\r", ch );
return;
}
/*
* Since all wearable eq has a "take" flag, let's add it arg1
* so we don't have to type it every single time.
*/
strcat( type, "take " );
strcat( type, arg1 );
if ( fWorld )
{
bottom = 0;
top = top_vnum_obj;
}
else
{
bottom = pArea->low_o_vnum;
top = pArea->hi_o_vnum + 1;
}
for ( vnum = bottom; vnum < top; vnum++ )
{
if ( !( pObjIndex = get_obj_index( vnum ) ) )
continue;
if ( !fWorld && pArea != pObjIndex->area )
continue;
if ( !str_cmp( type, flag_string( wear_flags, pObjIndex->wear_flags ) ) )
{
found = TRUE;
count++;
/*
* OK. We've found an item of the type we are looking for.
* Now we'll display it with some formatting and include the
* area name that the object is located
*/
sprintf( buf, "{o{w[%5d]{x%-45s %-30s\n\r",
pObjIndex->vnum, capitalize( pObjIndex->name ), pObjIndex->area->name );
send_to_char( buf, ch );
}
}
if ( !found )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch);
return;
}
sprintf( buf, "{xYou found %d total items of type %s.\n\r", count, arg1 );
send_to_char( buf, ch );
return;
}