Ver código fonte

- Fixed the sleep timers not being removed when the an npc was being unloaded and when reloading scripts.
Ref: http://www.eathena.ws/board/index.php?showtopic=131464

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9629 54d463be-8e91-2dee-dedb-b68131a5f0ec

FlavioJS 18 anos atrás
pai
commit
da5d22b67f
5 arquivos alterados com 37 adições e 14 exclusões
  1. 2 0
      Changelog-Trunk.txt
  2. 3 1
      src/common/timer.h
  3. 2 1
      src/map/npc.c
  4. 29 12
      src/map/script.c
  5. 1 0
      src/map/script.h

+ 2 - 0
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?)

+ 3 - 1
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);

+ 2 - 1
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"));

+ 29 - 12
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);
+	}
+}
+
 /*==========================================
  * Žw’èƒm�[ƒh‚ð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;

+ 1 - 0
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);