Skip to content

Commit

Permalink
Implementing #define DEVOTION_REFLECT_DAMAGE
Browse files Browse the repository at this point in the history
When enabled, reflect damage doesn't bypass devotion (and thus damage is passed to crusader)
Configurable in src/config/general.h
As requested by the community (in http://hercules.ws/board/topic/421-suggestion-d/ ) and provided in pull request #209 by Jedzkie. (Committing on his behalf due to issue with automatic merge)
Closes #209

Signed-off-by: shennetsind <ind@henn.et>
  • Loading branch information
shennetsind committed Dec 18, 2013
1 parent fbf96e6 commit 36d0c78
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/config/classes/general.h
Expand Up @@ -10,8 +10,8 @@

/**
* Default Magical Reflection Behavior
* - When reflecting, reflected damage depends on gears caster is wearing, not target
* - When disabled damage depends on gears target is wearing, not caster.
* - When reflecting, reflected damage depends on gears caster is wearing, not target (official)
* - When disabled damage depends on gears target is wearing, not caster. (old/eathena)
* @values 1 (enabled) or 0 (disabled)
**/
#define MAGIC_REFLECTION_TYPE 1
Expand All @@ -21,6 +21,12 @@
**/
#define MAX_SPIRITBALL 15

/**
* when enabled, reflect damage doesn't bypass devotion (and thus damage is passed to crusader)
* uncomment to enable
**/
//#define DEVOTION_REFLECT_DAMAGE

/**
* No settings past this point
**/
Expand Down
15 changes: 15 additions & 0 deletions src/map/status.c
Expand Up @@ -1168,6 +1168,21 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp,
if( hp && !(flag&1) ) {
if( sc ) {
struct status_change_entry *sce;

#ifdef DEVOTION_REFLECT_DAMAGE
if(src && (sce = sc->data[SC_DEVOTION])) {
struct block_list *d_bl = map->id2bl(sce->val1);

if(d_bl &&((d_bl->type == BL_MER && ((TBL_MER *)d_bl)->master && ((TBL_MER *)d_bl)->master->bl.id == target->id)
|| (d_bl->type == BL_PC && ((TBL_PC *)d_bl)->devotion[sce->val2] == target->id)) && check_distance_bl(target, d_bl, sce->val3)) {
clif->damage(d_bl, d_bl, 0, 0, hp, 0, 0, 0);
status_fix_damage(NULL, d_bl, hp, 0);
return 0;
}
status_change_end(target, SC_DEVOTION, INVALID_TIMER);
}
#endif

if (sc->data[SC_STONE] && sc->opt1 == OPT1_STONE)
status_change_end(target, SC_STONE, INVALID_TIMER);
status_change_end(target, SC_FREEZE, INVALID_TIMER);
Expand Down

0 comments on commit 36d0c78

Please sign in to comment.