diff options
author | CraftedRO <24683355+CraftedRO@users.noreply.github.com> | 2025-03-13 13:27:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-13 12:27:01 +0100 |
commit | e79228533e0856f34e1a6d2de88497cff3d164f3 (patch) | |
tree | 4ad124032f1f6ace30355064ab350f0097cb0fe7 /src | |
parent | f3941ff68305b118bec706bd128de2471d16773f (diff) |
Core/Spells: Updates autoshoot spell target in case of client-side target change (#30695)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 29d61b64340..030dc0ab823 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -470,6 +470,30 @@ void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) recvData >> guid; _player->SetSelection(guid); + + // Update target of current autoshoot spell + if (!guid.IsEmpty()) + { + if (Spell* autoReapeatSpell = _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)) + { + if (!autoReapeatSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR4_UNK24) // client automatically handles spells with SPELL_ATTR4_AUTO_RANGED_COMBAT + && autoReapeatSpell->m_targets.GetUnitTargetGUID() != guid) + { + Unit* unitTarget = [&]() -> Unit* + { + Unit* unit = ObjectAccessor::GetUnit(*_player, guid); + if (unit && _player->IsValidAttackTarget(unit, autoReapeatSpell->GetSpellInfo())) + return unit; + return nullptr; + }(); + + if (unitTarget) + autoReapeatSpell->m_targets.SetUnitTarget(unitTarget); + else + autoReapeatSpell->m_targets.RemoveObjectTarget(); + } + } + } } void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData) |