[CODE]Game crashes when any mob is killed

From: Aaron Throckmorton (throck@nfinity.com)
Date: 12/15/98

I am using Circle3.0bpl14, with dgscripts pl5a and olc+ 2.0
Whenever a char is fighting a mob, and the mob gets killed, the game
crashes in this function:

void hitprcnt_mtrigger(struct char_data *ch)
  trig_data *t;
  char buf[MAX_INPUT_LENGTH];

      AFF_FLAGGED(ch, AFF_CHARM))               <<<<< DEBUGGER POINTS TO HERE!!!!!

  for (t = TRIGGERS(SCRIPT(ch)); t; t = t->next) {
        (((GET_HIT(ch) * 100) / GET_MAX_HIT(ch)) <= GET_TRIG_NARG(t))) {

      ADD_UID_VAR(buf, t, FIGHTING(ch), "actor", 0)
      script_driver(ch, t, MOB_TRIGGER, TRIG_NEW);

This function is called at the end of
void hit(struct char_data * ch, struct char_data * victim, int type)
  struct obj_data *wielded = GET_EQ(ch, WEAR_WIELD);
  int w_type, victim_ac, calc_thaco, dam, diceroll;

  /* check if the character has a fight trigger */

  /* Do some sanity checking, in case someone flees, etc. */
  if (ch->in_room != victim->in_room) {
    } else
      damage(ch, victim, dam, w_type);

  /* check if the victim has a hitprcnt trigger */
  hitprcnt_mtrigger(victim);    <<<<< CALLED HERE

in fight.c.  Just before this function is called, the damage() function
is called.
If the victim dies, the damage() function calls the die() function.
The die() function calls raw_kill(), and the raw_kill() calls the
extract_char() function.
The extract_char() function removes all traces of the victim from
memory, then the hit() function calls hitprcnt_mtrigger(), passing it
the victim info, which no longer exists, causing the game to crash.

I tried putting a if (victim) statement just before the function call,
but that didn't seem to work.  Anyone got any ideas?

Thanks in advance.

     | 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