Преглед на файлове

- Added handling of type BL_PET to skill_unitgrouptickset_search. I know pets normally aren't affected by skills, but their structure already had support for this, so....
- Rewrote/simplified functions skill_addtimerskill/skill_cleartimerskill
- Fixed SC_DANCING for non players (was making dances only last 1 second for them)
- Modified map_moveblock to handle calls to skill_unit_move_unit_group and cancelling of Close Confine effects, removed these checks from the walk functions and skill_blown functions.


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

skotlex преди 19 години
родител
ревизия
62fb6045d4
променени са 6 файла, в които са добавени 107 реда и са изтрити 142 реда
  1. 6 0
      Changelog-Trunk.txt
  2. 19 2
      src/map/map.c
  3. 0 2
      src/map/mob.c
  4. 0 7
      src/map/pc.c
  5. 75 126
      src/map/skill.c
  6. 7 5
      src/map/status.c

+ 6 - 0
Changelog-Trunk.txt

@@ -4,6 +4,12 @@ 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.  EVERYTHING ELSE
 GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
 
+2006/02/12
+	* Optimized functions skill_addtimerskill/skill_cleartimerskill [Skotlex]
+	* Fixed SC_DANCING for non players (was making dances only last 1 second
+	  for them) [Skotlex]
+	* Modified map_moveblock to handle updating dance's position as well as
+	  ending close confine status effects. [Skotlex]
 2006/02/10
 	* Fixed Sonic Blow's damage for lvl 1~9 [Vicious]
 	* The status window will now show the total power of both weapons instead

+ 19 - 2
src/map/map.c

@@ -501,7 +501,6 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) {
 	//TODO: Perhaps some outs of bounds checking should be placed here?
 	if (bl->type&BL_CHAR)
 		skill_unit_move(bl,tick,2);
-
 	if (moveblock) map_delblock_sub(bl,0);
 #ifdef CELL_NOSTACK
 	else map_delblcell(bl);
@@ -512,8 +511,26 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) {
 #ifdef CELL_NOSTACK
 	else map_addblcell(bl);
 #endif
-	if (bl->type&BL_CHAR)
+	if (bl->type&BL_CHAR) {
+		struct status_change *sc = status_get_sc(bl);
 		skill_unit_move(bl,tick,3);
+		if (sc) {
+			if (sc->option&OPTION_CLOAK)
+				skill_check_cloaking(bl);
+			if (sc->count) {
+				if (sc->data[SC_DANCING].timer != -1) {
+					if (sc->data[SC_DANCING].val1 == CG_MOONLIT) //Cancel Moonlight Petals if moved from casting position. [Skotlex]
+						skill_stop_dancing(bl);
+					else
+						skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, bl->m, x1-x0, y1-y0);
+				}
+				if (sc->data[SC_CLOSECONFINE].timer != -1)
+					status_change_end(bl, SC_CLOSECONFINE, -1);
+				if (sc->data[SC_CLOSECONFINE2].timer != -1)
+					status_change_end(bl, SC_CLOSECONFINE2, -1);
+			}
+		}
+	}
 	return 0;
 }
 	

+ 0 - 2
src/map/mob.c

@@ -570,8 +570,6 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data)
 		map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md);
 		md->state.state=MS_IDLE;
 
-		if(md->sc.option&OPTION_CLOAK)
-			skill_check_cloaking(&md->bl);
 	}
 	if((i=calc_next_walk_step(md))>0){
 		i = i>>1;

+ 0 - 7
src/map/pc.c

@@ -3634,13 +3634,6 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
 			-dx, -dy, BL_ALL, sd);
 		sd->walktimer = -1;	// set back so not to disturb future pc_stop_walking calls
 
-		if (pc_iscloaking(sd))	// クロ?キングの消滅?査
-			skill_check_cloaking(&sd->bl);
-		/* 被ディボ?ション?査 */
-		if (sd->sc.count) {
-			if (sd->sc.data[SC_DANCING].timer != -1)
-				skill_unit_move_unit_group((struct skill_unit_group *)sd->sc.data[SC_DANCING].val2, sd->bl.m, dx, dy);
-		}
 		if (map_getcell(sd->bl.m,x,y,CELL_CHKNPC))
 			npc_touch_areanpc(sd,sd->bl.m,x,y);
 		else

+ 75 - 126
src/map/skill.c

@@ -1427,7 +1427,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
 	struct mob_data *md=NULL;
 	struct pet_data *pd=NULL;
 	struct skill_unit *su=NULL;
-	struct status_change* sc=NULL;
 
 	nullpo_retr(0, src);
 	nullpo_retr(0, target);
@@ -1451,8 +1450,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
 		default:
 			return 0;
 	}
-	if (target->type != BL_SKILL)
-		sc = status_get_sc(target);
 
 	if (count&0xf00000)
 		dir = (count>>20)&0xf;
@@ -1480,19 +1477,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
 		map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
 	else if(pd)
 		map_foreachinmovearea(clif_petoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
-	
-	if (sc && sc->count) {
-		if (sc->data[SC_DANCING].timer != -1) {	//Move the song/dance [Skotlex]
-			if (sc->data[SC_DANCING].val1 == CG_MOONLIT) //Cancel Moonlight Petals if moved from casting position. [Skotlex]
-				skill_stop_dancing(target);
-			else
-				skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, target->m, dx, dy);
-		}
-		if (sc->data[SC_CLOSECONFINE].timer != -1)
-			status_change_end(target, SC_CLOSECONFINE, -1);
-		if (sc->data[SC_CLOSECONFINE2].timer != -1)
-			status_change_end(target, SC_CLOSECONFINE2, -1);
-	}
 		
 	if(su){
 		skill_unit_move_unit_group(su->group,target->m,dx,dy);
@@ -2321,75 +2305,42 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data )
  */
 int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag)
 {
-	int i;
-
+	int i, max;
+	unsigned short *count=NULL;;
+	struct skill_timerskill *sts = NULL;
 	nullpo_retr(1, src);
-
-	if(src->type == BL_PC) {
-		struct map_session_data *sd = (struct map_session_data *)src;
-		nullpo_retr(1, sd);
-		for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
-			if(sd->skilltimerskill[i].timer == -1) {
-				sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
-				sd->skilltimerskill[i].src_id = src->id;
-				sd->skilltimerskill[i].target_id = target;
-				sd->skilltimerskill[i].skill_id = skill_id;
-				sd->skilltimerskill[i].skill_lv = skill_lv;
-				sd->skilltimerskill[i].map = src->m;
-				sd->skilltimerskill[i].x = x;
-				sd->skilltimerskill[i].y = y;
-				sd->skilltimerskill[i].type = type;
-				sd->skilltimerskill[i].flag = flag;
-				sd->timerskill_count++;
-
-				return 0;
-			}
-		}
-		return 1;
-	}
-	else if(src->type == BL_MOB) {
-		struct mob_data *md = (struct mob_data *)src;
-		nullpo_retr(1, md);
-		for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
-			if(md->skilltimerskill[i].timer == -1) {
-				md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
-				md->skilltimerskill[i].src_id = src->id;
-				md->skilltimerskill[i].target_id = target;
-				md->skilltimerskill[i].skill_id = skill_id;
-				md->skilltimerskill[i].skill_lv = skill_lv;
-				md->skilltimerskill[i].map = src->m;
-				md->skilltimerskill[i].x = x;
-				md->skilltimerskill[i].y = y;
-				md->skilltimerskill[i].type = type;
-				md->skilltimerskill[i].flag = flag;
-
-				return 0;
-			}
-		}
-		return 1;
-	}
-	else if(src->type == BL_PET) { // [Valaris]
-		struct pet_data *pd = (struct pet_data *)src;
-		nullpo_retr(1, pd);
-		for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
-			if(pd->skilltimerskill[i].timer == -1) {
-				pd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
-				pd->skilltimerskill[i].src_id = src->id;
-				pd->skilltimerskill[i].target_id = target;
-				pd->skilltimerskill[i].skill_id = skill_id;
-				pd->skilltimerskill[i].skill_lv = skill_lv;
-				pd->skilltimerskill[i].map = src->m;
-				pd->skilltimerskill[i].x = x;
-				pd->skilltimerskill[i].y = y;
-				pd->skilltimerskill[i].type = type;
-				pd->skilltimerskill[i].flag = flag;
-
-				return 0;
-			}
-		}
-		return 1;
+	switch (src->type) {
+		case BL_PC:
+			sts = ((struct map_session_data *)src)->skilltimerskill;
+			max = MAX_SKILLTIMERSKILL;
+			count = &((struct map_session_data *)src)->timerskill_count;
+		break;
+		case BL_MOB:
+			sts = ((struct mob_data *)src)->skilltimerskill;
+			max = MAX_MOBSKILLTIMERSKILL;
+		break;
+		case BL_PET:
+			sts = ((struct pet_data *)src)->skilltimerskill;
+			max =  MAX_MOBSKILLTIMERSKILL;
+		break;
+		default:
+			return 1;
 	}
-	return 1;
+	for(i=0;i<max && sts[i].timer != -1;i++);
+	if (i>=max) return 1;
+	
+	sts[i].timer = add_timer(tick, skill_timerskill, src->id, i);
+	sts[i].src_id = src->id;
+	sts[i].target_id = target;
+	sts[i].skill_id = skill_id;
+	sts[i].skill_lv = skill_lv;
+	sts[i].map = src->m;
+	sts[i].x = x;
+	sts[i].y = y;
+	sts[i].flag = flag;
+	if (count)
+		(*count)++;
+	return 0;
 }
 
 /*==========================================
@@ -2398,42 +2349,42 @@ int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int
  */
 int skill_cleartimerskill(struct block_list *src)
 {
-	int i;
+	int i, max;
+	unsigned short *count=NULL;
+	struct skill_timerskill *sts = NULL;
 
 	nullpo_retr(0, src);
-
-	if(src->type == BL_PC) {
-		struct map_session_data *sd = (struct map_session_data *)src;
-		nullpo_retr(0, sd);
-
-		if (sd->timerskill_count <= 0)
+	switch (src->type) {
+		case  BL_PC:
+			sts = ((struct map_session_data *)src)->skilltimerskill;
+			max = MAX_SKILLTIMERSKILL;
+			count = &((struct map_session_data *)src)->timerskill_count;
+		break;
+		case BL_MOB:
+			sts = ((struct mob_data *)src)->skilltimerskill;
+			max = MAX_MOBSKILLTIMERSKILL;
+		break;
+		case BL_PET:
+			sts = ((struct pet_data *)src)->skilltimerskill;
+			max =  MAX_MOBSKILLTIMERSKILL;
+		break;
+		default:
 			return 0;
-
-		for(i=0;i<MAX_SKILLTIMERSKILL && sd->timerskill_count > 0;i++) {
-			if(sd->skilltimerskill[i].timer != -1) {
-				delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
-				sd->skilltimerskill[i].timer = -1;
-				sd->timerskill_count--;
-			}
-		}
 	}
-	else if(src->type == BL_MOB) {
-		struct mob_data *md = (struct mob_data *)src;
-		nullpo_retr(0, md);
-		for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
-			if(md->skilltimerskill[i].timer != -1) {
-				delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
-				md->skilltimerskill[i].timer = -1;
+		
+	if (count) {
+		for(i=0;i<max && *count > 0;i++) {
+			if(sts[i].timer != -1) {
+				delete_timer(sts[i].timer, skill_timerskill);
+				sts[i].timer = -1;
+				(*count)--;
 			}
 		}
-	}
-	else if(src->type == BL_PET) { // Ya forgot this one, Valaris. [Skotlex]
-		struct pet_data *pd = (struct pet_data *)src;
-		nullpo_retr(1, pd);
-		for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
-			if(pd->skilltimerskill[i].timer != -1) {
-				delete_timer(pd->skilltimerskill[i].timer, skill_timerskill);
-				pd->skilltimerskill[i].timer = -1;
+	} else {
+		for(i=0;i<max;i++) {
+			if(sts[i].timer != -1) {
+				delete_timer(sts[i].timer, skill_timerskill);
+				sts[i].timer = -1;
 			}
 		}
 	}
@@ -9630,31 +9581,27 @@ int skill_attack_area(struct block_list *bl,va_list ap)
  */
 int skill_clear_element_field(struct block_list *bl)
 {
-	struct mob_data *md=NULL;
-	struct map_session_data *sd=NULL;
+	struct skill_unit_group *ug=NULL;
 	int i,max,skillid;
 
 	nullpo_retr(0, bl);
 
 	if (bl->type==BL_MOB) {
 		max = MAX_MOBSKILLUNITGROUP;
-		md = (struct mob_data *)bl;
+		ug = ((struct mob_data *)bl)->skillunit;
 	} else if(bl->type==BL_PC) {
 		max = MAX_SKILLUNITGROUP;
-		sd = (struct map_session_data *)bl;
+		ug = ((struct map_session_data *)bl)->skillunit;
+	} else if(bl->type==BL_PET) {
+		max = MAX_MOBSKILLUNITGROUP;
+		ug = ((struct pet_data*)bl)->skillunit;
 	} else
 		return 0;
 
 	for (i=0;i<max;i++) {
-		if(sd){
-			skillid=sd->skillunit[i].skill_id;
-			if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
-				skill_delunitgroup(&sd->skillunit[i]);
-		}else if(md){
-			skillid=md->skillunit[i].skill_id;
-			if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
-				skill_delunitgroup(&md->skillunit[i]);
-		}
+		skillid=ug[i].skill_id;
+		if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+			skill_delunitgroup(&ug[i]);
 	}
 	return 0;
 }
@@ -10274,6 +10221,8 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search(
 		set = ((struct map_session_data *)bl)->skillunittick;
 	else if (bl->type == BL_MOB)
 		set = ((struct mob_data *)bl)->skillunittick;
+	else if (bl->type == BL_PET)
+		set = ((struct pet_data *)bl)->skillunittick;
 	else
 		return 0;
 

+ 7 - 5
src/map/status.c

@@ -5545,7 +5545,9 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 		{
 			int s = 0;
 			int sp = 1;
-			if(sd && (--sc->data[type].val3) > 0) {
+			if (--sc->data[type].val3 <= 0)
+				break;
+			if(sd) {
 				switch(sc->data[type].val1){
 				case BD_RICHMANKIM:				/* ニヨルドの宴 3秒にSP1 */
 				case BD_DRUMBATTLEFIELD:		/* ?太鼓の響き 3秒にSP1 */
@@ -5591,11 +5593,11 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 					if (sd->status.sp <= 0)
 						break;
 				}
-				sc->data[type].timer=add_timer(	/* タイマ?再設定 */
-					1000+tick, status_change_timer,
-					bl->id, data);
-				return 0;
 			}
+			sc->data[type].timer=add_timer(	/* タイマ?再設定 */
+				1000+tick, status_change_timer,
+				bl->id, data);
+			return 0;
 		}
 		break;