--- deliantra/server/common/player.C 2007/01/07 02:39:13 1.14 +++ deliantra/server/common/player.C 2007/02/15 21:07:48 1.20 @@ -49,6 +49,7 @@ { if (op != NULL && op->type == PLAYER && op->arch != NULL && op->arch->clone.race != NULL && strcmp (op->arch->clone.race, "dragon") == 0) return 1; + return 0; } @@ -66,6 +67,9 @@ object *container = ob->container; ob->container = 0; + if (ob->map) + maplevel = ob->map->path; + #define PL_OUT(k) freezer.put (KW_ ## k, k) #define PL_OUT2(k,v) freezer.put (KW_ ## k, v) @@ -84,11 +88,10 @@ PL_OUT (outputs_sync); PL_OUT (outputs_count); - freezer.put (KW_usekeys, usekeys == key_inventory ? "key_inventory" : (usekeys == keyrings ? "keyrings" : "containers")); + freezer.put (KW_usekeys, usekeys == key_inventory ? "key_inventory" : (usekeys == keyrings ? "keyrings" : "containers")); freezer.put (KW_unapply, unapply == unapply_nochoice ? "unapply_nochoice" : (unapply == unapply_never ? "unapply_never" : "unapply_always")); - if (ob->map) PL_OUT2 (map, ob->map->path); - + PL_OUT2 (map, maplevel); PL_OUT (savebed_map); PL_OUT (bed_x); PL_OUT (bed_y); @@ -101,12 +104,12 @@ PL_OUT2 (Wis, orig_stats.Wis); PL_OUT2 (Cha, orig_stats.Cha); - PL_OUT2 (lev_array, min (ob->level, 10)); + PL_OUT2 (lev_array, 10); - for (int i = 1; i <= last_level && i <= 10; i++) + for (int i = 1; i <= 10; i++) { - fprintf (freezer, "%d\n", levhp[i]); - fprintf (freezer, "%d\n", levsp[i]); + fprintf (freezer, "%d\n", levhp [i]); + fprintf (freezer, "%d\n", levsp [i]); fprintf (freezer, "%d\n", levgrace[i]); } @@ -143,11 +146,15 @@ player * player::load_pl (object_thawer &thawer) { + int maxerrs = 10; + player *pl = new player; - pl->last_save_time = time (0); pl->savebed_map = first_map_path; + /* this loads the standard objects values. */ + pl->set_object (object::create ()); + /* Loop through the file, loading the rest of the values */ for (;;) { @@ -157,11 +164,16 @@ { case KW_EOF: LOG (llevError, "%s: unexpected EOF while reading player header\n", thawer.name); - delete pl; - return 0; + goto failure; + + default: + LOG (llevError, "%s: skipping unknown key in player header: %s\n", thawer.name, keyword_str [kw]); + if (!--maxerrs) goto failure; + break; case KW_ERROR: - LOG (llevError, "%s: error while reading player header, skipping (%s,%s)\n", thawer.name, thawer.last_keyword, thawer.last_value); + LOG (llevError, "%s: parse error while reading player header, skipping (%s,%s).\n", thawer.name, thawer.kw_str, thawer.value); + if (!--maxerrs) goto failure; break; case KW_endplst: @@ -223,35 +235,36 @@ for (int i = 1; i <= count; i++) { - char line[128]; + char line [32]; - fgets (line, 128, thawer); pl->levhp [i] = atoi (line); - fgets (line, 128, thawer); pl->levsp [i] = atoi (line); - fgets (line, 128, thawer); pl->levgrace[i] = atoi (line); + fgets (line, 32, thawer); pl->levhp [i] = atoi (line); + fgets (line, 32, thawer); pl->levsp [i] = atoi (line); + fgets (line, 32, thawer); pl->levgrace[i] = atoi (line); } } break; - - default: - LOG (llevError, "%s: skipping unknown key in player header: %s\n", thawer.name, keyword_str [kw]); - break; } } done: - /* this loads the standard objects values. */ - pl->set_object (object::create ()); - if (!load_object (thawer, pl->ob, 0)) { pl->ob->destroy (); - delete pl; + pl->destroy (); return 0; } INVOKE_PLAYER (LOAD, pl); return pl; + +failure: + LOG (llevError, "%s: too many or too grave errors, aborting player load.\n", thawer.name); + + pl->ob->destroy (); + pl->destroy (); + + return 0; } player *