diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/clif.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 43 |
2 files changed, 28 insertions, 17 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index 942886b5c..62ead6c1b 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -10582,7 +10582,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) // Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex] sd->idletime = last_tick; - if( pc_cant_act(sd) ) + if( pc_cant_act(sd) && !(skillnum == SR_GENTLETOUCH_CURE && (sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN)) ) return; if( pc_issit(sd) ) return; diff --git a/src/map/skill.c b/src/map/skill.c index 3000023d3..1e8f57c5a 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -8091,23 +8091,34 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in break; case SR_GENTLETOUCH_CURE: - if( status_isimmune(bl) ) { - clif_skill_nodamage(src,bl,skillid,skilllv,0); - break; - } - if( (tsc && tsc->opt1) && rand()%100 < 5 * skilllv ) { - status_change_end(bl, SC_STONE, -1 ); - status_change_end(bl, SC_FREEZE, -1 ); - status_change_end(bl, SC_STUN, -1 ); - status_change_end(bl, SC_POISON, -1 ); - status_change_end(bl, SC_SILENCE, -1 ); - status_change_end(bl, SC_BLIND, -1 ); - status_change_end(bl, SC_HALLUCINATION, -1 ); - status_change_end(bl, SC_BURNING, -1 ); - status_change_end(bl, SC_FREEZING, -1 ); - skill_castend_nodamage_id(src, bl, AL_HEAL, skilllv, tick, flag); + { + int heal; + + if( status_isimmune(bl) ) + { + clif_skill_nodamage(src,bl,skillid,skilllv,0); + break; + } + + heal = 120 * skilllv + status_get_max_hp(bl) * (2 + skilllv) / 100; + status_heal(bl, heal, 0, 0); + clif_skill_nodamage(src, bl, AL_HEAL, heal, 1); + + if( (tsc && tsc->opt1) && (rnd()%100 < ((skilllv * 5) + (status_get_dex(src) + status_get_lv(src)) / 4) - (1 + (rnd() % 10))) ) + { + status_change_end(bl, SC_STONE, INVALID_TIMER); + status_change_end(bl, SC_FREEZE, INVALID_TIMER); + status_change_end(bl, SC_STUN, INVALID_TIMER); + status_change_end(bl, SC_POISON, INVALID_TIMER); + status_change_end(bl, SC_SILENCE, INVALID_TIMER); + status_change_end(bl, SC_BLIND, INVALID_TIMER); + status_change_end(bl, SC_HALLUCINATION, INVALID_TIMER); + status_change_end(bl, SC_BURNING, INVALID_TIMER); + status_change_end(bl, SC_FREEZING, INVALID_TIMER); + } + + clif_skill_nodamage(src,bl,skillid,skilllv,1); } - clif_skill_nodamage(src,bl,skillid,skilllv,1); break; case WA_SWING_DANCE: case WA_MOONLIT_SERENADE: |