Fix temp skill not removed (#7939)

Fixes #5382
This commit is contained in:
eppc0330 2023-10-03 23:18:02 +09:00 committed by GitHub
parent a7f05bf696
commit 5b2f4e63a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 4 deletions

View File

@ -5799,7 +5799,7 @@ void clif_addskill(map_session_data *sd, int skill_id)
/// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE).
/// 0441 <skill id>.W
void clif_deleteskill(map_session_data *sd, int skill_id)
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock)
{
#if PACKETVER >= 20081217
nullpo_retv(sd);
@ -5815,7 +5815,10 @@ void clif_deleteskill(map_session_data *sd, int skill_id)
WFIFOW(fd,2) = skill_id;
WFIFOSET(fd,packet_len(0x441));
#endif
clif_skillinfoblock(sd);
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
if (!skip_infoblock)
#endif
clif_skillinfoblock(sd);
}
/// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE).

View File

@ -735,7 +735,7 @@ void clif_skillinfoblock(map_session_data *sd);
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
void clif_addskill(map_session_data *sd, int skill_id);
void clif_deleteskill(map_session_data *sd, int skill_id);
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false);
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
void clif_skillcastcancel(struct block_list* bl);

View File

@ -4833,8 +4833,16 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
calculating = 0;
return 0;
}
if(memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)))
if(memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill))) {
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
for (i = 0; i < MAX_SKILL; i++) {
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
clif_deleteskill(sd, b_skill[i].id, true);
}
#endif
clif_skillinfoblock(sd);
}
// If the skill is learned, the status is infinite.
if (pc_checkskill(sd, SU_SPRITEMABLE) > 0 && !sd->sc.getSCE(SC_SPRITEMABLE))