From 5b2f4e63a7b894c5438052f9fabef4885c4b6bbc Mon Sep 17 00:00:00 2001 From: eppc0330 <47050704+eppc0330@users.noreply.github.com> Date: Tue, 3 Oct 2023 23:18:02 +0900 Subject: [PATCH] Fix temp skill not removed (#7939) Fixes #5382 --- src/map/clif.cpp | 7 +++++-- src/map/clif.hpp | 2 +- src/map/status.cpp | 10 +++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 93c7c369ff..db1ba4ef3d 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -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 .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). diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 1bf10b262a..94456558e5 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -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); diff --git a/src/map/status.cpp b/src/map/status.cpp index ff16ea0a4a..7b7b360785 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -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))