Browse Source

Fixed crash with supernovices with 100% base exp

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@511 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 years ago
parent
commit
71697f98c5
3 changed files with 29 additions and 20 deletions
  1. 2 0
      Changelog.txt
  2. 21 18
      src/map/clif.c
  3. 6 2
      src/map/pc.c

+ 2 - 0
Changelog.txt

@@ -1,6 +1,8 @@
 Date	Added
 12/8
+        * Fixed crash with supernovices with 100% base exp [celest]
 	* Updated the readme a little. [Mass Zero]
+
 12/7
 	* Added GUILDCACHE #define to int_guild.c for testing performance
 	  effects [MouseJstr]

+ 21 - 18
src/map/clif.c

@@ -7729,24 +7729,27 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <
 	WFIFOSET(fd, WFIFOW(fd,2));
 
 	// Celest
-	if (pc_calc_base_job2 (sd->status.class) == 23 && (sd->status.base_exp*100/pc_nextbaseexp(sd))%10 == 0) {
-		estr_lower(RFIFOP(fd,4));
-		if (sd->state.snovice_flag == 0 && strstr(RFIFOP(fd,4), "guardian angel, can you hear my voice? ^^;"))
-			sd->state.snovice_flag = 1;
-		else if (sd->state.snovice_flag == 1) {
-			sprintf(message, "my name is %s, and i'm a super novice~", sd->status.name);
-			estr_lower(message);
-			if (strstr(RFIFOP(fd,4), message))
-				sd->state.snovice_flag = 2;
-		}
-		else if (sd->state.snovice_flag == 2 && strstr(RFIFOP(fd,4), "please help me~ t.t"))
-			sd->state.snovice_flag = 3;
-		else if (sd->state.snovice_flag == 3) {
-			int i;
-			skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],1,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 );
-			for(i=0;i<5;i++)
-				pc_addspiritball(sd,skill_get_time(MO_CALLSPIRITS,1),5);
-			sd->state.snovice_flag = 0;
+	if (pc_calc_base_job2 (sd->status.class) == 23 ) {
+		int next = pc_nextbaseexp(sd)>0 ? pc_nextbaseexp(sd) : sd->status.base_exp;
+		if ((sd->status.base_exp*100/next)%10 == 0) {
+			estr_lower(RFIFOP(fd,4));
+			if (sd->state.snovice_flag == 0 && strstr(RFIFOP(fd,4), "guardian angel, can you hear my voice? ^^;"))
+				sd->state.snovice_flag = 1;
+			else if (sd->state.snovice_flag == 1) {
+				sprintf(message, "my name is %s, and i'm a super novice~", sd->status.name);
+				estr_lower(message);
+				if (strstr(RFIFOP(fd,4), message))
+					sd->state.snovice_flag = 2;
+			}
+			else if (sd->state.snovice_flag == 2 && strstr(RFIFOP(fd,4), "please help me~ t.t"))
+				sd->state.snovice_flag = 3;
+			else if (sd->state.snovice_flag == 3) {
+				int i;
+				skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],1,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 );
+				for(i=0;i<5;i++)
+					pc_addspiritball(sd,skill_get_time(MO_CALLSPIRITS,1),5);
+				sd->state.snovice_flag = 0;
+			}
 		}
 	}
 

+ 6 - 2
src/map/pc.c

@@ -5433,8 +5433,12 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 	pc_calcstatus(sd,0);
 
 	// activate Steel body if a super novice dies at 99+% exp [celest]
-	if (s_class.job == 23 && (i=sd->status.base_exp*1000/pc_nextbaseexp(sd))>=990 && i<=1000)
-		sd->state.snovice_flag = 4;
+	if (s_class.job == 23) {
+		if ((i=pc_nextbaseexp(sd))<=0)
+			i=sd->status.base_exp;
+		if ((j=sd->status.base_exp*1000/i)>=990 && j<=1000)
+			sd->state.snovice_flag = 4;
+	}
 
 	for(i=0;i<5;i++)
 		if(sd->dev.val1[i]){