From ef1cac570726f59c821ebafd1980302c0035d3ce Mon Sep 17 00:00:00 2001
From: Fate <fate-tmw@googlemail.com>
Date: Tue, 30 Dec 2008 04:15:32 -0700
Subject: Added OnPCDieEvent and OnPCKillEvent label support

---
 src/map/npc.c    | 30 +++++++++++++++++++++---------
 src/map/npc.h    |  7 +++++--
 src/map/pc.c     | 12 ++++++++++++
 src/map/script.h |  2 +-
 4 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/map/npc.c b/src/map/npc.c
index 849030f..a2ad04d 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -266,6 +266,8 @@ int npc_event_export(void *key,void *data,va_list ap)
 int npc_event_doall_sub(void *key,void *data,va_list ap)
 {
 	char *p=(char *)key;
+        int rid, argc;
+        argrec_t *argv;
 	struct event_data *ev;
 	int *c;
 	const char *name;
@@ -275,53 +277,63 @@ int npc_event_doall_sub(void *key,void *data,va_list ap)
 	nullpo_retr(0, c=va_arg(ap,int *));
 
 	name=va_arg(ap,const char *);
+        rid = va_arg(ap, int);
+        argc = va_arg(ap, int);
+        argv = va_arg(ap, argrec_t *);
+
 
 	if( (p=strchr(p,':')) && p && strcasecmp(name,p)==0 ){
-		run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
+                run_script_l(ev->nd->u.scr.script,ev->pos,rid,ev->nd->bl.id, argc, argv);
 		(*c)++;
 	}
 	
 	return 0;
 }
-int npc_event_doall(const char *name)
+int npc_event_doall_l(const char *name, int rid, int argc, argrec_t *args)
 {
 	int c=0;
 	char buf[64]="::";
 	
 	strncpy(buf+2,name,62);
-	strdb_foreach(ev_db,npc_event_doall_sub,&c,buf);
-	return c;	
+	strdb_foreach(ev_db,npc_event_doall_sub,&c,buf, rid, argc, args);
+	return c;
 }
 
-int npc_event_do_sub(void *key,void *data,va_list ap)
+int npc_event_do_sub(void *key,void *data, va_list ap)
 {
 	char *p=(char *)key;
 	struct event_data *ev;
 	int *c;
 	const char *name;
+        int rid, argc;
+        argrec_t *argv;
 
 	nullpo_retr(0, ev=(struct event_data *)data);
 	nullpo_retr(0, ap);
 	nullpo_retr(0, c=va_arg(ap,int *));
 
 	name=va_arg(ap,const char *);
+        rid = va_arg(ap, int);
+        argc = va_arg(ap, int);
+        argv = va_arg(ap, argrec_t *);
+
 
 	if (p && strcasecmp(name,p)==0 ) {
-		run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
+		run_script_l(ev->nd->u.scr.script,ev->pos, rid, ev->nd->bl.id, argc, argv);
 		(*c)++;
 	}
 
 	return 0;
 }
-int npc_event_do(const char *name)
+int npc_event_do_l(const char *name, int rid, int argc, argrec_t *args)
 {
 	int c=0;
 	
 	if (*name==':' && name[1]==':') {
-		return npc_event_doall(name+2);
+		return npc_event_doall_l(name+2, rid, argc, args);
 	}
 
-	strdb_foreach(ev_db,npc_event_do_sub,&c,name);
+	strdb_foreach(ev_db,npc_event_do_sub,&c,name, rid, argc, args);
 	return c;
 }
 
diff --git a/src/map/npc.h b/src/map/npc.h
index c843b56..03ad138 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -50,8 +50,11 @@ int do_init_npc(void);
 int npc_event_do_oninit(void);
 int npc_do_ontimer(int,struct map_session_data *,int);
 
-int npc_event_doall(const char *name);
-int npc_event_do(const char *name);
+struct argrec;
+int npc_event_doall_l(const char *name, int rid, int argc, struct argrec *argv);
+int npc_event_do_l(const char *name, int rid, int argc, struct argrec *argv);
+#define npc_event_doall(name) npc_event_doall_l(name, 0, 0, NULL)
+#define npc_event_do(name) npc_event_do_l(name, 0, 0, NULL)
 
 int npc_timerevent_start(struct npc_data *nd);
 int npc_timerevent_stop(struct npc_data *nd);
diff --git a/src/map/pc.c b/src/map/pc.c
index bed6fc6..0d9e1ff 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -5067,6 +5067,9 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 
 		return 0;
 	}
+
+        // Character is dead!
+
 	sd->status.hp = 0;
 	// [Fate] Stop quickregen
 	sd->quick_regeneration_hp.amount = 0;
@@ -5213,6 +5216,15 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 		pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
 	}
 
+        if (src && src->type == BL_PC) {
+                // [Fate] PK death, trigger scripts
+                argrec_t arg;
+                arg.name = "@killerrid";
+                arg.v.i = src->id;
+                npc_event_doall_l("OnPCKillEvent", sd->bl.id, 1, &arg);
+        }
+        npc_event_doall_l("OnPCDieEvent", sd->bl.id, 0, NULL);
+
 	return 0;
 }
 
diff --git a/src/map/script.h b/src/map/script.h
index 3391643..c5ff909 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -24,7 +24,7 @@ struct script_state {
 };
 
 unsigned char * parse_script(unsigned char *,int);
-typedef struct {
+typedef struct argrec {
         char *name;
         union {
                 int i;
-- 
cgit v1.2.3-70-g09d2