summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt2
-rw-r--r--src/common/timer.h4
-rw-r--r--src/map/npc.c3
-rw-r--r--src/map/script.c41
-rw-r--r--src/map/script.h1
5 files changed, 37 insertions, 14 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index e38aab2d7..54da5ccc4 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/01/07
+ * Fixed the sleep timers not being removed when the an npc was being
+ unloaded and when reloading scripts. [FlavioJS]
* Updated the documentation to match the agitcheck() behavior
* Undid the memset->malloc_set replacement
(let's be compatible and leave such optimizations to system devs, ok?)
diff --git a/src/common/timer.h b/src/common/timer.h
index 7184beec5..243b12e7d 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -18,6 +18,8 @@
#define DIFF_TICK(a,b) ((int)((a)-(b)))
+#define INVALID_TIMER -1
+
// Struct declaration
typedef int (*TimerFunc)(int,unsigned int,int,int);
@@ -38,7 +40,7 @@ unsigned int gettick_nocache(void);
unsigned int gettick(void);
int add_timer(unsigned int,TimerFunc f,int,int);
-int add_timer_interval(unsigned int,TimerFunc f,int,int,int);
+int add_timer_interval(unsigned int tick, TimerFunc func, int id, int data, int interval);
int delete_timer(int,TimerFunc f);
int addtick_timer(int tid,unsigned int tick);
diff --git a/src/map/npc.c b/src/map/npc.c
index b90886da6..802bc3b4a 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1471,6 +1471,7 @@ int npc_unload(struct npc_data *nd)
}
}
}
+ script_stop_sleeptimers(nd->bl.id);
aFree(nd);
return 0;
@@ -2922,7 +2923,7 @@ int npc_reload (void)
//Re-read the NPC Script Events cache.
npc_read_event_script();
-
+
//Execute the OnInit event for freshly loaded npcs. [Skotlex]
ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
diff --git a/src/map/script.c b/src/map/script.c
index 4b84f6c72..3efa8dbc0 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -6,18 +6,6 @@
//#define DEBUG_DISASM
//#define DEBUG_RUN
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-
-#ifndef _WIN32
- #include <sys/time.h>
-#endif
-#include <time.h>
-#include <setjmp.h>
-
#include "../common/cbasetypes.h"
#include "../common/socket.h"
#include "../common/timer.h"
@@ -53,6 +41,18 @@
#include "irc.h"
#include "pet.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#ifndef WIN32
+ #include <sys/time.h>
+#endif
+#include <time.h>
+#include <setjmp.h>
+
+
///////////////////////////////////////////////////////////////////////////////
/// Returns the stack_data at the target index
@@ -2683,6 +2683,21 @@ void run_script(struct script_code *rootscript,int pos,int rid,int oid)
run_script_main(st);
}
+void script_stop_sleeptimers(int id)
+{
+ struct script_state* st;
+ for(;;)
+ {
+ st = (struct script_state*)linkdb_erase(&sleep_db,(void*)id);
+ if( st == NULL )
+ break; // no more sleep timers
+ if( st->sleep.timer != INVALID_TIMER )
+ delete_timer(st->sleep.timer, run_script_timer);
+ script_free_stack(st->stack);
+ aFree(st);
+ }
+}
+
/*==========================================
* 指定ノードをsleep_dbから削除
*------------------------------------------
@@ -3439,6 +3454,8 @@ int script_reload()
struct linkdb_node *n = (struct linkdb_node *)sleep_db;
while(n) {
struct script_state *st = (struct script_state *)n->data;
+ if( st->sleep.timer != INVALID_TIMER )
+ delete_timer(st->sleep.timer, run_script_timer);
script_free_stack(st->stack);
aFree(st);
n = n->next;
diff --git a/src/map/script.h b/src/map/script.h
index dc75edf56..13b1ef41a 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -73,6 +73,7 @@ void setd_sub(struct script_state *st, struct map_session_data *sd, char *varnam
int run_script_timer(int tid, unsigned int tick, int id, int data);
void run_script_main(struct script_state *st);
+void script_stop_sleeptimers(int id);
struct linkdb_node* script_erase_sleepdb(struct linkdb_node *n);
void script_free_stack(struct script_stack*);
void script_free_code(struct script_code* code);