|
@@ -4477,11 +4477,20 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
|
// Item reflect gets calculated first
|
|
// Item reflect gets calculated first
|
|
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, 0);
|
|
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, 0);
|
|
if( rdamage > 0 ) {
|
|
if( rdamage > 0 ) {
|
|
- //Use Reflect Shield to signal this kind of skill trigger. [Skotlex]
|
|
|
|
- rdelay = clif_damage(src, src, tick, wd->amotion, sstatus->dmotion, rdamage, 1, 4, 0);
|
|
|
|
|
|
+ bool isDevotRdamage = false;
|
|
|
|
+ //Get info if the attacker has Devotion from other player
|
|
|
|
+ struct status_change *ssc = NULL;
|
|
|
|
+ struct block_list *d_bl = NULL;
|
|
|
|
+ if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rand()%100) {
|
|
|
|
+ ssc = status_get_sc(src);;
|
|
|
|
+ if (ssc && ssc->data[SC_DEVOTION] && (d_bl = map_id2bl(ssc->data[SC_DEVOTION]->val1)))
|
|
|
|
+ isDevotRdamage = true;
|
|
|
|
+ }
|
|
|
|
+ rdelay = clif_damage(src, (!isDevotRdamage) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, 4, 0);
|
|
if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src));
|
|
if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src));
|
|
- battle_delay_damage(tick, wd->amotion,target,src,0,CR_REFLECTSHIELD,0,rdamage,ATK_DEF,rdelay,true);
|
|
|
|
- skill_additional_effect(target, src, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
|
|
|
|
|
+ //Use Reflect Shield to signal this kind of skill trigger. [Skotlex]
|
|
|
|
+ battle_delay_damage(tick, wd->amotion,target,(!isDevotRdamage) ? src : d_bl,0,CR_REFLECTSHIELD,0,rdamage,ATK_DEF,rdelay,true);
|
|
|
|
+ skill_additional_effect(target, (!isDevotRdamage) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
|
}
|
|
}
|
|
|
|
|
|
// Calculate skill reflect damage separately
|
|
// Calculate skill reflect damage separately
|
|
@@ -4489,6 +4498,15 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
|
struct status_data *tstatus = status_get_status_data(target);
|
|
struct status_data *tstatus = status_get_status_data(target);
|
|
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, 1);
|
|
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, 1);
|
|
if( rdamage > 0 ) {
|
|
if( rdamage > 0 ) {
|
|
|
|
+ bool isDevotRdamage = false;
|
|
|
|
+ //Get info if the attacker has Devotion from other player
|
|
|
|
+ struct status_change *ssc = NULL;
|
|
|
|
+ struct block_list *d_bl = NULL;
|
|
|
|
+ if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rand()%100) {
|
|
|
|
+ ssc = status_get_sc(src);;
|
|
|
|
+ if (ssc && ssc->data[SC_DEVOTION] && (d_bl = map_id2bl(ssc->data[SC_DEVOTION]->val1)))
|
|
|
|
+ isDevotRdamage = true;
|
|
|
|
+ }
|
|
//if(tsc->data[SC__SHADOWFORM]) {
|
|
//if(tsc->data[SC__SHADOWFORM]) {
|
|
// struct block_list *s_bl = map_id2bl(tsc->data[SC__SHADOWFORM]->val2);
|
|
// struct block_list *s_bl = map_id2bl(tsc->data[SC__SHADOWFORM]->val2);
|
|
// if(s_bl)
|
|
// if(s_bl)
|
|
@@ -4500,11 +4518,11 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
|
if(attack_type == BF_WEAPON && tsc->data[SC_REFLECTDAMAGE] ) // Don't reflect your own damage (Grand Cross)
|
|
if(attack_type == BF_WEAPON && tsc->data[SC_REFLECTDAMAGE] ) // Don't reflect your own damage (Grand Cross)
|
|
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,tstatus->race);
|
|
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,tstatus->race);
|
|
else if(attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
|
else if(attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
|
- rdelay = clif_damage(src, src, tick, wd->amotion, sstatus->dmotion, rdamage, 1, 4, 0);
|
|
|
|
|
|
+ rdelay = clif_damage(src, (!isDevotRdamage) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, 4, 0);
|
|
if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src));
|
|
if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, is_boss(src));
|
|
// It appears that official servers give skill reflect damage a longer delay
|
|
// It appears that official servers give skill reflect damage a longer delay
|
|
- battle_delay_damage(tick, wd->amotion,target,src,0,CR_REFLECTSHIELD,0,rdamage,ATK_DEF,rdelay,true);
|
|
|
|
- skill_additional_effect(target, src, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
|
|
|
|
|
+ battle_delay_damage(tick, wd->amotion,target,(!isDevotRdamage) ? src : d_bl,0,CR_REFLECTSHIELD,0,rdamage,ATK_DEF,rdelay,true);
|
|
|
|
+ skill_additional_effect(target, (!isDevotRdamage) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -7264,6 +7282,7 @@ static const struct _battle_data {
|
|
{ "emblem_transparency_limit", &battle_config.emblem_transparency_limit, 80, 0, 100, },
|
|
{ "emblem_transparency_limit", &battle_config.emblem_transparency_limit, 80, 0, 100, },
|
|
{ "discount_item_point_shop", &battle_config.discount_item_point_shop, 0, 0, 3, },
|
|
{ "discount_item_point_shop", &battle_config.discount_item_point_shop, 0, 0, 3, },
|
|
{ "update_enemy_position", &battle_config.update_enemy_position, 0, 0, 1, },
|
|
{ "update_enemy_position", &battle_config.update_enemy_position, 0, 0, 1, },
|
|
|
|
+ { "devotion_rdamage", &battle_config.devotion_rdamage, 0, 0, 100, },
|
|
};
|
|
};
|
|
#ifndef STATS_OPT_OUT
|
|
#ifndef STATS_OPT_OUT
|
|
/**
|
|
/**
|