Просмотр исходного кода

Bug Fixes
* Follow up to 2cd1e8c compile error. (bugreport:8733)
* Implemented official hiding effect for Feint Bomb. (bugreport:8346)

aleos89 11 лет назад
Родитель
Сommit
2dece5586d
6 измененных файлов с 56 добавлено и 14 удалено
  1. 2 1
      db/const.txt
  2. 1 1
      db/pre-re/skill_cast_db.txt
  3. 1 1
      db/re/skill_cast_db.txt
  4. 12 8
      src/map/skill.c
  5. 39 3
      src/map/status.c
  6. 1 0
      src/map/status.h

+ 2 - 1
db/const.txt

@@ -1711,7 +1711,8 @@ SC_QUEST_BUFF2	590
 SC_QUEST_BUFF3	591
 SC_ALL_RIDING	592
 SC_TEARGAS_SOB	593
-SC_EXTREMITYFIST2	594
+SC__FEINTBOMB	594
+SC_EXTREMITYFIST2	595
 
 //Status Icon
 SI_BLANK	-1

+ 1 - 1
db/pre-re/skill_cast_db.txt

@@ -1352,7 +1352,7 @@
 //-- SC_BLOODYLUST //dur2=intr
 2303,2000,2000,0,10000:20000:30000,0,180000
 //-- SC_FEINTBOMB
-2304,1000,0,0,1000,0,5000
+2304,1000,0,0,1000,1000,5000
 //==========================================
 
 //==== Royal Guard skills ==================

+ 1 - 1
db/re/skill_cast_db.txt

@@ -1365,7 +1365,7 @@
 //-- SC_BLOODYLUST //dur2=intr
 2303,2000,2000,0,10000:20000:30000,0,180000,-1
 //-- SC_FEINTBOMB
-2304,1000,0,0,1000,0,5000,-1
+2304,1000,0,0,1000,1000,5000,-1
 //-- SC_ESCAPE
 5010,0,0,0,1000,0,15000,-1
 //==========================================

+ 12 - 8
src/map/skill.c

@@ -6370,7 +6370,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,i);
 		break;
 	case TF_HIDING:
-	case ST_CHASEWALK:
+	case ST_CHASEWALK: {
+		struct status_change* sc = status_get_sc(src);
+
+		if( sc && sc->data[SC__FEINTBOMB] )
+			status_change_end(bl, SC__FEINTBOMB, INVALID_TIMER);
+	}
 	case KO_YAMIKUMO:
 		if (tsce)
 		{
@@ -11075,10 +11080,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 		break;
 
 	case SC_FEINTBOMB:
-		clif_skill_nodamage(src,src,skill_id,skill_lv,1);
 		skill_unitsetting(src,skill_id,skill_lv,x,y,0); // Set bomb on current Position
-		if( skill_blown(src,src,3*skill_lv,unit_getdir(src),0) )
-			skill_castend_nodamage_id(src,src,TF_HIDING,1,tick,0);
+		skill_blown(src,src,3*skill_lv,unit_getdir(src),0);
+		clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time2(skill_id,skill_lv)));
 		break;
 
 	case SC_ESCAPE:
@@ -16785,13 +16789,13 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
 			case UNT_FEINTBOMB: {
 				struct block_list *src = map_id2bl(group->src_id);
 				struct status_change *sc;
-				if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC_HIDING]) { // Copycat explodes if caster is still hidden.
+				if (src && (sc = status_get_sc(src)) != NULL && sc->data[SC__FEINTBOMB]) { // Copycat explodes if caster is still hidden.
 					map_foreachinrange(skill_area_sub, &group->unit->bl, unit->range, splash_target(src), src, SC_FEINTBOMB, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
-					status_change_end(src, SC_HIDING, INVALID_TIMER);
+					status_change_end(src, SC__FEINTBOMB, INVALID_TIMER);
 				}
 				skill_delunit(unit);
-				break;
 			}
+			break;
 
 			case UNT_BANDING:
 			{
@@ -18993,7 +18997,7 @@ static bool skill_parse_row_unitdb(char* split[], int columns, int current) {
 	else if( strcmpi(split[6],"all")==0 ) skill_db[idx].unit_target = BCT_ALL;
 	else if( strcmpi(split[6],"enemy")==0 ) skill_db[idx].unit_target = BCT_ENEMY;
 	else if( strcmpi(split[6],"self")==0 ) skill_db[idx].unit_target = BCT_SELF;
-	else if( strcmpi(split[6],"sameguild"==0 ) skill_db[idx].unit_target = BCT_GUILD|BCT_SAMEGUILD;
+	else if( strcmpi(split[6],"sameguild")==0 ) skill_db[idx].unit_target = BCT_GUILD|BCT_SAMEGUILD;
 	else if( strcmpi(split[6],"noone")==0 ) skill_db[idx].unit_target = BCT_NOONE;
 	else skill_db[idx].unit_target = strtol(split[6],NULL,16);
 

+ 39 - 3
src/map/status.c

@@ -667,6 +667,7 @@ void initChangeTables(void)
 	set_sc_with_vfx( SC_MANHOLE	, SC__MANHOLE		, SI_MANHOLE		, SCB_NONE );
 	add_sc( SC_CHAOSPANIC		, SC_CONFUSION		);
 	set_sc( SC_BLOODYLUST		, SC_BERSERK		, SI_BLOODYLUST		, SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK);
+	add_sc( SC_FEINTBOMB		, SC__FEINTBOMB		);
 
 	/* Sura */
 	add_sc( SR_DRAGONCOMBO			, SC_STUN		);
@@ -1107,6 +1108,7 @@ void initChangeTables(void)
 	StatusChangeStateTable[SC_TRICKDEAD]		|= SCS_NOPICKITEM;
 	StatusChangeStateTable[SC_BLADESTOP]		|= SCS_NOPICKITEM;
 	StatusChangeStateTable[SC_CLOAKINGEXCEED]	|= SCS_NOPICKITEM;
+	StatusChangeStateTable[SC__FEINTBOMB]	|= SCS_NOPICKITEM;
 	StatusChangeStateTable[SC_NOCHAT]		|= SCS_NOPICKITEM|SCS_NOPICKITEMCOND;
 
 	/* StatusChangeState (SCS_) NODROPITEMS */
@@ -1872,6 +1874,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
 					((sd->special_state.perfect_hiding || !is_detect) ||
 					(tsc->data[SC_CLOAKINGEXCEED] && is_detect)))
 					return 0;
+				if( tsc->data[SC__FEINTBOMB] && (is_boss || is_detect))
+					return 0;
 				if( tsc->data[SC_CAMOUFLAGE] && !(is_boss || is_detect) && !skill_id )
 					return 0;
 				if( tsc->data[SC_STEALTHFIELD] && !is_boss )
@@ -1934,6 +1938,8 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
 		case BL_PC:
 			if ( tsc && tsc->data[SC_CLOAKINGEXCEED] && !(status->mode&MD_BOSS) )
 				return 0;
+			if ( tsc && tsc->data[SC__FEINTBOMB] && !(status->mode&MD_BOSS || status->mode&MD_DETECTOR) )
+				return 0;
 			if( ( tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC__INVISIBILITY] || tsc->data[SC_CAMOUFLAGE])) && !(status->mode&MD_BOSS) &&
 				( ((TBL_PC*)target)->special_state.perfect_hiding || !(status->mode&MD_DETECTOR) ) )
 				return 0;
@@ -9097,6 +9103,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			sc_start(src,bl,SC_STRIPWEAPON,100,val1,tick);
 			sc_start(src,bl,SC_STRIPSHIELD,100,val1,tick);
 			break;
+		case SC__FEINTBOMB:
+			val4 = tick / 1000;
+			tick_time = 1000;
+			val_flag |= 1|2;
+			break;
 		case SC_GN_CARTBOOST:
 			if( val1 < 3 )
 				val2 = 50;
@@ -9716,6 +9727,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_HIDING:
 		case SC_CLOAKING:
 		case SC_CLOAKINGEXCEED:
+		case SC__FEINTBOMB:
 		case SC_CHASEWALK:
 		case SC_WEIGHT90:
 		case SC_CAMOUFLAGE:
@@ -9858,6 +9870,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			sc->option |= OPTION_CHASEWALK|OPTION_CLOAK;
 			opt_flag = 2;
 			break;
+		case SC__FEINTBOMB:
+			sc->option |= OPTION_INVISIBLE;
+			opt_flag = 2;
+			break;
 		case SC_SIGHT:
 			sc->option |= OPTION_SIGHT;
 			break;
@@ -10535,6 +10551,14 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 				if(s_sd ) s_sd->shadowform_id = 0;
 			}
 			break;
+		case SC__FEINTBOMB:
+			if( sd && pc_ishiding(sd) ) {
+				status_change_end(bl, SC_HIDING, INVALID_TIMER);
+				status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
+				status_change_end(bl, SC_CHASEWALK, INVALID_TIMER);
+				status_change_end(bl, SC__INVISIBILITY, INVALID_TIMER);
+			}
+			break;
 		case SC_SITDOWN_FORCE:
 			if( sd && pc_issit(sd) ) {
 				pc_setstand(sd);
@@ -10665,19 +10689,22 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 
 	case SC_HIDING:
 		sc->option &= ~OPTION_HIDE;
-		opt_flag|= 2|4; // Check for warp trigger + AoE trigger
+		opt_flag |= 2|4; // Check for warp trigger + AoE trigger
 		break;
 	case SC_CLOAKING:
 	case SC_CLOAKINGEXCEED:
 	case SC__INVISIBILITY:
 		sc->option &= ~OPTION_CLOAK;
 	case SC_CAMOUFLAGE:
-		opt_flag|= 2;
+		opt_flag |= 2;
 		break;
 	case SC_CHASEWALK:
 		sc->option &= ~(OPTION_CHASEWALK|OPTION_CLOAK);
-		opt_flag|= 2;
+		opt_flag |= 2;
 		break;
+	case SC__FEINTBOMB:
+		sc->option &= ~OPTION_INVISIBLE;
+		opt_flag |= 2;
 	case SC_SIGHT:
 		sc->option &= ~OPTION_SIGHT;
 		break;
@@ -11417,6 +11444,15 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 		sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
 		return 0;
 
+	case SC__FEINTBOMB:
+		if( --(sce->val4) >= 0) {
+			if( !status_charge(bl, 0, 1) )
+				break;
+			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
+			return 0;
+		}
+		break;
+
 	case SC_STRIKING:
 		if( --(sce->val4) >= 0 ) {
 			if( !status_charge(bl,0, sce->val3 ) )

+ 1 - 0
src/map/status.h

@@ -698,6 +698,7 @@ typedef enum sc_type {
 	SC_ALL_RIDING,
 
 	SC_TEARGAS_SOB,
+	SC__FEINTBOMB,
 
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled