Just reviewed your code snippet again. The character is not in a room, so it's blowing up with NULL room. You are executing 'char_from_room(ch)' and saving, but the char is never sent to a new room, so you are probably going boom on "ch->in_room->sector_type == SECT_WATER_DEEP", since there is no room to check against.
- Valnir ----- Original Message ----- From: "Rick St Jean" <[EMAIL PROTECTED]> To: <[email protected]> Sent: Tuesday, July 27, 2004 2:09 PM Subject: Re: tier/remort > You guys are all really awesome, thanks for helping. > > I changed the ascend function to extract the char then to load it. > > when I extract it ... I get a bug log saying the char is null, > > here is the new function. It now bombs in a different place. in > update.c > > (gdb) bt > #0 0x080bdba8 in char_update () at update.c:1057 > #1 0x080c045a in update_handler () at update.c:2483 > #2 0x0807a1f5 in game_loop_unix (control=6) at comm.c:1485 > #3 0x08079876 in main (argc=2, argv=0xbffff964) at comm.c:916 > #4 0x40086c57 in ?? () > > void ascend_complete(CHAR_DATA * ch) > { > DESCRIPTOR_DATA *d; > char player_name[MAX_INPUT_LENGTH]; > > if (IS_NPC(ch) || (d = ch->desc) == NULL) > return; > > if (ch->pcdata->confirm_remort) { > stop_fighting(ch, TRUE); > > ch->tier++; > char_from_room(ch); > ch->level = 1; > ch->exp = 0; > ch->max_hit /= 10; > ch->max_mana /= 10; > ch->max_move /= 10; > ch->hit = UMIN(ch->hit, ch->max_hit); > ch->mana = UMIN(ch->mana, ch->max_mana); > ch->move = UMIN(ch->move, ch->max_move); > ch->pcdata->perm_hit = ch->max_hit; > ch->pcdata->perm_mana = ch->max_mana; > ch->pcdata->perm_move = ch->max_move; > ch->pcdata->confirm_remort = FALSE; > save_char_obj(ch); > > sprintf( player_name, "%s", capitalize( ch->name )); > extract_char( ch, TRUE ); > > load_char_obj( d, player_name ); > d->connected = CON_BEGIN_ASCEND; > return; > } > } > > it bombs at > > if (!IS_IMMORTAL(ch) && !IS_NPC(ch) && > ch->in_room->sector_type == SECT_WATER_DEEP) > { > OBJ_DATA *obj; > /* Is his boat Sea Worthy? Probably not for > long >=> */ > > if ((obj = get_boat(ch)) != NULL > && (number_percent() < 30)) > { > obj->item_type = ITEM_TRASH; > if (IS_SET(obj->extra_flags, ITEM_FLOATS)) > { > REMOVE_BIT(obj->extra_flags, > ITEM_FLOATS); > } > obj_from_char(obj); > obj_to_room(obj, ch->in_room); > act("$n's $p is leaking!!", ch, obj, NULL, > TO_ROOM); > act("Your $p is leaking!!", ch, obj, NULL, > TO_CHAR); > } > } > > so I am guessing that I should put in something to continue the for loop if > connected > > CON_PLAYING.? > > Is this just a spaghetti code fix or something practical? > > Rick > > > > At 10:18 AM 7/27/2004, you wrote: > >That shouldn't change anything. If it was blowing up assigning > >wch->next_player to wch_next, then it should blow up assigning it to a > >different variable. > > > >The for statement appears valid: > > > > >> for (wch = player_list; wch != NULL; wch = wch_next) > > >> > > { > > >> > > wch_next = wch->next_player; <=== bombs her > > > >The only way it could blow up on this line is if wch itself was null, or > >if wch->next_player was pointing to memory it shouldn't be. The former > >can be ruled out by the condition of the for loop. The latter, on the > >other hand, is not checked until the next iteration of the loop, and is > >also the likely candidate based on what Rick has told us he's working on. > > > >It sounds like the problem is the way you are removing the character from > >the list. If you post that piece of code to the list maybe we can help > >you out. > > > >Just as an idea, the way our remort code works is by calling > >extract_char(), then unlinking the file, then calling load_char_obj(). > >Basically that results in a cleaned out CHAR_DATA structure that we > >restore the stats we want to retain into before pushing the character into > >a remort step of creation. > > > > > The player not being valid is probably right. > > > > > > instead of using "wch->next_player" in the for statement, add "CHAR_DATA > > > *next_player;" at the top of your function. Put "wch = next_player" > > > instead > > > of "wch = wch->next_player" in the for statement, and add "next_player = > > > wch->next_player;" as the first line inside the for { }. > > > > > > - Valnir > > > > > > ----- Original Message ----- > > > From: "Krayzie K" <[EMAIL PROTECTED]> > > > To: <[email protected]> > > > Sent: Tuesday, July 27, 2004 1:15 AM > > > Subject: RE: tier/remort > > > > > > > > >> I am thinking that wch->next_player; is not valid any more as the > > > character > > >> has been taken out of the player_list when put into the remort process. > > >> > > >> I have had this problem before, actually when trying to re-do my remort > > >> system as well. > > >> > > >> -----Original Message----- > > >> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Rick St > > > Jean > > >> Sent: Monday, July 26, 2004 10:53 PM > > >> To: [email protected] > > >> Subject: Re: tier/remort > > >> > > >> Undefined command: "qt". Try "help". > > >> (gdb) bt > > >> #0 aggr_update () at update.c:2151 > > >> #1 0x080c030f in update_handler () at update.c:2517 > > >> #2 0x0807a1f5 in game_loop_unix (control=6) at comm.c:1485 > > >> #3 0x08079876 in main (argc=2, argv=0xbffff964) at comm.c:916 > > >> #4 0x40086c57 in ?? () > > >> > > >> > > >> line 2151 is wch_next = wch->next_player; > > >> > > >> At 11:45 PM 7/26/2004, you wrote: > > >> >You say it's crashing on an update? Why does GDB say that it's crashing > > >> >over? > > >> > > > >> > > > >> >----- Original Message ----- > > >> >From: "Rick St Jean" <[EMAIL PROTECTED]> > > >> >To: <[email protected]> > > >> >Sent: Monday, July 26, 2004 9:21 PM > > >> >Subject: tier/remort > > >> > > > >> > > > >> > > I am totally stumped, and I know I am getting in over my head. > > >> > > > > >> > > I am trying to put in new tier code, that resets a player to level 1 > > > and > > >> > > allows them > > >> > > to choose a new path. I was trying to modify some existing tier and > > >> >remort > > >> > > code. > > >> > > The remort code deletes a player file and all data, which is no good > > >> since > > >> > > I want > > >> > > to keep all my skills/spells/stats. It works some of the time as > > > long > > >> as > > >> > > the update > > >> > > doesn't hit while you are in the tier process. If there is a tick, > > > and > > >> > > update runs, > > >> > > then the code blows up when ever something accesses the player_list. > > > I > > >> >cannot > > >> > > figure how to pull someone out of the list. I set d->connected = > > >> > > CON_BEGIN_ASCEND; > > >> > > > > >> > > > > >> > > void ascend_complete(CHAR_DATA * ch) > > >> > > { > > >> > > DESCRIPTOR_DATA *d; > > >> > > > > >> > > if (IS_NPC(ch) || (d = ch->desc) == NULL) > > >> > > return; > > >> > > > > >> > > if (ch->pcdata->confirm_remort) > > >> > > { > > >> > > save_char_obj(ch); > > >> > > stop_fighting(ch, TRUE); > > >> > > reduce_known_skills(ch); > > >> > > ch->pcdata->class_remort[ch->class] = TRUE; > > >> > > ch->pcdata->tier_list[class_table[ch->class].class_type]++; > > >> > > > > >> > > d->character = ch; > > >> > > > > >> > > ch->level = 1; > > >> > > ch->exp = 0; > > >> > > ch->max_hit /= 10; > > >> > > ch->max_mana /= 10; > > >> > > ch->max_move /= 10; > > >> > > ch->max_blood /= 10; > > >> > > ch->hit = UMIN(ch->hit, ch->max_hit); > > >> > > ch->mana = UMIN(ch->mana, ch->max_mana); > > >> > > ch->move = UMIN(ch->move, ch->max_move); > > >> > > ch->blood = UMIN(ch->blood, ch->max_blood); > > >> > > ch->pcdata->perm_hit = ch->max_hit; > > >> > > ch->pcdata->perm_mana = ch->max_mana; > > >> > > ch->pcdata->perm_move = ch->max_move; > > >> > > > > >> > > write_to_buffer( d, "Now beginning the ascention process.\n\r\n\r", > > > ); > > >> > > > > >> > > d->connected = CON_BEGIN_ASCEND; > > >> > > ch->pcdata->confirm_remort = FALSE; > > >> > > return; > > >> > > } > > >> > > } > > >> > > > > >> > > It bombs on the code below when I am in the nanny CON_BEGIN_ASCEND > > >> > > > > >> > > CREF(wch_next, CHAR_NEXT); > > >> > > for (wch = player_list; wch != NULL; wch = wch_next) > > >> > > { > > >> > > wch_next = wch->next_player; <=== bombs here. > > >> > > if (wch->in_room == NULL || IS_NPC(wch) || wch->level >= > > >> >LEVEL_IMMORTAL > > >> > > || wch->in_room == NULL || wch->in_room->area->empty) > > >> > > continue; > > >> > > > > >> > > > > >> > > -- > > >> > > 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 > > >> > > >> > > >> -- > > >> 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 > > > > > > > > >-- > >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 >

