Re: Was: Xapobj and houses Now: mobile_activity is bad!

From: Peter Ajamian (pajamian@cheapsam.com)
Date: 09/19/99


Patrick Dughi wrote:

>         In other news, I found ..well.. I delt with what had become an
> increasingly annoying problem.  Basically, the problem was
> mobile_activity.  That's not to say the problem was _in_ mobile_activity,
> but rather that it had a design flaw.
>
>         Mobile activity contains a simple for loop, with the added cavet
> that instead of iterating to ch->next, it saves ch->next in a var and then
> iterates to that.  This is so a mob can concievably
> extract/purge/otherwise kill itself.  However, the problem that is left -
> what happens if a mob extracts/purges someone else?  No problems, except
> for that we're saving the value of 'next' before we operate.  This could
> in some circumstances become an issue as we opetate on a mangled pointer.
> We can't work off the current mob else we loose the ability to have a mob
> purge itself.  So, there's a few solutions;
>
> 1) never extract chars in a spec-proc, or via mob actions in
> mobile_Activity, except ones self.
> 2) queue everyone to be deleted and deleted them in a seperate loop.
> 3) think of something more inventive.

4.  How about something like this (pseudocode, unchecked, variables names will
differ)...

for (currmob = top_of_table; *currmob; currmob = nextmob) {
  nextmob = currmob->next;

  /* Main Mob Code goes in here */

  if (argument == REMOVE_PLAYER) { /* <--- Or something like that. */
    if (player_to_be_removed == nextmob)
      nextmob = nextmov->next;

    /* Code to remove player in here. */
  }

  /* Rest of Mob Code goes in here */
}


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST