* fixed job change level not being recorded for 2nd -> 3rd class (bugreport:5383). the fix should be self-regenerating on existing 3rd job characters
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15653 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
9f938e0c70
commit
272d3792c5
@ -8120,7 +8120,8 @@ ACMD_FUNC(stats)
|
|||||||
{ "Luk - %3d", 0 },
|
{ "Luk - %3d", 0 },
|
||||||
{ "Zeny - %d", 0 },
|
{ "Zeny - %d", 0 },
|
||||||
{ "Free SK Points - %d", 0 },
|
{ "Free SK Points - %d", 0 },
|
||||||
{ "JobChangeLvl - %d", 0 },
|
{ "JobChangeLvl (2nd) - %d", 0 },
|
||||||
|
{ "JobChangeLvl (3rd) - %d", 0 },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -8143,7 +8144,8 @@ ACMD_FUNC(stats)
|
|||||||
output_table[11].value = sd->status.luk;
|
output_table[11].value = sd->status.luk;
|
||||||
output_table[12].value = sd->status.zeny;
|
output_table[12].value = sd->status.zeny;
|
||||||
output_table[13].value = sd->status.skill_point;
|
output_table[13].value = sd->status.skill_point;
|
||||||
output_table[14].value = sd->change_level;
|
output_table[14].value = sd->change_level_2nd;
|
||||||
|
output_table[15].value = sd->change_level_3rd;
|
||||||
|
|
||||||
sprintf(job_jobname, "Job - %s %s", job_name(sd->status.class_), "(level %d)");
|
sprintf(job_jobname, "Job - %s %s", job_name(sd->status.class_), "(level %d)");
|
||||||
sprintf(output, msg_txt(53), sd->status.name); // '%s' stats:
|
sprintf(output, msg_txt(53), sd->status.name); // '%s' stats:
|
||||||
|
76
src/map/pc.c
76
src/map/pc.c
@ -1119,7 +1119,8 @@ int pc_reg_received(struct map_session_data *sd)
|
|||||||
{
|
{
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
sd->change_level = pc_readglobalreg(sd,"jobchange_level");
|
sd->change_level_2nd = pc_readglobalreg(sd,"jobchange_level");
|
||||||
|
sd->change_level_3rd = pc_readglobalreg(sd,"jobchange_level_3rd");
|
||||||
sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
|
sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
|
||||||
|
|
||||||
// Cash shop
|
// Cash shop
|
||||||
@ -1494,8 +1495,7 @@ int pc_clean_skilltree(struct map_session_data *sd)
|
|||||||
|
|
||||||
int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
|
int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
|
||||||
{
|
{
|
||||||
int skill_point;
|
int skill_point, novice_skills;
|
||||||
int req_points;
|
|
||||||
int c = sd->class_;
|
int c = sd->class_;
|
||||||
|
|
||||||
if (!battle_config.skillup_limit)
|
if (!battle_config.skillup_limit)
|
||||||
@ -1503,26 +1503,59 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd)
|
|||||||
|
|
||||||
skill_point = pc_calc_skillpoint(sd);
|
skill_point = pc_calc_skillpoint(sd);
|
||||||
|
|
||||||
|
novice_skills = max_level[pc_class2idx(JOB_NOVICE)][1] - 1;
|
||||||
|
|
||||||
// limit 1st class and above to novice job levels
|
// limit 1st class and above to novice job levels
|
||||||
req_points = max_level[pc_class2idx(JOB_NOVICE)][1] - 1;
|
if(skill_point < novice_skills)
|
||||||
if(skill_point < req_points)
|
|
||||||
c = MAPID_NOVICE;
|
|
||||||
|
|
||||||
// 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;
|
c = MAPID_NOVICE;
|
||||||
|
}
|
||||||
|
// limit 2nd class and above to first class job levels (super novices are exempt)
|
||||||
|
else if ((sd->class_&JOBL_2) && (sd->class_&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE)
|
||||||
|
{
|
||||||
|
// regenerate change_level_2nd
|
||||||
|
if (!sd->change_level_2nd)
|
||||||
|
{
|
||||||
|
if (sd->class_&JOBL_THIRD)
|
||||||
|
{
|
||||||
|
// if neither 2nd nor 3rd jobchange levels are known, we have to assume a default for 2nd
|
||||||
|
if (!sd->change_level_3rd)
|
||||||
|
sd->change_level_2nd = max_level[pc_class2idx(pc_mapid2jobid(sd->class_&MAPID_UPPERMASK, sd->status.sex))][1];
|
||||||
|
else
|
||||||
|
sd->change_level_2nd = 1 + skill_point + sd->status.skill_point
|
||||||
|
- (sd->status.job_level - 1)
|
||||||
|
- (sd->change_level_3rd - 1)
|
||||||
|
- novice_skills;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sd->change_level_2nd = 1 + skill_point + sd->status.skill_point
|
||||||
|
- (sd->status.job_level - 1)
|
||||||
|
- novice_skills;
|
||||||
|
|
||||||
if (skill_point < req_points)
|
}
|
||||||
|
|
||||||
|
pc_setglobalreg (sd, "jobchange_level", sd->change_level_2nd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skill_point < novice_skills + (sd->change_level_2nd - 1))
|
||||||
{
|
{
|
||||||
c &= MAPID_BASEMASK;
|
c &= MAPID_BASEMASK;
|
||||||
}
|
}
|
||||||
// limit 3rd class to 2nd class/trans job levels
|
// limit 3rd class to 2nd class/trans job levels
|
||||||
else if(sd->class_&JOBL_THIRD)
|
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;
|
// regenerate change_level_3rd
|
||||||
|
if (!sd->change_level_3rd)
|
||||||
|
{
|
||||||
|
sd->change_level_3rd = 1 + skill_point + sd->status.skill_point
|
||||||
|
- (sd->status.job_level - 1)
|
||||||
|
- (sd->change_level_2nd - 1)
|
||||||
|
- novice_skills;
|
||||||
|
pc_setglobalreg (sd, "jobchange_level_3rd", sd->change_level_3rd);
|
||||||
|
}
|
||||||
|
|
||||||
if (skill_point < req_points)
|
if (skill_point < novice_skills + (sd->change_level_2nd - 1) + (sd->change_level_3rd - 1))
|
||||||
c &= MAPID_UPPERMASK;
|
c &= MAPID_UPPERMASK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6657,13 +6690,16 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
|
|||||||
|
|
||||||
if ((unsigned short)b_class == sd->class_)
|
if ((unsigned short)b_class == sd->class_)
|
||||||
return 1; //Nothing to change.
|
return 1; //Nothing to change.
|
||||||
// check if we are changing from 1st to 2nd job
|
|
||||||
if (b_class&JOBL_2) {
|
// changing from 1st to 2nd job
|
||||||
if (!(sd->class_&JOBL_2))
|
if ((b_class&JOBL_2) && !(sd->class_&JOBL_2) && (b_class&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE) {
|
||||||
sd->change_level = sd->status.job_level;
|
sd->change_level_2nd = sd->status.job_level;
|
||||||
else if (!sd->change_level)
|
pc_setglobalreg (sd, "jobchange_level", sd->change_level_2nd);
|
||||||
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);
|
// changing from 2nd to 3rd job
|
||||||
|
else if((b_class&JOBL_THIRD) && !(sd->class_&JOBL_THIRD)) {
|
||||||
|
sd->change_level_3rd = sd->status.job_level;
|
||||||
|
pc_setglobalreg (sd, "jobchange_level_3rd", sd->change_level_3rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sd->cloneskill_id) {
|
if(sd->cloneskill_id) {
|
||||||
|
@ -392,7 +392,8 @@ struct map_session_data {
|
|||||||
int eventtimer[MAX_EVENTTIMER];
|
int eventtimer[MAX_EVENTTIMER];
|
||||||
unsigned short eventcount; // [celest]
|
unsigned short eventcount; // [celest]
|
||||||
|
|
||||||
unsigned char change_level; // [celest]
|
unsigned char change_level_2nd; // job level when changing from 1st to 2nd class [jobchange_level in global_reg_value]
|
||||||
|
unsigned char change_level_3rd; // job level when changing from 2nd to 3rd class [jobchange_level_3rd in global_reg_value]
|
||||||
|
|
||||||
char fakename[NAME_LENGTH]; // fake names [Valaris]
|
char fakename[NAME_LENGTH]; // fake names [Valaris]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user