Skip to content

Commit

Permalink
Move clearing of SC_REPRODUCE copied skill to its own function pc->cl…
Browse files Browse the repository at this point in the history
…ear_existing_reproduceskill
  • Loading branch information
skyleo committed May 31, 2024
1 parent 18afc41 commit a77014e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 23 deletions.
43 changes: 30 additions & 13 deletions src/map/pc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
{

Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions src/map/pc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 2 additions & 10 deletions src/map/skill.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit a77014e

Please sign in to comment.