|
@@ -1690,13 +1690,13 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
break;
|
|
break;
|
|
|
|
|
|
case CH_TIGERFIST: {
|
|
case CH_TIGERFIST: {
|
|
- uint16 basetime = skill_get_time(skill_id, skill_lv);
|
|
|
|
- uint16 mintime = 30 * (status_get_lv(src) + 100);
|
|
|
|
|
|
+ t_tick basetime = skill_get_time(skill_id, skill_lv);
|
|
|
|
+ t_tick mintime = 15 * (status_get_lv(src) + 100);
|
|
|
|
|
|
- if (status_get_class_(bl) == CLASS_BOSS)
|
|
|
|
|
|
+ if (status_bl_has_mode(bl, MD_STATUSIMMUNE))
|
|
basetime /= 5;
|
|
basetime /= 5;
|
|
- basetime = min((basetime * status_get_agi(bl)) / -200 + basetime, mintime) / 2;
|
|
|
|
- sc_start(src, bl, SC_STOP, (1 + skill_lv) * 10, 0, basetime);
|
|
|
|
|
|
+ basetime = std::max((basetime * status_get_agi(bl)) / -200 + basetime, mintime);
|
|
|
|
+ sc_start(src, bl, SC_ANKLE, (1 + skill_lv) * 10, 0, basetime);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -1704,7 +1704,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
case ML_SPIRALPIERCE:
|
|
case ML_SPIRALPIERCE:
|
|
case HN_SPIRAL_PIERCE_MAX:
|
|
case HN_SPIRAL_PIERCE_MAX:
|
|
if( dstsd || ( dstmd && !status_bl_has_mode(bl,MD_STATUSIMMUNE) ) ) //Does not work on status immune
|
|
if( dstsd || ( dstmd && !status_bl_has_mode(bl,MD_STATUSIMMUNE) ) ) //Does not work on status immune
|
|
- sc_start(src,bl,SC_STOP,100,0,skill_get_time2(skill_id,skill_lv));
|
|
|
|
|
|
+ sc_start(src,bl,SC_ANKLE,100,0,skill_get_time2(skill_id,skill_lv));
|
|
break;
|
|
break;
|
|
|
|
|
|
case ST_REJECTSWORD:
|
|
case ST_REJECTSWORD:
|
|
@@ -5051,9 +5051,9 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
|
|
skill_tarotcard(src, target, skill_id, skill_lv, tick);
|
|
skill_tarotcard(src, target, skill_id, skill_lv, tick);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- case 8: // THE HANGED MAN - stop, freeze or stoned
|
|
|
|
|
|
+ case 8: // THE HANGED MAN - ankle, freeze or stoned
|
|
{
|
|
{
|
|
- enum sc_type sc[] = { SC_STOP, SC_FREEZE, SC_STONEWAIT };
|
|
|
|
|
|
+ enum sc_type sc[] = { SC_ANKLE, SC_FREEZE, SC_STONEWAIT };
|
|
uint8 rand_eff = rnd() % 3;
|
|
uint8 rand_eff = rnd() % 3;
|
|
int time = ((rand_eff == 0) ? skill_get_time2(skill_id, skill_lv) : skill_get_time2(status_db.getSkill(sc[rand_eff]), 1));
|
|
int time = ((rand_eff == 0) ? skill_get_time2(skill_id, skill_lv) : skill_get_time2(status_db.getSkill(sc[rand_eff]), 1));
|
|
|
|
|
|
@@ -13434,6 +13434,9 @@ TIMER_FUNC(skill_castend_id){
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
sc_start2(src, src, type, 100, 0, 1, skill_get_time(ud->skill_id, ud->skill_lv));
|
|
sc_start2(src, src, type, 100, 0, 1, skill_get_time(ud->skill_id, ud->skill_lv));
|
|
|
|
+ // During Grand Cross you are in ankle state (cannot move or teleport)
|
|
|
|
+ if (ud->skill_id == CR_GRANDCROSS)
|
|
|
|
+ sc_start(src, src, SC_ANKLE, 100, 0, skill_get_time(ud->skill_id, ud->skill_lv));
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -16198,6 +16201,15 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
|
|
case UNT_MANHOLE:
|
|
case UNT_MANHOLE:
|
|
if( sg->val2 == 0 && tsc && ((sg->unit_id == UNT_ANKLESNARE && skill_id != SC_ESCAPE) || bl->id != sg->src_id) ) {
|
|
if( sg->val2 == 0 && tsc && ((sg->unit_id == UNT_ANKLESNARE && skill_id != SC_ESCAPE) || bl->id != sg->src_id) ) {
|
|
t_tick sec = skill_get_time2(sg->skill_id,sg->skill_lv);
|
|
t_tick sec = skill_get_time2(sg->skill_id,sg->skill_lv);
|
|
|
|
+ if (sg->unit_id == UNT_ANKLESNARE) {
|
|
|
|
+ t_tick mintime = 30 * (status_get_lv(ss) + 100);
|
|
|
|
+#ifndef RENEWAL
|
|
|
|
+ // Bosses cannot activate Ankle Snare in renewal so we don't need this code
|
|
|
|
+ if (status_bl_has_mode(bl, MD_STATUSIMMUNE))
|
|
|
|
+ sec /= 5;
|
|
|
|
+#endif
|
|
|
|
+ sec = std::max((sec * status_get_agi(bl)) / -200 + sec, mintime);
|
|
|
|
+ }
|
|
|
|
|
|
if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, SCSTART_NORATEDEF) ) {
|
|
if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, SCSTART_NORATEDEF) ) {
|
|
const struct TimerData* td = tsc->getSCE(type)?get_timer(tsc->getSCE(type)->timer):NULL;
|
|
const struct TimerData* td = tsc->getSCE(type)?get_timer(tsc->getSCE(type)->timer):NULL;
|
|
@@ -21243,6 +21255,12 @@ int skill_unit_timer_sub_onplace(struct block_list* bl, va_list ap)
|
|
if( !(skill->inf2[INF2_ISSONG] || skill->inf2[INF2_ISTRAP]) && !skill->inf2[INF2_IGNORELANDPROTECTOR] && group->skill_id != NC_NEUTRALBARRIER && (battle_config.land_protector_behavior ? map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR) : map_getcell(unit->bl.m, unit->bl.x, unit->bl.y, CELL_CHKLANDPROTECTOR)) )
|
|
if( !(skill->inf2[INF2_ISSONG] || skill->inf2[INF2_ISTRAP]) && !skill->inf2[INF2_IGNORELANDPROTECTOR] && group->skill_id != NC_NEUTRALBARRIER && (battle_config.land_protector_behavior ? map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR) : map_getcell(unit->bl.m, unit->bl.x, unit->bl.y, CELL_CHKLANDPROTECTOR)) )
|
|
return 0; //AoE skills are ineffective. [Skotlex]
|
|
return 0; //AoE skills are ineffective. [Skotlex]
|
|
|
|
|
|
|
|
+#ifdef RENEWAL
|
|
|
|
+ // Ankle Snare can no longer trap bosses in renewal
|
|
|
|
+ if (group->unit_id == UNT_ANKLESNARE && status_bl_has_mode(bl, MD_STATUSIMMUNE))
|
|
|
|
+ return 0;
|
|
|
|
+#endif
|
|
|
|
+
|
|
if( battle_check_target(&unit->bl,bl,group->target_flag) <= 0 )
|
|
if( battle_check_target(&unit->bl,bl,group->target_flag) <= 0 )
|
|
return 0;
|
|
return 0;
|
|
|
|
|