Login
User Name:

Password:



Register
Forgot your password?
Vote for Us!
Couple bugs
Dec 12, 2017, 5:42 pm
By Remcon
Bug in disarm( )
Nov 12, 2017, 6:54 pm
By GatewaySysop
Bug in will_fall( )
Oct 23, 2017, 1:35 am
By GatewaySysop
Bug in do_zap( ), do_brandish( )
Oct 18, 2017, 1:52 pm
By GatewaySysop
Bug in get_exp_worth( )
Oct 10, 2017, 1:26 am
By GatewaySysop
LOP 1.45
Author: Remcon
Submitted by: Remcon
LOP Heroes Edition
Author: Vladaar
Submitted by: Vladaar
Heroes sound extras
Author: Vladaar
Submitted by: Vladaar
6Dragons 4.3
Author: Vladaar
Submitted by: Vladaar
Memwatch
Author: Johan Lindh
Submitted by: Vladaar
Users Online
CommonCrawl, Yahoo!, Google

Members: 0
Guests: 20
Stats
Files
Topics
Posts
Members
Newest Member
477
3,705
19,232
608
LAntorcha
Today's Birthdays
There are no member birthdays today.
Related Links
» SmaugMuds.org » Bugfix Lists » AFKMud Bugfix List » [Bug] Mob resets do not work ...
Forum Rules | Mark all | Recent Posts

[Bug] Mob resets do not work properly when limits are specified
< Newer Topic :: Older Topic > AFKMud 2.02

Pages:<< prev 1 next >>
Post is unread #1 Jan 12, 2008, 3:26 pm
Go to the top of the page
Go to the bottom of the page

Samson
Black Hand
GroupAdministrators
Posts3,639
JoinedJan 1, 2002

Bug: Mob resets do not work properly when limits are specified
Danger: Low - The only real affect is that a reset will trigger more of a mob that someone actally wants.
Discovered in: AFKMud 2.02
Found by: Many people over time
Fixed by: Remcon

---

mobindex.cpp, mob_index::create_mobile

Locate:
   mob->home_vnum = -1;
   mob->sector = -1;
   mob->timer = 0;


Below that, add:
   mob->resetvnum = -1;
   mob->resetnum = -1;


character.cpp

Near the top with other prototypes, locate:
void set_title( char_data *, char * );


Below that, add:
void update_room_reset( char_data *, bool );


character.cpp, char_data::extract

Locate:
   if( mount )
   {
      mount->unset_actflag( ACT_MOUNTED );
      mount = NULL;
      position = POS_STANDING;
   }


Change to:
   if( mount )
   {
      update_room_reset( this, true );
      mount->unset_actflag( ACT_MOUNTED );
      mount = NULL;
      position = POS_STANDING;
   }


hotboot.cpp

Near the top, locate:
bool write_to_descriptor_old( int, char *, size_t );


Below that, add:
void update_room_reset( char_data *, bool );


hotboot.cpp, save_mobile

Locate:
   fprintf( fp, "Level   %d\n", mob->level );
   fprintf( fp, "Gold   %d\n", mob->gold );


Below that, add:
   fprintf( fp, "Resetvnum %d\n", mob->resetvnum );
   fprintf( fp, "Resetnum  %d\n", mob->resetnum );


hotboot.cpp, load_mobile

Locate:
               mob->tempnum = -9998;   /* Yet another hackish fix! */
               if( !mob->to_room( pRoomIndex ) )
                  log_printf( "char_to_room: %s:%s, line %d.", __FILE__, __FUNCTION__, __LINE__ );


Below that, add:
               update_room_reset( mob, false );


Locate:
         case 'R':
            KEY( "Room", inroom, fread_number( fp ) );
            break;


Change to:
         case 'R':
            KEY( "Room", inroom, fread_number( fp ) );
            KEY( "Resetvnum", mob->resetvnum, fread_number( fp ) );
            KEY( "Resetnum", mob->resetnum, fread_number( fp ) );
            break;


character.h, class char_data

Locate:
   int heading;   /* The skyship's directional heading */


Below that, add:
   int resetvnum;
   int resetnum;


roomindex.h, class reset_data

Locate:
   short arg9;
   short arg10;
   short arg11;


Below that, add:
   bool sreset;


roomindex.cpp

Near the top, locate:
reset_data *make_reset( char, int, int, int, short, short, short, short, short, short, short, short );


Below that, add:
void update_room_reset( char_data *, bool );


roomindex.cpp, room_index::reset

Locate:
   char *filename = area->filename;
      int level = 0, num, lastnest;


Change to:
   char *filename = area->filename;
   int level = 0, num, lastnest, onreset = 0;


Locate:
   for( rst = resets.begin(); rst != resets.end(); ++rst )
   {
      reset_data *pReset = (*rst);

      switch( pReset->command )


Change to:
   for( rst = resets.begin(); rst != resets.end(); ++rst )
   {
      reset_data *pReset = (*rst);

      ++onreset;
      switch( pReset->command )


Locate:
            if( pMobIndex->count >= pReset->arg2 )
            {
               mob = NULL;
               break;
            }


Change to:
            if( !pReset->sreset )
            {
               mob = NULL;
               break;
            }


Locate:
            if( pRoomIndex->is_dark( mob ) )
               mob->set_aflag( AFF_INFRARED );


Below that, add:
            mob->resetvnum = pRoomIndex->vnum;
            mob->resetnum = onreset;
            pReset->sreset = false;


Locate:
               for( dst = pReset->resets.begin(); dst != pReset->resets.end(); ++dst )
               {
                  reset_data *tReset = (*dst);

                  switch( tReset->command )


Change to:
               for( dst = pReset->resets.begin(); dst != pReset->resets.end(); ++dst )
               {
                  reset_data *tReset = (*dst);

                  ++onreset;
                  switch( tReset->command )


Locate:
                           for( gst = tReset->resets.begin(); gst != tReset->resets.end(); ++gst )
                           {
                              reset_data *gReset = (*gst);
                              int iNest;
                              to_obj = lastobj;

                              switch( gReset->command )


Change to:
                           for( gst = tReset->resets.begin(); gst != tReset->resets.end(); ++gst )
                           {
                              reset_data *gReset = (*gst);
                              int iNest;
                              to_obj = lastobj;

                              ++onreset;
                              switch( gReset->command )


Locate:
               for( dst = pReset->resets.begin(); dst != pReset->resets.end(); ++dst )
               {
                  int iNest;

                  reset_data *tReset = (*dst);
                  to_obj = lastobj;

                  switch( tReset->command )


Change to:
               for( dst = pReset->resets.begin(); dst != pReset->resets.end(); ++dst )
               {
                  int iNest;

                  reset_data *tReset = (*dst);
                  to_obj = lastobj;
                  ++onreset;

                  switch( tReset->command )


reset.cpp

At the bottom of reset.cpp, add the following new function:
// Update the mobile resets to let it know to reset it again
void update_room_reset( char_data *ch, bool setting )
{
   room_index *room;
   list<reset_data*>::iterator pst;
   int nfind = 0;

   if( !ch )
      return;

   if( !( room = get_room_index( ch->resetvnum ) ) )
      return;

   for( pst = room->resets.begin(); pst != room->resets.end(); ++pst )
   {
      list<reset_data*>::iterator tst;
      reset_data *pReset = *pst;

      if( ++nfind == ch->resetnum )
      {
         pReset->sreset = setting;
         return;
      }

      for( tst = pReset->resets.begin(); tst != pReset->resets.end(); ++tst )
      {
         list<reset_data*>::iterator gst;
         reset_data *tReset = *tst;

         if( ++nfind == ch->resetnum )
         {
            tReset->sreset = setting;
            return;
         }

         for( gst = tReset->resets.begin(); gst != tReset->resets.end(); ++gst )
         {
            reset_data *gReset = *gst;

            if( ++nfind == ch->resetnum )
            {
               gReset->sreset = setting;
               return;
            }
         }
      }
   }
}


The basic problem here is that resets for mobs can specify a limit to how many of them should be loaded at any given time. This ( I think? ) worked just fine when resets were still based on the area as a whole. No more than X number of mobs would load. But when things were converted to room based resets, the counts went out the window. Each room could specify its own limit, which was meaningless in the big picture. Remcon's fix takes a different approach by tying each reset number to the mobs it creates and then keeping track of them to see if they should be reset again when the area reset is called.
       
Pages:<< prev 1 next >>