瀏覽代碼

* Made mob_timer_delete check the deletetimer in the mob.
* Added missing delete_timer's every time deletetimer is being set. (except when allocating)

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

FlavioJS 16 年之前
父節點
當前提交
ddf501b224
共有 4 個文件被更改,包括 28 次插入7 次删除
  1. 2 0
      Changelog-Trunk.txt
  2. 18 7
      src/map/mob.c
  3. 2 0
      src/map/script.c
  4. 6 0
      src/map/skill.c

+ 2 - 0
Changelog-Trunk.txt

@@ -6,6 +6,8 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 2009/02/23
 	* Made mob_delayspawn check the spawn_timer in the mob. [FlavioJS]
 	* Added missing delete_timer's every time spawn_timer is being set. (except when allocating)
+	* Made mob_timer_delete check the deletetimer in the mob.
+	* Added missing delete_timer's every time deletetimer is being set. (except when allocating)
 2009/02/20
 	* Increased variable size for status/skill points to remove the 65k cap (bugreport:1579) [ultramage]
 	* Modified WFIFOSET to trigger a fatal error when trying to send a packet that is too big. [FlavioJS]

+ 18 - 7
src/map/mob.c

@@ -1705,13 +1705,20 @@ static void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, str
 
 int mob_timer_delete(int tid, unsigned int tick, int id, intptr data)
 {
-	struct block_list *bl=map_id2bl(id);
-	nullpo_retr(0, bl);
-	if (bl->type != BL_MOB)
-		return 0; //??
-	//for Alchemist CANNIBALIZE [Lupus]
-	((TBL_MOB*)bl)->deletetimer = INVALID_TIMER;
-	unit_free(bl,3);
+	struct block_list* bl = map_id2bl(id);
+	struct mob_data* md = BL_CAST(BL_MOB, bl);
+
+	if( md )
+	{
+		if( md->deletetimer != tid )
+		{
+			ShowError("mob_timer_delete: Timer mismatch: %d != %d\n", tid, md->deletetimer);
+			return 0;
+		}
+		//for Alchemist CANNIBALIZE [Lupus]
+		md->deletetimer = INVALID_TIMER;
+		unit_free(bl, 3);
+	}
 	return 0;
 }
 
@@ -3227,7 +3234,11 @@ int mob_clone_spawn(struct map_session_data *sd, int m, int x, int y, const char
 		if (master_id) //Attach to Master
 			md->master_id = master_id;
 		if (duration) //Auto Delete after a while.
+		{
+			if( md->deletetimer != INVALID_TIMER )
+				delete_timer(md->deletetimer, mob_timer_delete);
 			md->deletetimer = add_timer (gettick() + duration, mob_timer_delete, md->bl.id, 0);
+		}
 	}
 
 	mob_spawn(md);

+ 2 - 0
src/map/script.c

@@ -11330,6 +11330,8 @@ BUILDIN_FUNC(summon)
 	if (md) {
 		md->master_id=sd->bl.id;
 		md->special_state.ai=1;
+		if( md->deletetimer != INVALID_TIMER )
+			delete_timer(md->deletetimer, mob_timer_delete);
 		md->deletetimer = add_timer(tick+(timeout>0?timeout*1000:60000),mob_timer_delete,md->bl.id,0);
 		mob_spawn (md); //Now it is ready for spawning.
 		clif_misceffect2(&md->bl,344);

+ 6 - 0
src/map/skill.c

@@ -6002,6 +6002,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 			if (md) {
 				md->master_id = src->id;
 				md->special_state.ai = skillid==AM_SPHEREMINE?2:3;
+				if( md->deletetimer != INVALID_TIMER )
+					delete_timer(md->deletetimer, mob_timer_delete);
 				md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, md->bl.id, 0);
 				mob_spawn (md); //Now it is ready for spawning.
 			}
@@ -6104,7 +6106,11 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 				TBL_MOB* md = mob_once_spawn_sub(src, src->m, x, y, "--ja--",(skilllv < 2 ? 1084+rand()%2 : 1078+rand()%6),"");
 				if (!md) break;
 				if ((i = skill_get_time(skillid, skilllv)) > 0)
+				{
+					if( md->deletetimer != INVALID_TIMER )
+						delete_timer(md->deletetimer, mob_timer_delete);
 					md->deletetimer = add_timer (tick + i, mob_timer_delete, md->bl.id, 0);
+				}
 				mob_spawn (md);
 			}
 		}