Browse Source

* Fixed base and job exp not getting reset on (de)leveling through commands (bugreport:85).
- Fixed level up related functions not updating client-side exp information, causing the exp percent value display random values.
- Fixed party system not getting notified of level-ups through parameter changes.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14505 54d463be-8e91-2dee-dedb-b68131a5f0ec

ai4rei 14 years ago
parent
commit
5042f8262c
3 changed files with 24 additions and 11 deletions
  1. 3 0
      Changelog-Trunk.txt
  2. 8 8
      src/map/atcommand.c
  3. 13 3
      src/map/pc.c

+ 3 - 0
Changelog-Trunk.txt

@@ -1,6 +1,9 @@
 Date	Added
 Date	Added
 
 
 2010/11/26
 2010/11/26
+	* Fixed base and job exp not getting reset on (de)leveling through commands (bugreport:85). [Ai4rei]
+	- Fixed level up related functions not updating client-side exp information, causing the exp percent value display random values.
+	- Fixed party system not getting notified of level-ups through parameter changes.
 	* Fixed auto-generated statpoint table missing 3 status points (since r1107). [Ai4rei]
 	* Fixed auto-generated statpoint table missing 3 status points (since r1107). [Ai4rei]
 2010/11/25
 2010/11/25
 	* Too large client packets, which would otherwise cause the client to crash, are now dropped and reported (bugreport:4391). [Ai4rei]
 	* Too large client packets, which would otherwise cause the client to crash, are now dropped and reported (bugreport:4391). [Ai4rei]

+ 8 - 8
src/map/atcommand.c

@@ -1777,8 +1777,10 @@ ACMD_FUNC(baselevelup)
 		sd->status.base_level -= (unsigned int)level;
 		sd->status.base_level -= (unsigned int)level;
 		clif_displaymessage(fd, msg_txt(22)); // Base level lowered.
 		clif_displaymessage(fd, msg_txt(22)); // Base level lowered.
 	}
 	}
+	sd->status.base_exp = 0;
 	clif_updatestatus(sd, SP_STATUSPOINT);
 	clif_updatestatus(sd, SP_STATUSPOINT);
 	clif_updatestatus(sd, SP_BASELEVEL);
 	clif_updatestatus(sd, SP_BASELEVEL);
+	clif_updatestatus(sd, SP_BASEEXP);
 	clif_updatestatus(sd, SP_NEXTBASEEXP);
 	clif_updatestatus(sd, SP_NEXTBASEEXP);
 	status_calc_pc(sd, 0);
 	status_calc_pc(sd, 0);
 	if(sd->status.party_id)
 	if(sd->status.party_id)
@@ -1808,11 +1810,7 @@ ACMD_FUNC(joblevelup)
 		if ((unsigned int)level > pc_maxjoblv(sd) || (unsigned int)level > pc_maxjoblv(sd) - sd->status.job_level) // fix positiv overflow
 		if ((unsigned int)level > pc_maxjoblv(sd) || (unsigned int)level > pc_maxjoblv(sd) - sd->status.job_level) // fix positiv overflow
 			level = pc_maxjoblv(sd) - sd->status.job_level;
 			level = pc_maxjoblv(sd) - sd->status.job_level;
 		sd->status.job_level += (unsigned int)level;
 		sd->status.job_level += (unsigned int)level;
-		clif_updatestatus(sd, SP_JOBLEVEL);
-		clif_updatestatus(sd, SP_NEXTJOBEXP);
 		sd->status.skill_point += level;
 		sd->status.skill_point += level;
-		clif_updatestatus(sd, SP_SKILLPOINT);
-		status_calc_pc(sd, 0);
 		clif_misceffect(&sd->bl, 1);
 		clif_misceffect(&sd->bl, 1);
 		clif_displaymessage(fd, msg_txt(24)); // Job level raised.
 		clif_displaymessage(fd, msg_txt(24)); // Job level raised.
 	} else {
 	} else {
@@ -1824,18 +1822,20 @@ ACMD_FUNC(joblevelup)
 		if ((unsigned int)level >= sd->status.job_level) // fix negativ overflow
 		if ((unsigned int)level >= sd->status.job_level) // fix negativ overflow
 			level = sd->status.job_level-1;
 			level = sd->status.job_level-1;
 		sd->status.job_level -= (unsigned int)level;
 		sd->status.job_level -= (unsigned int)level;
-		clif_updatestatus(sd, SP_JOBLEVEL);
-		clif_updatestatus(sd, SP_NEXTJOBEXP);
 		if (sd->status.skill_point < level)
 		if (sd->status.skill_point < level)
 			pc_resetskill(sd,0);	//Reset skills since we need to substract more points.
 			pc_resetskill(sd,0);	//Reset skills since we need to substract more points.
 		if (sd->status.skill_point < level)
 		if (sd->status.skill_point < level)
 			sd->status.skill_point = 0;
 			sd->status.skill_point = 0;
 		else
 		else
 			sd->status.skill_point -= level;
 			sd->status.skill_point -= level;
-		clif_updatestatus(sd, SP_SKILLPOINT);
-		status_calc_pc(sd, 0);
 		clif_displaymessage(fd, msg_txt(25)); // Job level lowered.
 		clif_displaymessage(fd, msg_txt(25)); // Job level lowered.
 	}
 	}
+	sd->status.job_exp = 0;
+	clif_updatestatus(sd, SP_JOBLEVEL);
+	clif_updatestatus(sd, SP_JOBEXP);
+	clif_updatestatus(sd, SP_NEXTJOBEXP);
+	clif_updatestatus(sd, SP_SKILLPOINT);
+	status_calc_pc(sd, 0);
 
 
 	return 0;
 	return 0;
 }
 }

+ 13 - 3
src/map/pc.c

@@ -4767,6 +4767,7 @@ int pc_checkbaselevelup(struct map_session_data *sd)
 	
 	
 	clif_updatestatus(sd,SP_STATUSPOINT);
 	clif_updatestatus(sd,SP_STATUSPOINT);
 	clif_updatestatus(sd,SP_BASELEVEL);
 	clif_updatestatus(sd,SP_BASELEVEL);
+	clif_updatestatus(sd,SP_BASEEXP);
 	clif_updatestatus(sd,SP_NEXTBASEEXP);
 	clif_updatestatus(sd,SP_NEXTBASEEXP);
 	status_calc_pc(sd,0);
 	status_calc_pc(sd,0);
 	status_percent_heal(&sd->bl,100,100);
 	status_percent_heal(&sd->bl,100,100);
@@ -4814,6 +4815,7 @@ int pc_checkjoblevelup(struct map_session_data *sd)
 	} while ((next=pc_nextjobexp(sd)) > 0 && sd->status.job_exp >= next);
 	} while ((next=pc_nextjobexp(sd)) > 0 && sd->status.job_exp >= next);
 
 
 	clif_updatestatus(sd,SP_JOBLEVEL);
 	clif_updatestatus(sd,SP_JOBLEVEL);
+	clif_updatestatus(sd,SP_JOBEXP);
 	clif_updatestatus(sd,SP_NEXTJOBEXP);
 	clif_updatestatus(sd,SP_NEXTJOBEXP);
 	clif_updatestatus(sd,SP_SKILLPOINT);
 	clif_updatestatus(sd,SP_SKILLPOINT);
 	status_calc_pc(sd,0);
 	status_calc_pc(sd,0);
@@ -5270,6 +5272,8 @@ int pc_resetlvl(struct map_session_data* sd,int type)
 	clif_updatestatus(sd,SP_BASELEVEL);
 	clif_updatestatus(sd,SP_BASELEVEL);
 	clif_updatestatus(sd,SP_JOBLEVEL);
 	clif_updatestatus(sd,SP_JOBLEVEL);
 	clif_updatestatus(sd,SP_STATUSPOINT);
 	clif_updatestatus(sd,SP_STATUSPOINT);
+	clif_updatestatus(sd,SP_BASEEXP);
+	clif_updatestatus(sd,SP_JOBEXP);
 	clif_updatestatus(sd,SP_NEXTBASEEXP);
 	clif_updatestatus(sd,SP_NEXTBASEEXP);
 	clif_updatestatus(sd,SP_NEXTJOBEXP);
 	clif_updatestatus(sd,SP_NEXTJOBEXP);
 	clif_updatestatus(sd,SP_SKILLPOINT);
 	clif_updatestatus(sd,SP_SKILLPOINT);
@@ -5945,11 +5949,15 @@ int pc_setparam(struct map_session_data *sd,int type,int val)
 		}
 		}
 		sd->status.base_level = (unsigned int)val;
 		sd->status.base_level = (unsigned int)val;
 		sd->status.base_exp = 0;
 		sd->status.base_exp = 0;
-		clif_updatestatus(sd, SP_BASELEVEL);
+		// clif_updatestatus(sd, SP_BASELEVEL);  // Gets updated at the bottom
 		clif_updatestatus(sd, SP_NEXTBASEEXP);
 		clif_updatestatus(sd, SP_NEXTBASEEXP);
 		clif_updatestatus(sd, SP_STATUSPOINT);
 		clif_updatestatus(sd, SP_STATUSPOINT);
 		clif_updatestatus(sd, SP_BASEEXP);
 		clif_updatestatus(sd, SP_BASEEXP);
 		status_calc_pc(sd, 0);
 		status_calc_pc(sd, 0);
+		if(sd->status.party_id)
+		{
+			party_send_levelup(sd);
+		}
 		break;
 		break;
 	case SP_JOBLEVEL:
 	case SP_JOBLEVEL:
 		if ((unsigned int)val >= sd->status.job_level) {
 		if ((unsigned int)val >= sd->status.job_level) {
@@ -5959,11 +5967,10 @@ int pc_setparam(struct map_session_data *sd,int type,int val)
 		}
 		}
 		sd->status.job_level = (unsigned int)val;
 		sd->status.job_level = (unsigned int)val;
 		sd->status.job_exp = 0;
 		sd->status.job_exp = 0;
-		clif_updatestatus(sd, SP_JOBLEVEL);
+		// clif_updatestatus(sd, SP_JOBLEVEL);  // Gets updated at the bottom
 		clif_updatestatus(sd, SP_NEXTJOBEXP);
 		clif_updatestatus(sd, SP_NEXTJOBEXP);
 		clif_updatestatus(sd, SP_JOBEXP);
 		clif_updatestatus(sd, SP_JOBEXP);
 		status_calc_pc(sd, 0);
 		status_calc_pc(sd, 0);
-		clif_updatestatus(sd,type);
 		break;
 		break;
 	case SP_SKILLPOINT:
 	case SP_SKILLPOINT:
 		sd->status.skill_point = val;
 		sd->status.skill_point = val;
@@ -6036,6 +6043,9 @@ int pc_setparam(struct map_session_data *sd,int type,int val)
 	case SP_FAME:
 	case SP_FAME:
 		sd->status.fame = val;
 		sd->status.fame = val;
 		break;
 		break;
+	default:
+		ShowError("pc_setparam: Attempted to set unknown parameter '%d'.\n", type);
+		return 0;
 	}
 	}
 	clif_updatestatus(sd,type);
 	clif_updatestatus(sd,type);