diff --git a/src/map/pc.c b/src/map/pc.c index 4b90b62216a..ee7358627b3 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -8831,7 +8831,7 @@ static int jobchange_killclone(struct block_list *bl, va_list ap) static int pc_jobchange(struct map_session_data *sd, int class, int upper) { int i, fame_flag=0; - int job, idx = 0; + int job = 0; nullpo_ret(sd); @@ -8872,18 +8872,7 @@ static int pc_jobchange(struct map_session_data *sd, int class, int upper) pc->clear_existing_cloneskill(sd, true); - if(sd->reproduceskill_id) { - idx = skill->get_index(sd->reproduceskill_id); - if( sd->status.skill[idx].flag == SKILL_FLAG_PLAGIARIZED ) { - sd->status.skill[idx].id = 0; - sd->status.skill[idx].lv = 0; - sd->status.skill[idx].flag = 0; - clif->deleteskill(sd, sd->reproduceskill_id, false); - } - sd->reproduceskill_id = 0; - pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL"),0); - pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL_LV"),0); - } + pc->clear_existing_reproduceskill(sd, true); if ((job & MAPID_UPPERMASK) != (sd->job & MAPID_UPPERMASK)) { //Things to remove when changing class tree. const int class_idx = pc->class2idx(sd->status.class); @@ -12664,6 +12653,33 @@ static void pc_clear_existing_cloneskill(struct map_session_data *sd, bool clear } } +/** + * Clears / removes the existing reproduced skill from SC_REPRODUCE + * + * @param sd The player to clear the reproduced skill from. + * @param clear_vars If true, the remembered reproduced skill level and ID will be cleared, otherwise it will not be touched. + */ +static void pc_clear_existing_reproduceskill(struct map_session_data *sd, bool clear_vars) +{ + nullpo_retv(sd); + + if (sd->reproduceskill_id != 0) { + int idx = skill->get_index(sd->reproduceskill_id); + if (sd->status.skill[idx].flag == SKILL_FLAG_PLAGIARIZED) { + sd->status.skill[idx].id = 0; + sd->status.skill[idx].lv = 0; + sd->status.skill[idx].flag = 0; + clif->deleteskill(sd, sd->reproduceskill_id, false); + } + } + + if (clear_vars) { + sd->reproduceskill_id = 0; + pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL"), 0); + pc_setglobalreg(sd, script->add_variable("REPRODUCE_SKILL_LV"), 0); + } +} + static void do_final_pc(void) { @@ -13093,4 +13109,5 @@ void pc_defaults(void) pc->is_own_skill = pc_is_own_skill; pc->clear_existing_cloneskill = pc_clear_existing_cloneskill; + pc->clear_existing_reproduceskill = pc_clear_existing_reproduceskill; } diff --git a/src/map/pc.h b/src/map/pc.h index bd5a84e54ec..6b8b32bf7bf 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -1286,6 +1286,7 @@ END_ZEROED_BLOCK; /* End */ bool (*is_own_skill) (struct map_session_data *sd, uint16 skill_id); void (*clear_existing_cloneskill) (struct map_session_data *sd, bool clear_vars); + void (*clear_existing_reproduceskill) (struct map_session_data *sd, bool clear_vars); }; #ifdef HERCULES_CORE diff --git a/src/map/skill.c b/src/map/skill.c index 7551bbae7fc..0c92bd6e627 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3681,7 +3681,7 @@ static int skill_attack(int attack_type, struct block_list *src, struct block_li break; } - int cidx, idx, lv = 0; + int cidx, lv = 0; cidx = skill->get_index(copy_skill); switch(can_copy(tsd, copy_skill)) { case 1: // Plagiarism @@ -3710,15 +3710,7 @@ static int skill_attack(int attack_type, struct block_list *src, struct block_li case 2: // Reproduce { lv = sc ? sc->data[SC__REPRODUCE]->val1 : 1; - if (tsd->reproduceskill_id) { - idx = skill->get_index(tsd->reproduceskill_id); - if (tsd->status.skill[idx].flag == SKILL_FLAG_PLAGIARIZED) { - tsd->status.skill[idx].id = 0; - tsd->status.skill[idx].lv = 0; - tsd->status.skill[idx].flag = 0; - clif->deleteskill(tsd, tsd->reproduceskill_id, false); - } - } + pc->clear_existing_reproduceskill(tsd, false); lv = min(lv, skill->get_max(copy_skill)); tsd->reproduceskill_id = copy_skill;