ソースを参照

Fixed Wall of Thorn skill, all of its conditions should now be met.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15971 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 13 年 前
コミット
f6300d31f9
2 ファイル変更51 行追加24 行削除
  1. 19 3
      src/map/skill.c
  2. 32 21
      src/map/status.c

+ 19 - 3
src/map/skill.c

@@ -10583,6 +10583,15 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
 		skill_blown(ss,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv),unit_getdir(bl),0);
 		break;
 
+	case UNT_WALLOFTHORN:
+		if( status_get_mode(bl)&MD_BOSS )
+			break;	// iRO Wiki says that this skill don't affect to Boss monsters.
+		if( battle_check_target(ss,bl,BCT_ENEMY) <= 0 )
+			skill_blown(&src->bl,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv),unit_getdir(bl),0);
+		else
+			skill_attack(skill_get_type(sg->skill_id), ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
+		break;
+			
 	case UNT_GD_LEADERSHIP:
 	case UNT_GD_GLORYWOUNDS:
 	case UNT_GD_SOULCOLD:
@@ -11416,6 +11425,7 @@ int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl, int dam
 	case UNT_ANKLESNARE:
 	case UNT_ICEWALL:
 	case UNT_REVERBERATION:
+	case UNT_WALLOFTHORN:
 		src->val1-=damage;
 		break;
 	case UNT_BLASTMINE:
@@ -14552,6 +14562,12 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 				if( unit->val1 <= 0 )
 					unit->limit = DIFF_TICK(tick + 700,group->tick);
 				break;
+			case UNT_WALLOFTHORN:
+				if( unit->val1 <= 0 ) {
+					group->unit_id = UNT_USED_TRAPS;
+					group->limit = DIFF_TICK(tick, group->tick) + 1500;
+				}
+				break;
 		}
 	}
 
@@ -14762,9 +14778,9 @@ int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx, i
 	if (skill_get_unit_flag(group->skill_id)&UF_ENSEMBLE)
 		return 0; //Ensembles may not be moved around.
 
-	if( group->unit_id == UNT_ICEWALL )
-		return 0; //Icewalls don't get knocked back
-
+	if( group->unit_id == UNT_ICEWALL || group->unit_id == UNT_WALLOFTHORN )
+		return 0; //Icewalls and Wall of Thorns don't get knocked back
+	
 	m_flag = (int *) aCalloc(group->unit_count, sizeof(int));
 	//    m_flag
 	//		0: Neither of the following (skill_unit_onplace & skill_unit_onout are needed)

+ 32 - 21
src/map/status.c

@@ -1425,20 +1425,30 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 			return 0;		
 	}
 
-	if (skill_num == PA_PRESSURE && flag && target) {
-		//Gloria Avoids pretty much everything....
-		tsc = status_get_sc(target);
-		if(tsc && tsc->option&OPTION_HIDE)
-			return 0;
-		return 1;
+	switch( skill_num ) {
+		case PA_PRESSURE:
+			if( flag && target ) {
+				//Gloria Avoids pretty much everything....
+				tsc = status_get_sc(target);
+				if(tsc && tsc->option&OPTION_HIDE)
+					return 0;
+			}
+			break;
+		case GN_WALLOFTHORN:
+			if( target && status_isdead(target) )
+				return 0;
+			break;
+		case AL_TELEPORT:
+			//Should fail when used on top of Land Protector [Skotlex]
+			if (src && map_getcell(src->m, src->x, src->y, CELL_CHKLANDPROTECTOR)
+				&& !(status->mode&MD_BOSS)
+				&& (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_num))
+				return 0;
+			break;
+		default:
+			break;
 	}
 
-	//Should fail when used on top of Land Protector [Skotlex]
-	if (src && skill_num == AL_TELEPORT && map_getcell(src->m, src->x, src->y, CELL_CHKLANDPROTECTOR)
-		&& !(status->mode&MD_BOSS)
-		&& (src->type != BL_PC || ((TBL_PC*)src)->skillitem != skill_num))
-		return 0;
-
 	if ( src ) sc = status_get_sc(src);
 
 	if( sc && sc->count ) {
@@ -1486,15 +1496,16 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 					skill_get_inf2(skill_num)&(INF2_SONG_DANCE|INF2_ENSEMBLE_SKILL)
 				)
 					return 0;
-			} else
-			switch (skill_num) {
-			case BD_ADAPTATION:
-			case CG_LONGINGFREEDOM:
-			case BA_MUSICALSTRIKE:
-			case DC_THROWARROW:
-				break;
-			default:
-				return 0;
+			} else {
+				switch (skill_num) {
+					case BD_ADAPTATION:
+					case CG_LONGINGFREEDOM:
+					case BA_MUSICALSTRIKE:
+					case DC_THROWARROW:
+						break;
+					default:
+						return 0;
+				}
 			}
 			if ((sc->data[SC_DANCING]->val1&0xFFFF) == CG_HERMODE && skill_num == BD_ADAPTATION)
 				return 0;	//Can't amp out of Wand of Hermode :/ [Skotlex]