Browse Source

* fixed third class skill point allocation logic (follow-up to r15594, bugreport:5329)
* replaced some hard-coded constant values in the vicinity with DB lookups
- removed semi-sensible special scenarios for borked GM character's skill trees in pc_calc_skilltree_normalize_job

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

lordttseven 13 năm trước cách đây
mục cha
commit
7ed49a2dad
1 tập tin đã thay đổi với 29 bổ sung16 xóa
  1. 29 16
      src/map/pc.c

+ 29 - 16
src/map/pc.c

@@ -1495,28 +1495,41 @@ int pc_clean_skilltree(struct map_session_data *sd)
 int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
 {
 	int skill_point;
+	int req_points;
 	int c = sd->class_;
 	
 	if (!battle_config.skillup_limit)
 		return c;
 	
 	skill_point = pc_calc_skillpoint(sd);
-	if(pc_checkskill(sd, NV_BASIC) < 9) //Consider Novice Tree when you don't have NV_BASIC maxed.
+
+	// limit 1st class and above to novice job levels
+	req_points = max_level[pc_class2idx(JOB_NOVICE)][1] - 1;
+	if(skill_point < req_points)
 		c = MAPID_NOVICE;
-	else
-	//Do not send S. Novices to first class (Novice)
-	if ((sd->class_&JOBL_2) && (sd->class_&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE &&
-		sd->status.skill_point >= sd->status.job_level &&
-		((sd->change_level > 0 && skill_point < sd->change_level+8) || skill_point < 58)) {
-		//Send it to first class.
-		c &= MAPID_BASEMASK;
-	}
-	if (sd->class_&JOBL_UPPER) //Convert to Upper
-		c |= JOBL_UPPER;
-	else if (sd->class_&JOBL_BABY) //Convert to Baby
-		c |= JOBL_BABY;
-	if( sd->class_&JOBL_THIRD && skill_point < 107 )//bugreport:5329, require to spend all 2.x points in your 2.x
-		c &= MAPID_UPPERMASK;	
+
+	// limit 2nd class and above to first class job levels (super novices are exempt)
+	if ((sd->class_&JOBL_2) && (sd->class_&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE)
+	{
+		req_points += (sd->change_level > 0 ? sd->change_level : max_level[pc_class2idx(pc_mapid2jobid(sd->class_&MAPID_BASEMASK, sd->status.sex))][1]) - 1;
+
+		if (skill_point < req_points)
+		{
+			c &= MAPID_BASEMASK;
+		}
+		// limit 3rd class to 2nd class/trans job levels
+		else if(sd->class_&JOBL_THIRD)
+		{
+			req_points += max_level[pc_class2idx(pc_mapid2jobid(sd->class_&(MAPID_UPPERMASK|JOBL_UPPER), sd->status.sex))][1] - 1;
+
+			if (skill_point < req_points)
+				c &= MAPID_UPPERMASK;
+		}
+	}
+
+	// restore non-limiting flags
+	c |= sd->class_&(JOBL_UPPER|JOBL_BABY);
+
 	return c;
 }
 
@@ -6649,7 +6662,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
 		if (!(sd->class_&JOBL_2))
 			sd->change_level = sd->status.job_level;
 		else if (!sd->change_level)
-			sd->change_level = 40; //Assume 40?
+			sd->change_level = max_level[pc_class2idx(pc_mapid2jobid(sd->class_&MAPID_BASEMASK, sd->status.sex))][1]; // Assume max level
 		pc_setglobalreg (sd, "jobchange_level", sd->change_level);
 	}