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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user