A while back, i had came into the problem that when mprogs on shopkeepers
created items it screwed up the do_list command, by not combining the items
correctly. Dont know if anyone else has had this problem, but i figured i
would share my fix for this. Thanks to Kender and Muerte from #rom for the
help on it. Instead of having do_list display the objects i created a second
function to do it and here it is.
void display_list_obj_keeper (CHAR_DATA *ch, CHAR_DATA *keeper)
{
char buf[MSL], name[MSL];
OBJ_DATA *obj, *obj2;
int vnum, price, count, level;
bool lstfnd, unlimited, objfnd, displayed, inlist;
struct shop_item
{
int vnum;
int total;
int price;
int level;
const char * name;
bool displayed;
bool unlimited;
struct shop_item * next_item;
};
struct shop_item *item_list = NULL;
struct shop_item *new_item;
struct shop_item *listing;
objfnd = FALSE;
displayed = FALSE;
inlist = FALSE;
/*add to list*/
for ( obj = keeper->carrying; obj != NULL; obj = obj->next_content )
{
if ((obj->wear_loc == WEAR_NONE)
&& (can_see_obj(ch, obj))
&& ((get_cost(keeper, obj, TRUE)) > 0)
&& (obj->level > 0 && obj->level < 101))
{
objfnd =TRUE;
lstfnd = FALSE;
count = 0;
level = obj->level;
vnum = obj->pIndexData->vnum;
price = get_cost(keeper, obj, TRUE);
sprintf(name,"%s", obj->short_descr);
if (IS_OBJ_STAT(obj,ITEM_INVENTORY))
unlimited = TRUE;
else
unlimited = FALSE;
for ( obj2 = keeper->carrying; obj2 != NULL; obj2 =
obj2->next_content )
{
if (vnum == obj2->pIndexData->vnum)
count++;
}
if (!inlist)
{
new_item= alloc_mem(sizeof(struct shop_item));
new_item->vnum = vnum;
new_item->total = count;
new_item->price = price;
new_item->level = level;
new_item->name = str_dup(name);
new_item->displayed = FALSE;
new_item->unlimited = unlimited;
new_item->next_item = item_list;
item_list = new_item;
inlist = TRUE;
}
else
{
for (listing = item_list; listing != NULL; listing=
listing->next_item)
{
if (vnum == listing->vnum)
lstfnd = TRUE;
}
if (!lstfnd)
{
new_item= alloc_mem(sizeof(struct shop_item));
new_item->vnum = vnum;
new_item->total = count;
new_item->price = price;
new_item->level = level;
new_item->name = str_dup(name);
new_item->displayed = FALSE;
new_item->unlimited = unlimited;
new_item->next_item = item_list;
item_list = new_item;
}
}
}
}
/*display to character*/
if (objfnd)
{
if (!displayed)
{
send_to_char( "[Lvl {YGold {WSilver{x Qty] Items being sold.\n\r",ch);
displayed = TRUE;
}
for (listing = item_list; listing != NULL; listing= listing->next_item)
{
sprintf(buf,"%s\n\r",listing->name);
if (listing->displayed == FALSE)
{
if (listing->unlimited == TRUE)
{
sprintf(buf,"[%3d {Y%5d {W%5d{x ---] %s{x\n\r",
listing->level,
(listing->price * 1/100),
(listing->price * 1 - (listing->price * 1/100) * 100),
listing->name);
}
else
{
sprintf(buf,"[%3d {Y%5d {W%5d{x %3d] %s{x\n\r",
listing->level,
(listing->price * 1/100),
(listing->price * 1 - (listing->price * 1/100) * 100),
listing->total,
listing->name);
}
listing->displayed = TRUE;
send_to_char(buf,ch);
}
}
}
/*free memory*/
if (objfnd)
{
for (listing = item_list; listing != NULL; listing= listing->next_item)
{
free_mem(listing, sizeof(listing));
}
}
/*nothing*/
if (!objfnd)
send_to_char( "You can't buy anything here.\n\r", ch );
}
Anyway, that might help someone so have fun.
-Ostoles/Richard
/*
*
* Email: [EMAIL PROTECTED]
* Alt Email: [EMAIL PROTECTED]
* ICQ: 86937973
* AIM: Ostoles
* MSN: [EMAIL PROTECTED]
*
*/