From ac0129a0ac99ff83935b889fc32876e1a39e9b22 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 23 Jan 2022 03:09:17 +0100 Subject: [PATCH] =?UTF-8?q?fix(Core/Spells):=20Passive=20auras=20with=20SP?= =?UTF-8?q?ELL=5FATTR0=5FONLY=5FINDOORS/SPELL=5FA=E2=80=A6=20(#9837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Core/Spells): Passive auras with SPELL_ATTR0_ONLY_INDOORS/SPELL_ATTR0_ONLY_OUTDOORS should not be removed when entering/leaving buildings. Fixes #9209 --- src/server/game/Entities/Player/Player.cpp | 37 ++++++++++++++++++++-- src/server/game/Entities/Player/Player.h | 2 ++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 651de165d..fa9e850bb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -407,6 +407,7 @@ Player::Player(WorldSession* session): Unit(true), m_mover(this) m_isInstantFlightOn = true; + _wasOutdoor = true; sScriptMgr->OnConstructPlayer(this); } @@ -5593,8 +5594,40 @@ void Player::CheckAreaExploreAndOutdoor() uint32 areaId = GetAreaId(); AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId); - if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !isOutdoor) - RemoveAurasWithAttribute(SPELL_ATTR0_ONLY_OUTDOORS); + if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor) + { + _wasOutdoor = isOutdoor; + + SpellAttr0 attrToRemove = isOutdoor ? SPELL_ATTR0_ONLY_INDOORS : SPELL_ATTR0_ONLY_OUTDOORS; + SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS; + for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();) + { + Aura* aura = iter->second->GetBase(); + SpellInfo const* spell = aura->GetSpellInfo(); + if (spell->Attributes & attrToRemove) + { + // if passive - do not remove and just turn off all effects + if (aura->IsPassive()) + { + aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false); + ++iter; + continue; + } + + RemoveAura(iter); + } + else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive()) + { + // if passive - turn on all effects + aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true); + ++iter; + } + else + { + ++iter; + } + } + } if (!sScriptMgr->CanAreaExploreAndOutdoor(this)) return; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 161504dfb..07355bbe6 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2955,6 +2955,8 @@ private: Optional _farSightDistance = { }; + bool _wasOutdoor; + PlayerSettingMap m_charSettingsMap; };