From adfc991f024bd92b4e9a721fe5cdfb6f9b86feb8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 30 Dec 2021 20:06:10 +0100 Subject: [PATCH] Core/Spells: Use orientation given in destTarget instead of always taking casters orientation for all effect types --- src/server/game/Spells/SpellEffects.cpp | 35 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c2a493e1c4..8252a1d2d9 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2937,9 +2937,12 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) float x, y, z, o; if (m_targets.HasDst()) - destTarget->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z, o); else + { m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); + o = target->GetOrientation(); + } o = frand(0, float(M_PI * 2)); QuaternionData rot = QuaternionData::fromEulerAnglesZYX(o, 0.f, 0.f); @@ -2947,7 +2950,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) Map* map = target->GetMap(); if (!pGameObj->Create(map->GenerateLowGuid(), gameobject_id, map, - Position(x, y, z, target->GetOrientation()), rot, 255, GO_STATE_READY)) + Position(x, y, z, o), rot, 255, GO_STATE_READY)) { delete pGameObj; return; @@ -3992,16 +3995,19 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) else go = new GameObject(); - float x, y, z; + float x, y, z, o; // If dest location if present if (m_targets.HasDst()) - destTarget->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z, o); // Summon in random point all other units if location present else + { m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); + o = m_caster->GetOrientation(); + } Map* map = m_caster->GetMap(); - if (!go->Create(map->GenerateLowGuid(), go_id, map, Position(x, y, z, m_caster->GetOrientation()), QuaternionData(), 255, GO_STATE_READY)) + if (!go->Create(map->GenerateLowGuid(), go_id, map, Position(x, y, z, o), QuaternionData(), 255, GO_STATE_READY)) { delete go; return; @@ -4778,6 +4784,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) { float dis = m_spellInfo->Effects[effIndex].CalcRadius(m_originalCaster); m_caster->GetClosePoint(fx, fy, fz, DEFAULT_WORLD_OBJECT_SIZE, dis); + fo = m_caster->GetOrientation(); } else { @@ -4787,12 +4794,13 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis; m_caster->GetClosePoint(fx, fy, fz, DEFAULT_WORLD_OBJECT_SIZE, dis); + fo = m_caster->GetOrientation(); } Map* cMap = m_caster->GetMap(); // if gameobject is summoning object, it should be spawned right on caster's position if (goinfo->type == GAMEOBJECT_TYPE_SUMMONING_RITUAL) - m_caster->GetPosition(fx, fy, fz); + m_caster->GetPosition(fx, fy, fz, fo); QuaternionData rot = QuaternionData::fromEulerAnglesZYX(fo, 0.f, 0.f); @@ -4800,7 +4808,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) { pGameObj = new Transport(); - if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, Position(fx, fy, fz, m_caster->GetOrientation()), rot, 255, GO_STATE_READY)) + if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, Position(fx, fy, fz, fo), rot, 255, GO_STATE_READY)) { delete pGameObj; return; @@ -4809,7 +4817,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) else { pGameObj = new GameObject(); - if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, Position(fx, fy, fz, m_caster->GetOrientation()), rot, 255, GO_STATE_READY)) + if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, Position(fx, fy, fz, fo), rot, 255, GO_STATE_READY)) { delete pGameObj; return; @@ -5570,15 +5578,18 @@ void Spell::EffectSummonPersonalGameObject(SpellEffIndex effIndex) if (!goId) return; - float x, y, z; + float x, y, z, o; if (m_targets.HasDst()) - destTarget->GetPosition(x, y, z); + destTarget->GetPosition(x, y, z, o); else + { m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); + o = m_caster->GetOrientation(); + } Map* map = m_caster->GetMap(); - Position pos = Position(x, y, z, m_caster->GetOrientation()); - QuaternionData rot = QuaternionData::fromEulerAnglesZYX(m_caster->GetOrientation(), 0.f, 0.f); + Position pos = Position(x, y, z, o); + QuaternionData rot = QuaternionData::fromEulerAnglesZYX(o, 0.f, 0.f); GameObject* go = new GameObject(); if (!go->Create(map->GenerateLowGuid(), goId, map, pos, rot, 255, GO_STATE_READY))