summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--src/map/pc.c16
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
@@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
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.
* Added check to prevent the client from using passive skills. [Skotlex]
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‡ˆÊŒvŽZ‚ÌŠÔŠ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;
}