Jelajahi Sumber

- Added ers handling for skill_timerskill structures.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5995 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 19 tahun lalu
induk
melakukan
3a0621b9ae
5 mengubah file dengan 88 tambahan dan 87 penghapusan
  1. 1 0
      Changelog-Trunk.txt
  2. 1 1
      src/map/guild.c
  3. 1 1
      src/map/map.h
  4. 85 83
      src/map/skill.c
  5. 0 2
      src/map/unit.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ 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.
 
 2006/04/11
+	* Added ers handling for skill_timerskill structures. [Skotlex]
 	* You don't get critical'ed when in counter-attack stance anymore. [Skotlex]
 	* Changed the default counter-type to "always critical". [Skotlex]
 	* Implemented use of ers for skill_unit_groups to reduce memory usage.

+ 1 - 1
src/map/guild.c

@@ -367,7 +367,7 @@ int guild_payexp_timer_sub(DBKey dataid, void *data, va_list ap)
 		return 0;
 	}
 
-	if (g->member[i].exp > INT_MAX - c->exp)
+	if ((unsigned int)g->member[i].exp > INT_MAX - c->exp)
 		g->member[i].exp = INT_MAX;
 	else
 		g->member[i].exp+= c->exp;

+ 1 - 1
src/map/map.h

@@ -348,7 +348,7 @@ struct skill_unit_group_tickset {
 struct unit_data {
 	struct block_list *bl;
 	struct walkpath_data walkpath;
-	struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
+	struct skill_timerskill *skilltimerskill[MAX_SKILLTIMERSKILL];
 	struct skill_unit_group *skillunit[MAX_SKILLUNITGROUP];
 	struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
 	short attacktarget_lv;

+ 85 - 83
src/map/skill.c

@@ -612,6 +612,8 @@ static const int diry[8]={1,1,0,-1,-1,-1,0,1};
 
 
 static struct eri *skill_unit_ers = NULL; //For handling skill_unit's [Skotlex]
+static struct eri *skill_timer_ers = NULL; //For handling skill_timerskills [Skotlex]
+
 /* スキルデ?タベ?ス */
 struct skill_db skill_db[MAX_SKILL_DB];
 
@@ -2299,86 +2301,82 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data )
 
 	nullpo_retr(0, src);
 	nullpo_retr(0, ud);
-	skl = &ud->skilltimerskill[data];
+	skl = ud->skilltimerskill[data];
 	nullpo_retr(0, skl);
-	skl->timer = -1;
-
-	//Check moved here because otherwise the timer is not reset to -1 and later on we'll see problems when clearing. [Skotlex]
-	if(src->prev == NULL)
-		return 0;
+	ud->skilltimerskill[data] = NULL;
 
-	if(skl->target_id) {
-		struct block_list tbl;
-		target = map_id2bl(skl->target_id);
-		if(skl->skill_id == RG_INTIMIDATE) {
-			if(target == NULL) {
-				target = &tbl; //?炎匀サしてないのにアドレス突っ?んでいいのかな?H
+	do {
+		if(src->prev == NULL)
+			break;
+		if(skl->target_id) {
+			struct block_list tbl;
+			target = map_id2bl(skl->target_id);
+			if(!target && skl->skill_id == RG_INTIMIDATE) {
+				target = &tbl; //Required since it has to warp.
 				target->type = BL_NUL;
 				target->m = src->m;
 				target->prev = target->next = NULL;
 			}
-		}
-		if(target == NULL)
-			return 0;
-
-		if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
-			return 0;
-		if(src->m != target->m)
-			return 0;
-		if(status_isdead(src))
-			return 0;
-		if(status_isdead(target) && skl->skill_id != RG_INTIMIDATE && skl->skill_id != WZ_WATERBALL)
-			return 0;
-
-		switch(skl->skill_id) {
-			case RG_INTIMIDATE:
-				if (unit_warp(src,-1,-1,-1,3) == 0) {
-					int x,y;
-					map_search_freecell(src, 0, &x, &y, 1, 1, 0);
-					if (!status_isdead(target))
-					unit_warp(target, -1, x, y, 3);
-				}
+			if(target == NULL)
+				break;	
+			if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
 				break;
-			case BA_FROSTJOKE:			/* 寒いジョ?ク */
-			case DC_SCREAM:				/* スクリ?ム */
-				range= skill_get_splash(skl->skill_id, skl->skill_lv);
-				map_foreachinarea(skill_frostjoke_scream,skl->map,skl->x-range,skl->y-range,
-					skl->x+range,skl->y+range,BL_CHAR,src,skl->skill_id,skl->skill_lv,tick);
+			if(src->m != target->m)
 				break;
-
-			case WZ_WATERBALL:
-				if (!status_isdead(target))
-					skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
-				if (skl->type>1 && !status_isdead(target)) {
-					skl->timer = 0;
-					skill_addtimerskill(src,tick+150,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
-					skl->timer = -1;
-				} else {
-					struct status_change *sc = status_get_sc(src);
-					if(sc && sc->data[SC_MAGICPOWER].timer != -1)
-						status_change_end(src,SC_MAGICPOWER,-1);
-				}
+			if(status_isdead(src))
 				break;
-			default:
-				skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
+			if(status_isdead(target) && skl->skill_id != RG_INTIMIDATE && skl->skill_id != WZ_WATERBALL)
 				break;
+
+			switch(skl->skill_id) {
+				case RG_INTIMIDATE:
+					if (unit_warp(src,-1,-1,-1,3) == 0) {
+						int x,y;
+						map_search_freecell(src, 0, &x, &y, 1, 1, 0);
+						if (!status_isdead(target))
+						unit_warp(target, -1, x, y, 3);
+					}
+					break;
+				case BA_FROSTJOKE:			/* 寒いジョ?ク */
+				case DC_SCREAM:				/* スクリ?ム */
+					range= skill_get_splash(skl->skill_id, skl->skill_lv);
+					map_foreachinarea(skill_frostjoke_scream,skl->map,skl->x-range,skl->y-range,
+						skl->x+range,skl->y+range,BL_CHAR,src,skl->skill_id,skl->skill_lv,tick);
+					break;
+
+				case WZ_WATERBALL:
+					if (!status_isdead(target))
+						skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
+					if (skl->type>1 && !status_isdead(target)) {
+						skill_addtimerskill(src,tick+150,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
+					} else {
+						struct status_change *sc = status_get_sc(src);
+						if(sc && sc->data[SC_MAGICPOWER].timer != -1)
+							status_change_end(src,SC_MAGICPOWER,-1);
+					}
+					break;
+				default:
+					skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
+					break;
+			}
 		}
-	}
-	else {
-		if(src->m != skl->map)
-			return 0;
-		switch(skl->skill_id) {
-			case WZ_METEOR:
-				if(skl->type >= 0) {
-					skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,skl->flag);
-					clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
-				}
-				else
-					skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,skl->flag);
+		else {
+			if(src->m != skl->map)
 				break;
+			switch(skl->skill_id) {
+				case WZ_METEOR:
+					if(skl->type >= 0) {
+						skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,skl->flag);
+						clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
+					}
+					else
+						skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,skl->flag);
+					break;
+			}
 		}
-	}
-
+	} while (0);
+	//Free skl now that it is no longer needed.
+	ers_free(skill_timer_ers, skl);
 	return 0;
 }
 
@@ -2394,19 +2392,20 @@ int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int
 	ud = unit_bl2ud(src);
 	nullpo_retr(1, ud);
 	
-	for(i=0;i<MAX_SKILLTIMERSKILL && ud->skilltimerskill[i].timer != -1;i++);
-	if (i>=MAX_SKILLTIMERSKILL) return 1;
-
-	ud->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
-	ud->skilltimerskill[i].src_id = src->id;
-	ud->skilltimerskill[i].target_id = target;
-	ud->skilltimerskill[i].skill_id = skill_id;
-	ud->skilltimerskill[i].skill_lv = skill_lv;
-	ud->skilltimerskill[i].map = src->m;
-	ud->skilltimerskill[i].x = x;
-	ud->skilltimerskill[i].y = y;
-	ud->skilltimerskill[i].type = type;
-	ud->skilltimerskill[i].flag = flag;
+	for(i=0;i<MAX_SKILLTIMERSKILL && ud->skilltimerskill[i]; i++);
+	if (i==MAX_SKILLTIMERSKILL) return 1;
+	
+	ud->skilltimerskill[i] = ers_alloc(skill_timer_ers, struct skill_timerskill);
+	ud->skilltimerskill[i]->timer = add_timer(tick, skill_timerskill, src->id, i);
+	ud->skilltimerskill[i]->src_id = src->id;
+	ud->skilltimerskill[i]->target_id = target;
+	ud->skilltimerskill[i]->skill_id = skill_id;
+	ud->skilltimerskill[i]->skill_lv = skill_lv;
+	ud->skilltimerskill[i]->map = src->m;
+	ud->skilltimerskill[i]->x = x;
+	ud->skilltimerskill[i]->y = y;
+	ud->skilltimerskill[i]->type = type;
+	ud->skilltimerskill[i]->flag = flag;
 	return 0;
 }
 
@@ -2423,9 +2422,10 @@ int skill_cleartimerskill(struct block_list *src)
 	nullpo_retr(0, ud);
 		
 	for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
-		if(ud->skilltimerskill[i].timer != -1) {
-			delete_timer(ud->skilltimerskill[i].timer, skill_timerskill);
-			ud->skilltimerskill[i].timer = -1;
+		if(ud->skilltimerskill[i]) {
+			delete_timer(ud->skilltimerskill[i]->timer, skill_timerskill);
+			ers_free(skill_timer_ers, ud->skilltimerskill[i]);
+			ud->skilltimerskill[i]=NULL;
 		}
 	}
 	return 1;
@@ -11066,6 +11066,7 @@ int do_init_skill(void)
 	skill_readdb();
 	
 	skill_unit_ers = ers_new((uint32)sizeof(struct skill_unit_group));
+	skill_timer_ers  = ers_new((uint32)sizeof(struct skill_timerskill));
 	
 	if (battle_config.skill_sp_override_grffile)
 		skill_read_skillspamount();
@@ -11083,5 +11084,6 @@ int do_init_skill(void)
 
 int do_final_skill(void) {
 	ers_destroy(skill_unit_ers);
+	ers_destroy(skill_timer_ers);
 	return 0;
 }

+ 0 - 2
src/map/unit.c

@@ -1384,8 +1384,6 @@ void unit_dataset(struct block_list *bl) {
 	ud->attackabletime = 
 	ud->canact_tick    = 
 	ud->canmove_tick   = gettick();
-	for(i=0;i<MAX_SKILLTIMERSKILL;i++)
-		ud->skilltimerskill[i].timer=-1;
 }
 
 /*==========================================