From df0457c83512dba6b9fe496addf98deb06ed0aeb Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 7 Apr 2021 07:04:36 -0400 Subject: [PATCH] Corrects the behavior of Vacuum Extreme (#5832) * Fixes #5798. * Targets will now become affected by Vacuum Extreme when walking through an active area but won't be sucked to the center unless they were standing still upon placement of the skill. Thanks to @Rayvakarian and @Balferian! --- src/map/skill.cpp | 4 ++-- src/map/skill.hpp | 1 + src/map/status.cpp | 15 ++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index c94adffaf6..d315ecf6ab 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -14876,8 +14876,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t (tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled) return 0; - if (unit_bl2ud(bl)->walktimer == INVALID_TIMER) // Apply effect and suck non-walking targets one-by-one each n seconds - sc_start4(ss, bl, type, 100, sg->skill_lv, sg->group_id, (sg->val1<<16)|(sg->val2), ++sg->val3*500, (sg->limit - DIFF_TICK(tick, sg->tick))); + // Apply effect and suck targets one-by-one each n seconds + sc_start4(ss, bl, type, 100, sg->skill_lv, sg->group_id, (sg->val1 << 16) | (sg->val2), ++sg->val3 * 500, (sg->limit - DIFF_TICK(tick, sg->tick))); break; case UNT_BANDING: diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 9dcda4a0cf..3cbc92def2 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -512,6 +512,7 @@ bool skill_get_nk_(uint16 skill_id, std::vector nk); bool skill_get_inf2_(uint16 skill_id, std::vector inf2); #define skill_get_unit_flag(skill_id, unit) skill_get_unit_flag_(skill_id, { unit }) bool skill_get_unit_flag_(uint16 skill_id, std::vector unit); +int skill_get_unit_range(uint16 skill_id, uint16 skill_lv); // Accessor for skill requirements int skill_get_hp( uint16 skill_id ,uint16 skill_lv ); int skill_get_mhp( uint16 skill_id ,uint16 skill_lv ); diff --git a/src/map/status.cpp b/src/map/status.cpp index ed7b42f8da..f627d47b47 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -14709,12 +14709,17 @@ TIMER_FUNC(status_change_timer){ } break; case SC_VACUUM_EXTREME: - if (sce->val4) { - if (unit_movepos(bl, sce->val3>>16, sce->val3&0xFFFF, 0, false)) { - clif_slide(bl, sce->val3>>16, sce->val3&0xFFFF); - clif_fixpos(bl); + if (sce->val4 >= 0) { + // Only slide targets to center if they are standing still + if (unit_bl2ud(bl)->walktimer == INVALID_TIMER) { + uint16 x = sce->val3 >> 16, y = sce->val3 & 0xFFFF; + + if (distance_xy(x, y, bl->x, bl->y) <= skill_get_unit_range(status_sc2skill(type), sce->val1) && unit_movepos(bl, x, y, 0, false)) { + clif_slide(bl, x, y); + clif_fixpos(bl); + } } - sc_timer_next(tick+sce->val4); + sc_timer_next(tick + sce->val4); sce->val4 = 0; } break;