فهرست منبع

Bug Fixes
* Fixed Spider Web and other trap skills not working correctly on GvG maps. (bugreport:8982)
* Fixed Cloaking Exceed not hiding players from demon and insect monsters. (bugreport:9001)
* Bloody Lust no longer affects monsters. (bugreport:8991)
* Ruwach will no longer damage players in Invisibility. (bugreport:8950)

aleos89 11 سال پیش
والد
کامیت
70aa7e03ee
4فایلهای تغییر یافته به همراه44 افزوده شده و 65 حذف شده
  1. 1 1
      db/pre-re/skill_unit_db.txt
  2. 1 1
      db/re/skill_unit_db.txt
  3. 6 23
      src/map/skill.c
  4. 36 40
      src/map/status.c

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

@@ -125,7 +125,7 @@
 2300,0xcd,    ,  0, 0,1000,all,   0x006	 //SC_DIMENSIONDOOR
 2301,0xce,    ,  2, 0,  -1,all,   0x200E //SC_CHAOSPANIC
 2302,0xcf,    ,  2, 0,  -1,all,   0x2002 //SC_MAELSTROM
-2303,0xd0,    ,  3, 0,  -1,all,   0x201A //SC_BLOODYLUST
+2303,0xd0,    ,  3, 0,  -1,all,   0x2058 //SC_BLOODYLUST
 2304,0xd1,    ,  0, 2, 500,enemy, 0x018  //SC_FEINTBOMB
 
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING

+ 1 - 1
db/re/skill_unit_db.txt

@@ -127,7 +127,7 @@
 2300,0xcd,    ,  0, 0,1000,all,   0x006	 //SC_DIMENSIONDOOR
 2301,0xce,    ,  2, 0,  -1,all,   0x200E //SC_CHAOSPANIC
 2302,0xcf,    ,  2, 0,  -1,all,   0x2002 //SC_MAELSTROM
-2303,0xd0,    ,  3, 0,  -1,all,   0x201A //SC_BLOODYLUST
+2303,0xd0,    ,  3, 0,  -1,all,   0x2058 //SC_BLOODYLUST
 2304,0xd1,    ,  0, 2, 500,enemy, 0x018  //SC_FEINTBOMB
 
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING

+ 6 - 23
src/map/skill.c

@@ -12271,18 +12271,10 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
 				int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
 				if( status_change_start(ss, bl,type,10000,sg->skill_lv,1,sg->group_id,0,sec,8) ) {
 					const struct TimerData* td = sc->data[type]?get_timer(sc->data[type]->timer):NULL;
-					int knockback_immune = (sd ? !sd->special_state.no_knockback : !(status->mode&(MD_KNOCKBACK_IMMUNE|MD_BOSS)));
-
 					if( td )
 						sec = DIFF_TICK(td->tick, tick);
-					if( knockback_immune ) {
-						if( !battle_config.skill_trap_type && map_flag_gvg2(bl->m) )
-							;
-						else {
-							map_moveblock(bl,src->bl.x,src->bl.y,tick);
-							clif_fixpos(bl);
-						}
-					}
+					map_moveblock(bl, src->bl.x, src->bl.y, tick);
+					clif_fixpos(bl);
 					sg->val2 = bl->id;
 				}
 				else
@@ -12656,26 +12648,17 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 
 		case UNT_ANKLESNARE:
 		case UNT_MANHOLE:
-			if (sg->unit_id == UNT_ANKLESNARE && sg->val3 == SC_ESCAPE && map_flag_vs(ss->m) && bl->id == sg->src_id)
-				break;
 			if( sg->val2 == 0 && tsc && (sg->unit_id == UNT_ANKLESNARE || bl->id != sg->src_id) ) {
 				int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
 
 				if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8) ) {
-					const struct TimerData* td = (tsc->data[type] ? get_timer(tsc->data[type]->timer) : NULL);
-					int range = skill_get_unit_range(skill_id, sg->skill_lv);
-					int knockback_immune = (tsd ? !tsd->special_state.no_knockback : !(tstatus->mode&(MD_KNOCKBACK_IMMUNE|MD_BOSS)));
+					const struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL;
 
 					if( td )
 						sec = DIFF_TICK(td->tick, tick);
-					if ((sg->unit_id == UNT_MANHOLE && distance_xy(src->bl.x,src->bl.y,bl->x,bl->y) <= range &&
-						src->bl.x != bl->x && src->bl.y != bl->y) || knockback_immune) {
-						if (sg->unit_id != UNT_MANHOLE && !battle_config.skill_trap_type && map_flag_gvg2(bl->m))
-							;
-						else {
-							unit_movepos(bl,src->bl.x,src->bl.y,0,0);
-							clif_fixpos(bl);
-						}
+					if( sg->unit_id == UNT_MANHOLE || battle_config.skill_trap_type || !map_flag_gvg(src->bl.m) ) {
+						unit_movepos(bl, src->bl.x, src->bl.y, 0, 0);
+						clif_fixpos(bl);
 					}
 					sg->val2 = bl->id;
 				} else

+ 36 - 40
src/map/status.c

@@ -1167,7 +1167,6 @@ void initChangeTables(void)
 
 	/* StatusChangeState (SCS_) NOMOVE */
 	StatusChangeStateTable[SC_ANKLE]				|= SCS_NOMOVE;
-	StatusChangeStateTable[SC_SPIDERWEB]			|= SCS_NOMOVE;
 	StatusChangeStateTable[SC_AUTOCOUNTER]			|= SCS_NOMOVE;
 	StatusChangeStateTable[SC_TRICKDEAD]			|= SCS_NOMOVE;
 	StatusChangeStateTable[SC_BLADESTOP]			|= SCS_NOMOVE;
@@ -1943,23 +1942,24 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
 
 	switch( target->type ) {
 		case BL_PC: {
-				struct map_session_data *sd = (TBL_PC*) target;
+				struct map_session_data *tsd = (TBL_PC*)target;
 				bool is_boss = (status->mode&MD_BOSS);
 				bool is_detect = ((status->mode&MD_DETECTOR)?true:false);// god-knows-why gcc doesn't shut up until this happens
+
 				if (pc_isinvisible(sd))
 					return 0;
-				if ((tsc->option&hide_flag) && !(status->mode&MD_BOSS) &&
-					(((TBL_PC*)target)->special_state.perfect_hiding || !(status->mode&MD_DETECTOR)))
-					return 0;
-				if (tsc->data[SC_CLOAKINGEXCEED] && !is_boss &&
-					(((TBL_PC*)target)->special_state.perfect_hiding || !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 || is_detect) )
-					return 0;
+				if (tsc) {
+					if ((tsc->option&hide_flag) && !(status->mode&MD_BOSS) && (tsd->special_state.perfect_hiding || !is_detect))
+						return 0;
+					if (tsc->data[SC_CLOAKINGEXCEED] && !(status->mode&MD_BOSS) && (tsd->special_state.perfect_hiding || 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 || is_detect))
+						return 0;
+				}
 			}
 			break;
 		case BL_ITEM: // Allow targetting of items to pick'em up (or in the case of mobs, to loot them).
@@ -2015,18 +2015,21 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
 		return 1;
 
 	switch (target->type) {	// Check for chase-walk/hiding/cloaking opponents.
-		case BL_PC:
-			if( ( tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE])) && !(status->mode&MD_BOSS) &&
-				( ((TBL_PC*)target)->special_state.perfect_hiding || !(status->mode&MD_DETECTOR) ) )
-				return 0;
-			if ( tsc && tsc->data[SC_CLOAKINGEXCEED] && !(status->mode&MD_BOSS) &&
-				( ((TBL_PC*)target)->special_state.perfect_hiding || (status->mode&MD_DETECTOR) ) )
-				return 0;
-			if ( tsc && tsc->data[SC__FEINTBOMB] && !(status->mode&(MD_BOSS|MD_DETECTOR) ) )
-				return 0;
+		case BL_PC: {
+				struct map_session_data *tsd = (TBL_PC*)target;
+				bool is_boss = (status->mode&MD_BOSS);
+				bool is_detect = ((status->mode&MD_DETECTOR)?true:false);// god-knows-why gcc doesn't shut up until this happens
+
+				if ((tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE])) && !is_boss && (tsd->special_state.perfect_hiding || !is_detect))
+					return 0;
+				if (tsc && tsc->data[SC_CLOAKINGEXCEED] && !is_boss && (tsd->special_state.perfect_hiding || is_detect))
+					return 0;
+				if (tsc && tsc->data[SC__FEINTBOMB] && !(is_boss || is_detect))
+					return 0;
+			}
 			break;
 		default:
-			if( tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE]) && !(status->mode&(MD_BOSS|MD_DETECTOR)) )
+			if (tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE]) && !(is_boss || is_detect))
 				return 0;
 	}
 
@@ -6295,7 +6298,7 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
 	if( sc->data[SC__BODYPAINT] )
 		aspd_rate +=  50 * sc->data[SC__BODYPAINT]->val1;
 	if( sc->data[SC__INVISIBILITY] )
-		aspd_rate += sc->data[SC__INVISIBILITY]->val2 * 10 ;
+		aspd_rate += sc->data[SC__INVISIBILITY]->val2 * 10;
 	if( sc->data[SC__GROOMY] )
 		aspd_rate += sc->data[SC__GROOMY]->val2 * 10;
 	if( sc->data[SC_SWINGDANCE] )
@@ -6438,6 +6441,8 @@ static unsigned char status_calc_element_lv(struct block_list *bl, struct status
 		return sc->data[SC_ELEMENTALCHANGE]->val1;
 	if(sc->data[SC_SHAPESHIFT])
 		return 1;
+	if(sc->data[SC__INVISIBILITY])
+		return 1;
 
 	return (unsigned char)cap_value(lv,1,4);
 }
@@ -8235,6 +8240,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			case SC_PYREXIA:
 			case SC_OBLIVIONCURSE:
 			case SC_LEECHESEND:
+			case SC__INVISIBILITY:
 			case SC__ENERVATION:
 			case SC__GROOMY:
 			case SC__IGNORANCE:
@@ -9937,6 +9943,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_CLOSECONFINE2:
 		case SC_TINDER_BREAKER:
 		case SC_TINDER_BREAKER2:
+		case SC_SPIDERWEB:
+		case SC_ELECTRICSHOCKER:
 		case SC_BITE:
 		case SC_THORNSTRAP:
 		case SC__MANHOLE:
@@ -9952,19 +9960,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			unit_stop_walking(bl,1);
 		break;
 		case SC_ANKLE:
-		case SC_SPIDERWEB:
-		case SC_ELECTRICSHOCKER:
-		case SC_CURSEDCIRCLE_TARGET:
-			{
-				int knockback_immune = (sd ? !sd->special_state.no_knockback : !(status->mode&(MD_KNOCKBACK_IMMUNE|MD_BOSS)));
-
-				if (knockback_immune) {
-					if (!battle_config.skill_trap_type && map_flag_gvg2(bl->m))
-						break;
-					else
-						unit_stop_walking(bl,1);
-				}
-			}
+			if( battle_config.skill_trap_type || !map_flag_gvg(bl->m) )
+				unit_stop_walking(bl,1);
 		break;
 		case SC_HIDING:
 		case SC_CLOAKING:
@@ -12091,8 +12088,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
 		break;
 	case SC_RUWACH: // Reveal hidden target and deal little dammages if enemy
 		if (tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] ||
-				tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_CLOAKINGEXCEED] ||
-					tsc->data[SC__INVISIBILITY])) { // this sc should hit only
+				tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_CLOAKINGEXCEED])) {
 			status_change_end(bl, SC_HIDING, INVALID_TIMER);
 			status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
 			status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);