summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-03-28 13:51:18 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-03-28 13:51:18 +0000
commit21b1ce2948355586285f4fa3f5f1fc979cb03fb5 (patch)
tree01568d72ed1cbd5761306fc0c5ab55fcc5f77d47 /src/map/pc.c
parenta5d02326f3402788e9b9fabf74924adad2d6d724 (diff)
downloadhercules-21b1ce2948355586285f4fa3f5f1fc979cb03fb5.tar.gz
hercules-21b1ce2948355586285f4fa3f5f1fc979cb03fb5.tar.bz2
hercules-21b1ce2948355586285f4fa3f5f1fc979cb03fb5.tar.xz
hercules-21b1ce2948355586285f4fa3f5f1fc979cb03fb5.zip
- 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
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c16
1 files changed, 12 insertions, 4 deletions
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;
}