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)
This commit is contained in:
aleos89
2014-06-06 10:54:28 -04:00
parent f5ef82e44a
commit 70aa7e03ee
4 changed files with 44 additions and 65 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);