summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/skill.c43
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: