How could someone suddenly drop link wail your doing the loop.... The mud has a one track mind and can only do one thing at a time. So it wouldn't extract them till after the loop was finished.
----- Original Message ----- From: "Will Hongach" <[EMAIL PROTECTED]> To: <[email protected]> Sent: Thursday, November 14, 2002 4:12 PM Subject: Re: Multiplay check question > I think another issue you're going to have with iterating through > char_list like this is you're going to lose track of the next pointer if a > char_data node is extracted from the list while you're in the midst of > iterating. This extraction will happen with mob deaths, player logouts, > etc. > Try using: > > for ( ch_check = char_list; ch_check != NULL; ch_check = ch_check_next ) > { > ch_check_next = ch_next->next; > > <snippet resumes> > > Hope this helps. > > - Strife Daemonkin > > ----- Original Message ----- > From: "Anarchangel" <[EMAIL PROTECTED]> > To: <[email protected]> > Sent: Thursday, November 14, 2002 12:01 PM > Subject: Multiplay check question > > > > Hey everyone, > > > > I'd appreciate any input and constructive criticism on the > > following. Hopefully it's something simple that I'm overlooking. > > > > I recently put together a simple check for a multiplaying character. It > > doesn't do anything except write to wiznet. It seems to be working fine, > > but today I noticed the mud I'm working on crashed in the > > function. Here's the GDB info: > > > > #0 0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388 > > 4388 if ( (!IS_NPC(ch_check) && !IS_NPC(ch)) > > (gdb) bt > > #0 0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388 > > #1 0x80777f3 in nanny (d=0x40a3334c, argument=0x40a33774 "") at > > comm.c:3064 > > #2 0x80740f0 in game_loop_unix (control=4) at comm.c:1183 > > #3 0x80734fb in main (argc=4, argv=0xbffffdd4) at comm.c:497 > > #4 0x4005ecbe in __libc_start_main () from /lib/libc.so.6 > > > > #0 0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388 > > 4388 if ( (!IS_NPC(ch_check) && !IS_NPC(ch)) > > (gdb) info local > > ch = (CHAR_DATA *) 0x40bd38e0 > > ch_check = (CHAR_DATA *) 0x40ba01d4 > > > > I went ahead and printed ch and ch_check and they're both PC's, as I > > thought. I can't think of why it would have crashed, as there have been > > at least a hundred logins and logouts since I made this live. > > > > I call it in the nanny, right when it tells the room that someone entered > > the game. > > > > check_multiplay( ch ); > > > > Here's the function: > > host is IP address and host2 is resolved domain. > > > > void check_multiplay( CHAR_DATA *ch ) > > { > > CHAR_DATA *ch_check; > > > > if(!ch) > > { > > log_string( "ch is null in multiplay check." ); > > return; > > } > > > > /* Don't want to give away immortals */ > > if(IS_IMMORTAL(ch)) > > return; > > > > for ( ch_check = char_list; ch_check != NULL; ch_check = > ch_check->next ) > > { > > if ( (!IS_NPC(ch_check) && !IS_NPC(ch)) <-- Offending line > > && !str_cmp( ch->desc->host2, ch_check->desc->host2) > > && ch != ch_check ) > > { > > char buf[MSL]; > > > > /* Don't want to give away immortals */ > > if(IS_IMMORTAL(ch_check)) > > return; > > > > /* Just in case */ > > if(ch->name) > > sprintf(buf, "%s may be multiplaying.", ch->name); > > else > > { > > log_string( "ch->name is null in multiplay check." ); > > return; > > } > > > > wiznet( "$N may be multiplaying.", ch, NULL, > WIZ_ON,0,get_trust(ch)); > > log_string( buf ); > > > > return; > > } > > } > > > > return; > > > > } > > > > > > -- > > ROM mailing list > > [email protected] > > http://www.rom.org/cgi-bin/mailman/listinfo/rom > > > > > > > > -- > ROM mailing list > [email protected] > http://www.rom.org/cgi-bin/mailman/listinfo/rom >

