diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index 14e19ef2ce..8811a6a017 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/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 diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index c03b18858e..efb9205573 100644 --- a/db/re/skill_unit_db.txt +++ b/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 diff --git a/src/map/skill.c b/src/map/skill.c index 124a85fc92..3f70076342 100755 --- a/src/map/skill.c +++ b/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 diff --git a/src/map/status.c b/src/map/status.c index d8465030c1..fe7feb89a1 100644 --- a/src/map/status.c +++ b/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);