From a337cab31a823d52f405462beb54e0135260b9ba Mon Sep 17 00:00:00 2001
From: glighta <glighta@54d463be-8e91-2dee-dedb-b68131a5f0ec>
Date: Mon, 26 Nov 2012 00:52:01 +0000
Subject: -Fix bugreport:6930 heal -Hp,0; percentheal -100,0; causing crashmap
 -Upd bugreport:6751 with MarkZD followup patch

git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16969 54d463be-8e91-2dee-dedb-b68131a5f0ec
---
 src/map/clif.c   |  2 +-
 src/map/pc.c     | 30 ++++++++----------------------
 src/map/status.c |  3 ++-
 3 files changed, 11 insertions(+), 24 deletions(-)

diff --git a/src/map/clif.c b/src/map/clif.c
index cf5df7f58..a51163827 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -10671,7 +10671,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) && !(skillnum == SR_GENTLETOUCH_CURE && (sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN)))
+    if( pc_cant_act(sd) && skillnum != RK_REFRESH && !(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/pc.c b/src/map/pc.c
index 0e0a4a1b2..9f39b2747 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4076,23 +4076,7 @@ int pc_useitem(struct map_session_data *sd,int n)
     if (nameid != ITEMID_NAUTHIZ && sd->sc.opt1 > 0 && sd->sc.opt1 != OPT1_STONEWAIT && sd->sc.opt1 != OPT1_BURNING)
         return 0;
 
-    if (sd->sc.count) {
-        if ((nameid == ITEMID_NAUTHIZ) && (//bugreport 6751
-                sd->sc.data[SC_FREEZE] ||
-                sd->sc.data[SC_STUN] ||
-                sd->sc.data[SC_DEEPSLEEP] ||
-                sd->sc.data[SC_STONE] ||
-                sd->sc.data[SC_CRYSTALIZE]
-            )
-           ) {
-            sd->sc.opt1 = 0; //remove option and status to allow skill
-            status_change_end(&sd->bl,SC_FREEZE,INVALID_TIMER);
-            status_change_end(&sd->bl,SC_STUN,INVALID_TIMER);
-            status_change_end(&sd->bl,SC_DEEPSLEEP,INVALID_TIMER);
-            status_change_end(&sd->bl,SC_STONE,INVALID_TIMER);
-            status_change_end(&sd->bl,SC_CRYSTALIZE,INVALID_TIMER);
-        }  //let us continue
-        else if (
+    if (sd->sc.count && (
             sd->sc.data[SC_BERSERK] || sd->sc.data[SC__BLOODYLUST] ||
             (sd->sc.data[SC_GRAVITATION] && sd->sc.data[SC_GRAVITATION]->val3 == BCT_SELF) ||
             sd->sc.data[SC_TRICKDEAD] ||
@@ -4101,9 +4085,8 @@ int pc_useitem(struct map_session_data *sd,int n)
             sd->sc.data[SC__MANHOLE] ||
             sd->sc.data[SC_KAGEHUMI] ||
             (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOITEM)
-        )
+        ))
             return 0;
-    }
 
     //Prevent mass item usage. [Skotlex]
     if (DIFF_TICK(sd->canuseitem_tick, tick) > 0 ||
@@ -6620,14 +6603,17 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 
     // Clear anything NPC-related when you die and was interacting with one.
     if (sd->npc_id) {
-        if (sd->state.using_fake_npc)
+        if (sd->state.using_fake_npc){
+            clif_clearunit_single(sd->npc_id, CLR_OUTSIGHT, sd->fd);
             sd->state.using_fake_npc = 0;
+        }
         if (sd->state.menu_or_input)
             sd->state.menu_or_input = 0;
         if (sd->npc_menu)
             sd->npc_menu = 0;
-
-        npc_event_dequeue(sd);
+        sd->npc_id = 0;
+        if(sd->st && sd->st->state != END)
+                sd->st->state = END;
     }
 
     npc_script_event(sd,NPCE_DIE);
diff --git a/src/map/status.c b/src/map/status.c
index af0b7e148..a239be0a1 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -1619,7 +1619,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 
     if (sc && sc->count) {
 
-        if (sc->opt1 >0 && (sc->opt1 != OPT1_CRYSTALIZE && src->type != BL_MOB) && sc->opt1 != OPT1_BURNING && skill_num != SR_GENTLETOUCH_CURE) {   //Stuned/Frozen/etc
+        if (skill_num != RK_REFRESH && sc->opt1 >0 && (sc->opt1 != OPT1_CRYSTALIZE && src->type != BL_MOB) && sc->opt1 != OPT1_BURNING && skill_num != SR_GENTLETOUCH_CURE) {   //Stuned/Frozen/etc
             if (flag != 1) //Can't cast, casted stuff can't damage.
                 return 0;
             if (!(skill_get_inf(skill_num)&INF_GROUND_SKILL))
@@ -8599,6 +8599,7 @@ int status_change_start(struct block_list *bl,enum sc_type type,int rate,int val
             break;
         case SC_SLEEP:
         case SC_DEEPSLEEP:
+            opt_flag = 0;
             sc->opt1 = OPT1_SLEEP;
             break;
         case SC_BURNING:
-- 
cgit v1.2.3-70-g09d2