diff options
-rw-r--r-- | src/map/battle.c | 7 | ||||
-rw-r--r-- | src/map/skill.c | 20 | ||||
-rw-r--r-- | src/map/status.c | 13 |
3 files changed, 17 insertions, 23 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 07a195503..fbc166874 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -5393,8 +5393,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st sc = NULL; if( sc ) { - if (sc->data[SC_DEVOTION] && !(wd->flag & BF_SKILL)) - return; // No reflect for basic attacks on devoted characters + if (wd->flag & BF_SHORT && !(skill->get_inf(skill_id) & (INF_GROUND_SKILL | INF_SELF_SKILL))) { if( sc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < sc->data[SC_CRESCENTELBOW]->val2 ){ @@ -5461,7 +5460,9 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st if( wd->dmg_lv >= ATK_BLOCK ) {/* yes block still applies, somehow gravity thinks it makes sense. */ if( sc ) { - if( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION && skill_id != GS_DESPERADO ) { + if( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION && skill_id != GS_DESPERADO + && !(!(wd->flag&BF_SKILL) && sc->data[SC_DEVOTION]) + ) { NORMALIZE_RDAMAGE(damage * sc->data[SC_REFLECTSHIELD]->val2 / 100); #ifndef RENEWAL diff --git a/src/map/skill.c b/src/map/skill.c index 7d5f0d021..94f865d21 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -11470,9 +11470,7 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int64 tick if (!sce) sc_start4(ss,bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit); break; - case UNT_APPLEIDUN: // Apple of idun gets it from skill_unit_onplace_timer - if (!battle_config.song_timer_reset) - break; + case UNT_APPLEIDUN: case UNT_WHISTLE: case UNT_ASSASSINCROSS: case UNT_POEMBRAGI: @@ -11492,7 +11490,7 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int64 tick timer->delete(sce->timer, status->change_timer); sce->timer = timer->add(tick+sg->limit, status->change_timer, bl->id, type); } - + break; case UNT_FOGWALL: @@ -11868,22 +11866,16 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 if( md && md->class_ == MOBID_EMPERIUM ) break; #endif - if( sg->src_id == bl->id && !(tsc && tsc->data[SC_SOULLINK] && tsc->data[SC_SOULLINK]->val2 == SL_BARDDANCER) ) - break; // affects self only when soullinked + if( sg->src_id == bl->id && !(tsc && tsc->data[SC_SOULLINK] && tsc->data[SC_SOULLINK]->val2 == SL_BARDDANCER) + || (!(battle_config.song_timer_reset) && tsc && tsc->data[type] && tsc->data[type]->val4 == 1)) + break; heal = skill->calc_heal(ss,bl,sg->skill_id, sg->skill_lv, true); if( tsc->data[SC_AKAITSUKI] && heal ) heal = ~heal + 1; clif->skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); status->heal(bl, heal, 0, 0); - - if (!(battle_config.song_timer_reset) // songs don't reset prior timers - && !(sg->src_id == bl->id && !(tsc && tsc->data[SC_SOULLINK] && tsc->data[SC_SOULLINK]->val2 == SL_BARDDANCER)) // Don't affect itself - && (!(tsc->data[type]) || (tsc->data[type] && tsc->data[type]->val4 != 1))) // Check for 20 seconds song effect - sc_start4(ss,bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->interval + 100); - - break; } - + break; case UNT_TATAMIGAESHI: case UNT_DEMONSTRATION: skill->attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); diff --git a/src/map/status.c b/src/map/status.c index 323a01c56..b17c8d5d0 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1790,7 +1790,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin //If targeting, cloak+hide protect you, otherwise only hiding does. hide_flag = flag?OPTION_HIDE:(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK); - //You cannot hide from ground skills. + // There is no NF for ground skills, but every earth type skill out there + // affects hidding except Stone Curse if( skill->get_ele(skill_id,1) == ELE_EARTH && skill_id != MG_STONECURSE) hide_flag &= ~OPTION_HIDE; @@ -6704,11 +6705,11 @@ void status_display_remove(struct map_session_data *sd, enum sc_type type) { * 'rate' = base success rate. 10000 = 100% * 'tick' is base duration * 'flag': -* &1: Cannot be avoided (it has to start) -* &2: Tick should not be reduced (by vit, luk, lv, etc) -* &4: sc_data loaded, no value has to be altered. -* &8: rate should not be reduced (not evaluated here, but in some calls to other functions) -* &16: SI will not be sent to the client +* &1 : Cannot be avoided (it has to start) +* &2 : Tick should not be reduced (by vit, luk, lv, etc) +* &4 : sc_data loaded, no value has to be altered. +* &8 : rate should not be reduced (not evaluated here, but in some calls to other functions) +* &16: Status icon (SI) should not be send *------------------------------------------*/ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_type type, int rate, int val1, int val2, int val3, int val4, int tick, int flag) { struct map_session_data *sd = NULL; |