aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/SpellHandler.cpp
diff options
context:
space:
mode:
authorLopfest <lopfest@gmail.com>2016-02-20 23:59:56 +0100
committerLopfest <lopfest@gmail.com>2016-02-20 23:59:56 +0100
commitfacdc62b433787326673a4db05aab76d75e1283f (patch)
treef76f4e3467e3fe909da8b4e5bc5962712642e493 /src/server/game/Handlers/SpellHandler.cpp
parentd11eb335c996b398f4f8bdb10558dfba9af637f4 (diff)
parent716c952cb9f7bc0f75308bb4a716cdfe7de17281 (diff)
Merge remote-tracking branch 'upstream/6.x' into HEAD
Diffstat (limited to 'src/server/game/Handlers/SpellHandler.cpp')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp101
1 files changed, 51 insertions, 50 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index b58e2fca69e..4a28c076ce6 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -216,11 +216,8 @@ void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet)
void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjUse& packet)
{
- if (GameObject* obj = GetPlayer()->GetMap()->GetGameObject(packet.Guid))
+ if (GameObject* obj = GetPlayer()->GetGameObjectIfCanInteractWith(packet.Guid))
{
- if (!obj->IsWithinDistInMap(GetPlayer(), obj->GetInteractionDistance()))
- return;
-
// ignore for remote control state
if (GetPlayer()->m_mover != GetPlayer())
if (!(GetPlayer()->IsOnVehicle(GetPlayer()->m_mover) || GetPlayer()->IsMounted()) && !obj->GetGOInfo()->IsUsableMounted())
@@ -236,17 +233,13 @@ void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjRe
if (_player->m_mover != _player)
return;
- GameObject* go = GetPlayer()->GetMap()->GetGameObject(packet.Guid);
- if (!go)
- return;
-
- if (!go->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
- return;
-
- if (go->AI()->GossipHello(_player))
- return;
+ if (GameObject* go = GetPlayer()->GetGameObjectIfCanInteractWith(packet.Guid))
+ {
+ if (go->AI()->GossipHello(_player))
+ return;
- _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry());
+ _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry());
+ }
}
void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast)
@@ -367,32 +360,26 @@ void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& canc
}
}
-void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)
+void WorldSession::HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet)
{
- ObjectGuid guid;
- uint32 spellId;
-
- recvPacket >> guid;
- recvPacket >> spellId;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.SpellID);
if (!spellInfo)
{
- TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", spellId);
+ TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", packet.SpellID);
return;
}
- Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID);
if (!pet)
{
- TC_LOG_ERROR("network", "HandlePetCancelAura: Attempt to cancel an aura for non-existant %s by player '%s'", guid.ToString().c_str(), GetPlayer()->GetName().c_str());
+ TC_LOG_ERROR("network", "HandlePetCancelAura: Attempt to cancel an aura for non-existant %s by player '%s'", packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str());
return;
}
if (pet != GetPlayer()->GetGuardianPet() && pet != GetPlayer()->GetCharm())
{
- TC_LOG_ERROR("network", "HandlePetCancelAura: %s is not a pet of player '%s'", guid.ToString().c_str(), GetPlayer()->GetName().c_str());
+ TC_LOG_ERROR("network", "HandlePetCancelAura: %s is not a pet of player '%s'", packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str());
return;
}
@@ -402,7 +389,7 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)
return;
}
- pet->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
+ pet->RemoveOwnedAura(packet.SpellID, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
}
void WorldSession::HandleCancelGrowthAuraOpcode(WorldPackets::Spells::CancelGrowthAura& /*cancelGrowthAura*/)
@@ -568,39 +555,53 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI
}
}
-void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket)
+void WorldSession::HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet)
{
- ObjectGuid casterGuid;
- uint32 spellId;
- uint8 castCount;
- float x, y, z; // Position of missile hit
-
- recvPacket >> casterGuid;
- recvPacket >> spellId;
- recvPacket >> castCount;
- recvPacket >> x;
- recvPacket >> y;
- recvPacket >> z;
-
- Unit* caster = ObjectAccessor::GetUnit(*_player, casterGuid);
+ Unit* caster = ObjectAccessor::GetUnit(*_player, packet.Target);
if (!caster)
return;
- Spell* spell = caster->FindCurrentSpellBySpellId(spellId);
+ Spell* spell = caster->FindCurrentSpellBySpellId(packet.SpellID);
if (!spell || !spell->m_targets.HasDst())
return;
Position pos = *spell->m_targets.GetDstPos();
- pos.Relocate(x, y, z);
+ pos.Relocate(packet.CollisionPos);
spell->m_targets.ModDst(pos);
- WorldPacket data(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, 21);
- data << casterGuid;
- data << uint8(castCount);
- data << float(x);
- data << float(y);
- data << float(z);
- caster->SendMessageToSet(&data, true);
+ WorldPackets::Spells::NotifyMissileTrajectoryCollision notify;
+ notify.Caster = packet.Target;
+ notify.CastID = packet.CastID;
+ notify.CollisionPos = packet.CollisionPos;
+ caster->SendMessageToSet(notify.Write(), true);
+}
+
+void WorldSession::HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet)
+{
+ Unit* caster = ObjectAccessor::GetUnit(*_player, packet.Guid);
+ Spell* spell = caster ? caster->GetCurrentSpell(CURRENT_GENERIC_SPELL) : NULL;
+ if (!spell || spell->m_spellInfo->Id != uint32(packet.SpellID) || !spell->m_targets.HasDst() || !spell->m_targets.HasSrc())
+ return;
+
+ Position pos = *spell->m_targets.GetSrcPos();
+ pos.Relocate(packet.FirePos);
+ spell->m_targets.ModSrc(pos);
+
+ pos = *spell->m_targets.GetDstPos();
+ pos.Relocate(packet.ImpactPos);
+ spell->m_targets.ModDst(pos);
+
+ spell->m_targets.SetPitch(packet.Pitch);
+ spell->m_targets.SetSpeed(packet.Speed);
+
+ if (packet.Status.is_initialized())
+ {
+ GetPlayer()->ValidateMovementInfo(packet.Status.get_ptr());
+ /*uint32 opcode;
+ recvPacket >> opcode;
+ recvPacket.SetOpcode(CMSG_MOVE_STOP); // always set to CMSG_MOVE_STOP in client SetOpcode
+ //HandleMovementOpcodes(recvPacket);*/
+ }
}
void WorldSession::HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& /*requestCategoryCooldowns*/)