소스 검색

- Changed a bit the Moonlit code to prevent an infinite loop
- Changed clif_skillcasting definition to take as argument the element of the skill.


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

skotlex 18 년 전
부모
커밋
9d77814b36
4개의 변경된 파일9개의 추가작업 그리고 7개의 파일을 삭제
  1. 1 2
      src/map/clif.c
  2. 1 1
      src/map/clif.h
  3. 5 2
      src/map/skill.c
  4. 2 2
      src/map/unit.c

+ 1 - 2
src/map/clif.c

@@ -4219,9 +4219,8 @@ int clif_skillup(struct map_session_data *sd,int skill_num)
  *------------------------------------------
  */
 int clif_skillcasting(struct block_list* bl,
-	int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime)
+	int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int pl, int casttime)
 {
-	int pl = skill_get_pl(skill_num, 1); //TODO: Need Skill level here :/
 	unsigned char buf[32];
 	WBUFW(buf,0) = 0x13e;
 	WBUFL(buf,2) = src_id;

+ 1 - 1
src/map/clif.h

@@ -171,7 +171,7 @@ int clif_skillinfoblock(struct map_session_data *sd);
 int clif_skillup(struct map_session_data *sd,int skill_num);
 
 int clif_skillcasting(struct block_list* bl,
-	int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime);
+	int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int pl, int casttime);
 int clif_skillcastcancel(struct block_list* bl);
 int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype);
 int clif_skill_damage(struct block_list *src,struct block_list *dst,

+ 5 - 2
src/map/skill.c

@@ -7028,8 +7028,11 @@ int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned
 		break;
 	case UNT_MOONLIT:
 	//Knockback out of area if affected char isn't in Moonlit effect
-		if (!sc || sc->data[SC_DANCING].timer==-1 || (sc->data[SC_DANCING].val1&0xFFFF) != CG_MOONLIT)
-			skill_blown(ss, bl, skill_get_blewcount(sg->skill_id,sg->skill_lv));
+		if (sc && sc->data[SC_DANCING].timer!=-1 && (sc->data[SC_DANCING].val1&0xFFFF) == CG_MOONLIT)
+			break;
+		if (ss == bl) //Also needed to prevent infinite loop crash.
+			break;
+		skill_blown(ss, bl, skill_get_blewcount(sg->skill_id,sg->skill_lv));
 		break;
 	}
 	return skillid;

+ 2 - 2
src/map/unit.c

@@ -980,7 +980,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, int skill_num, int
 
 	if( casttime>0 || temp){ 
 
-		clif_skillcasting(src, src->id, target_id, 0,0, skill_num,casttime);
+		clif_skillcasting(src, src->id, target_id, 0,0, skill_num, skill_get_pl(skill_num, skill_lv), casttime);
 
 		if (sd && target->type == BL_MOB)
 		{
@@ -1114,7 +1114,7 @@ int unit_skilluse_pos2( struct block_list *src, int skill_x, int skill_y, int sk
 
 	if( casttime>0 ) {
 		unit_stop_walking( src, 1);
-		clif_skillcasting(src, src->id, 0, skill_x,skill_y, skill_num,casttime);
+		clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_num, skill_get_pl(skill_num, skill_lv), casttime);
 	} else
 		ud->state.skillcastcancel=0;