From 21b1ce2948355586285f4fa3f5f1fc979cb03fb5 Mon Sep 17 00:00:00 2001 From: skotlex Date: Wed, 28 Mar 2007 13:51:18 +0000 Subject: - Corrected statp array not being long enough to actually hold the status points of ALL levels up to and including MAX_LEVEL. Fixes reaching final level and resetting giving you an unpredictable amount of status points. - pc_resetstate will now fail if you use the stat point table and your char has a level above MAX_LEVEL. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@10084 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 4 ++++ src/map/pc.c | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index b7d0c0b41..9aac6d038 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,10 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2007/03/28 + * Corrected statp array not being long enough to actually hold the status + points of ALL levels up to and including MAX_LEVEL. Fixes reaching final + level and resetting giving you an unpredictable amount of status points. 2007/03/28 * Negative aspd rate bonuses will be handled as aspd add rate since the default non-stackable bonus is useless on penalty bonuses. diff --git a/src/map/pc.c b/src/map/pc.c index 41be58b42..2c473eec2 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -46,7 +46,7 @@ #define PVP_CALCRANK_INTERVAL 1000 // PVPʌvZ̊Ԋu static unsigned int exp_table[MAX_PC_CLASS][2][MAX_LEVEL]; static unsigned int max_level[MAX_PC_CLASS][2]; -static short statp[MAX_LEVEL]; +static short statp[MAX_LEVEL+1]; // h-files are for declarations, not for implementations... [Shinomori] struct skill_tree_entry skill_tree[MAX_PC_CLASS][MAX_SKILL_TREE]; @@ -4690,6 +4690,14 @@ int pc_resetstate(struct map_session_data* sd) if (battle_config.use_statpoint_table) { // New statpoint table used here - Dexity int stat; + if (sd->status.base_level > MAX_LEVEL) + { //statp[] goes out of bounds, can't reset! + if (battle_config.error_log) + ShowError("pc_resetstate: Can't reset stats of %d:%d, the base level (%d) is greater than the max level supported (%d)\n", + sd->status.account_id, sd->status.char_id, sd->status.base_level, + MAX_LEVEL); + return 0; + } stat = statp[sd->status.base_level]; if (sd->class_&JOBL_UPPER) stat+=52; // extra 52+48=100 stat points @@ -4737,7 +4745,7 @@ int pc_resetstate(struct map_session_data* sd) clif_updatestatus(sd,SP_STATUSPOINT); status_calc_pc(sd,0); - return 0; + return 1; } /*========================================== @@ -7533,7 +7541,7 @@ int pc_readdb(void) continue; if ((j=atoi(line))<0) j=0; - if (i >= MAX_LEVEL) + if (i > MAX_LEVEL) break; statp[i]=j; i++; @@ -7542,7 +7550,7 @@ int pc_readdb(void) ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n","statpoint.txt"); } // generate the remaining parts of the db if necessary - for (; i < MAX_LEVEL; i++) { + for (; i <= MAX_LEVEL; i++) { j += (i+15)/5; statp[i] = j; } -- cgit v1.2.3-60-g2f50