Refactor SOA_TALISMAN_OF_PROTECTION

This commit is contained in:
Lemongrass3110
2024-03-11 23:51:28 +01:00
parent 010e6fa2ea
commit 9afae11288
2 changed files with 22 additions and 12 deletions

View File

@@ -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:

View File

@@ -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;
}