Ok I have a small problem. I'm currently rewriting our current quest mob
code. To be objected based, and I'm hitting a problem that I don't get why
it's doing it.

Ok with the code I have you find a mob in the world and assign it to be a
quest mob. It runs throught this check:
 if (!str_cmp(arg, "assign"))
 {
  for (questmob = ch->in_room->people; questmob != NULL; questmob =
questmob->next_in_room)
  {
   if (is_name(arg2, questmob->name))
    break;
  }
  if (questmob == NULL)
  {
   send_to_char("Their is no one in the room by that name.\n\r", ch);
   return;
  }
  STR_SET_BIT(questmob->act, ACT_QUEST_MASTER);
  STR_SET_BIT(questmob->pIndexData->act, ACT_QUEST_MASTER);
  SET_BIT(questmob->in_room->area->area_flags, AREA_CHANGED);
  questmaster = new (QUEST_DATA);
  questmaster->questmob = questmob;
  if (questmaster_table == NULL)
   questmaster_table = questmaster;
  else
  {
   questmaster->next = questmaster_table;
   questmaster_table = questmaster;
  }
  printf_to_char(ch, "%s is a new Quest Master!\n\r",
questmob->short_descr);
  return;

 }
Now I know that is running properly. Now cause I was testing the making and
deleteing of the mob I then told it to unassign the quest mob and it runs
through this.
 if (!str_cmp(arg, "unassign"))
 {
  if ((questmaster = locate_questmaster(ch)) == NULL)
  {
   send_to_char("Their is no Quest Master in the room.\n\r", ch);
   return;
  }
  if (questmaster->questmob == NULL)
  {
   send_to_char("Their is no one in the room by that name.\n\r", ch);
   return;
  }
  STR_REMOVE_BIT(questmaster->questmob->pIndexData->act, ACT_QUEST_MASTER);
  SET_BIT(questmaster->questmob->in_room->area->area_flags, AREA_CHANGED);
  printf_to_char(ch, "%s is nolonger a Quest Master!\n\r",
questmaster->questmob->short_descr);
  for (curr = questmaster_table, prev = NULL; curr != NULL; prev = curr,
curr = curr->next)
  {
   if (curr == questmaster)
   {
    if (prev == NULL)
    {
     delete questmaster_table;
     questmaster_table = NULL;
     break;
    }
    else
    {
     prev->next = curr->next;
     delete curr;
     break;
    }
   }
  }
  extract_char(questmaster->questmob, TRUE);
  delete questmaster;
  return;
 }

Now heres my problem I'm using C++ and using constructors and deconstructors
and the problem I'm hitting is this when it hits the decontrutor it goes
through the remove all quests currently in the mobs memory. But the problem
is their wasn't any current quest running I allocated him and then deleted
him.

Heres my constructor:
quest_data ::quest_data()
{
 memset(this, 0, sizeof(*this));
 this->qArea_list = NULL;
 this->current_quests = NULL;
 this->quest_item_table = NULL;
 return;
}
and Heres my deconstrcutor
quest_data ::~quest_data()
{
 QUEST_TABLE_DATA *quest;
 struct quest_area_type *list, *next_in_list;

 free(this->quest_item_table);

 for (quest = this->current_quests; quest != NULL; quest = quest->next)
  this->remove_quest(quest);

 for (list = this->qArea_list; list != NULL; list = next_in_list)
 {
  next_in_list = list->next;
  free(list);
 }

 return;
}
and heres what GDB is telling me what happened:
#0  0x080eef79 in quest_data::remove_quest (this=0x8229270,
entry=0x4018ac48)
    at olc_qedit.cc:883
883                             curr->player->pcdata->nextquest = 10;
(gdb) bt
#0  0x080eef79 in quest_data::remove_quest (this=0x8229270,
entry=0x4018ac48)
    at olc_qedit.cc:883
#1  0x080ee6d2 in quest_data::~quest_data (this=0x8229270, __in_chrg=3)
    at olc_qedit.cc:614
#2  0x080f0a7c in do_assign_questmaster (ch=0x40cfea94,
    argument=0xbfffe99c "unassign guard") at olc_qedit.cc:1788
878
879             for (curr = this->current_quests; curr != NULL; prev = curr,
cur
r = curr->next)
880             {
881                     if(curr == entry)
882                     {
883                             curr->player->pcdata->nextquest = 10;
884                             if (curr->player->PlrFlagged(PLR_QUESTING));
885                                     printf_to_char(curr->player, "You
have r
un out of time for your quest!\n\rYou may quest again in %d minutes.\n\r",
curr-
>player->pcdata->nextquest);
886                             curr->player->PlrRemoveBit(PLR_QUESTING);
887                             curr->player->pcdata->questmaster = NULL;
(gdb) print this->current_quests
$1 = (QUEST_TABLE_DATA *) 0x4018ac48
(gdb) print this->questmob
$2 = (CHAR_DATA *) 0x40a60010
(gdb) print this->questmob->name
$3 = 0x40216c7f "Guardian"
(gdb)

Now with the constructor setting all the pointers to NULL why did it pass
it's check in the deconstructor? Did I do something wrong or forget to do
something?


Reply via email to