diff --git a/src/map/skill.cpp b/src/map/skill.cpp index e40cc19e99..d474bd9cc8 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -570,6 +570,13 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk hp_bonus += skill * 2; #endif break; + + case SOA_TALISMAN_OF_PROTECTION: + hp = 500 * skill_lv; + hp += pc_checkskill( sd, SOA_TALISMAN_MASTERY ) * 50 * skill_lv; + hp += ( status_get_lv( src ) + status_get_crt( src ) ) * 20; + break; + default: if (skill_lv >= battle_config.max_heal_lv) return battle_config.max_heal; @@ -8091,6 +8098,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case DK_SERVANTWEAPON: case ABC_FROM_THE_ABYSS: + case SOA_TALISMAN_OF_PROTECTION: clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); break; @@ -13030,17 +13038,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui pc_addsoulball(sd,limit); } break; - case SOA_TALISMAN_OF_PROTECTION: - if (flag&1) { - int heal_amount = 500 * skill_lv; - heal_amount += pc_checkskill(sd, SOA_TALISMAN_MASTERY) * 50 * skill_lv; - heal_amount += (status_get_lv(src) + status_get_crt(src)) * 20; - - status_heal(bl, heal_amount, 0, 0, 2); - } else - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); - break; case SOA_TALISMAN_OF_WARRIOR: case SOA_TALISMAN_OF_MAGICIAN: case SOA_TALISMAN_OF_FIVE_ELEMENTS: diff --git a/src/map/status.cpp b/src/map/status.cpp index 7c5c614c53..0be0d25d52 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -12800,7 +12800,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val3 = 10 * val1; break; case SC_TALISMAN_OF_PROTECTION: - val2 = 2 * val1; tick_time = status_get_sc_interval(type); val4 = tick - tick_time; // Remaining time break; @@ -14978,7 +14977,20 @@ TIMER_FUNC(status_change_timer){ return 0; case SC_TALISMAN_OF_PROTECTION: if( sce->val4 >= 0 ){ - skill_castend_nodamage_id( bl, bl, SOA_TALISMAN_OF_PROTECTION, sce->val1, tick, 1 ); + // Get the original caster + map_session_data* ssd = map_id2sd( sce->val2 ); + + // If the caster is offline, dead, on another map or + // if the target is not a player or is in another party + if( ssd == nullptr || status_isdead( &ssd->bl ) || ssd->bl.m != bl->m || sd == nullptr || ssd->status.party_id != sd->status.party_id ){ + // End the status change + sce->val4 = 0; + break; + } + + int hp = skill_calc_heal( &ssd->bl, bl, SOA_TALISMAN_OF_PROTECTION, sce->val1, true ); + + status_heal( bl, hp, 0, 0, 2 ); } break; }