Here is a snippet, I log the num items as they enter and leave the mud, just so
I can catch repeat offenders that decide to use the auto-rent feature to avoid
this limit.
--Angus
+++ utils.c
void count_items(struct obj_data * obj, long *nitems)
{
if (obj)
{
(*nitems)++;
count_items(obj->contains, nitems);
count_items(obj->next_content, nitems);
}
}
+++ utils.h
void count_items(struct obj_data * obj, long *nitems);
+++ act.informative.c
ACMD(do_item_count)
{
struct char_data *vict;
int i;
long numitems=0;
char *buf=get_buffer(256);
skip_spaces(&argument);
if(strlen(argument)>4)
{
if(GET_LEVEL(ch)>LVL_GOD)
{
if(!(vict=get_char_vis(ch,argument)))
send_to_char("Your target isn't here, try show rent
<person>\r\n",ch);
else
{
count_items(vict->carrying,&numitems);
for(i=0;i<NUM_WEARS;i++)
count_items(GET_EQ(vict,i),&numitems);
sprintf(buf,"%s is carrying %ld items.\r\n",GET_NAME(vict),
numitems);
send_to_char(buf,ch);
}
}
else
{
send_to_char("You can only count your own items!\r\n",ch);
}
}
else
{
count_items(ch->carrying,&numitems);
for(i=0;i<NUM_WEARS;i++)
count_items(GET_EQ(ch,i),&numitems);
sprintf(buf,"You are carrying %ld items.\r\n", numitems);
send_to_char(buf,ch);
}
release_buffer(buf);
}
++act.other.c: ACMD(do_quit)
else
{
+ char *buf=get_buffer(SMALL_BUFSIZE);
+ for(i=0;i<NUM_WEARS;i++)
+ count_items(GET_EQ(ch,i),&nitems);
+ count_items(ch->carrying,&nitems);
+
+
+ if((nitems>max_obj_save)&&(!PRF_FLAGGED(ch,PRF_NOHASSLE)))
+ {
+ sprintf(buf,
+ "You cannot camp with more than %d items in your camp!\r\n"
+ "You have %ld items on your person. Time to donate some stuff!"
+ "\r\n",max_obj_save,nitems);
+ send_to_char(buf,ch);
+ }
+ else
+ {
if (!GET_INVIS_LEV(ch))
act("$n has left the game.", TRUE, ch, 0, 0, TO_ROOM);
sprintf(buf, "%s has quit the game.", GET_NAME(ch));
mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+++ objsave.c:Crash_rentsave()
Crash_extract_norents_from_equipped(ch);
Crash_extract_norents(ch->carrying);
/**** count here ****/
+ nitems=0;
+ for(j=0;j<NUM_WEARS;j++)
+ count_items(GET_EQ(ch,j),&nitems);
+ count_items(ch->carrying, &nitems);
+ if(nitems>max_obj_save)
+ {
+ sprintf(buf,"CAMP ALERT: %s camped with %ld items.",GET_NAME(ch),nitems);
+ mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+ }
+ else
+ {
+ sprintf(buf, "CAMP: %s camped with %ld items.",GET_NAME(ch),nitems);
+ mudlog(buf, CMP, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+ }
+ release_buffer(buf);
rent.net_cost_per_diem = cost;
rent.rentcode = RENT_RENTED;
I also stuck a counter in Crash_load() that
if (!feof(fl))
{
+ counter++;
if ((obj = Obj_from_store_to(object, &locate)))
{
----
+ sprintf(buf+strlen(buf),"(%d Items)",counter);
mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+ if(counter>max_obj_save)
+ {
+ sprintf(buf, "ALERT: %s un-rented with %d items.",GET_NAME(ch),counter);
+ mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+ }
+ release_buffer(buf);
/* turn this into a crash file by re-writing the control block */
rent.rentcode = RENT_CRASH;
_______________________________________
<question about counting items snipped>
<George's mailer code snipped>
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST