diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp index 512f91885..ee21d0134 100644 --- a/src/game/GridNotifiers.cpp +++ b/src/game/GridNotifiers.cpp @@ -132,6 +132,20 @@ MessageDeliverer::Visit(PlayerMapType &m) } } +void MessageDelivererExcept::Visit(PlayerMapType &m) +{ + for(PlayerMapType::iterator it = m.begin(); it!= m.end(); ++it) + { + Player* player = it->getSource(); + if(!player->InSamePhase(i_phaseMask) || player == i_skipped_receiver) + continue; + + if (WorldSession* session = player->GetSession()) + session->SendPacket(i_message); + } +} + + void ObjectMessageDeliverer::Visit(PlayerMapType &m) { diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h index 000548b7b..c3b3f0509 100644 --- a/src/game/GridNotifiers.h +++ b/src/game/GridNotifiers.h @@ -87,6 +87,19 @@ namespace MaNGOS template void Visit(GridRefManager &) {} }; + struct MessageDelivererExcept + { + uint32 i_phaseMask; + WorldPacket* i_message; + Player const* i_skipped_receiver; + + MessageDelivererExcept(WorldObject const* obj, WorldPacket *msg, Player const* skipped) + : i_phaseMask(obj->GetPhaseMask()), i_message(msg), i_skipped_receiver(skipped) {} + + void Visit(PlayerMapType &m); + template void Visit(GridRefManager &) {} + }; + struct MANGOS_DLL_DECL ObjectMessageDeliverer { uint32 i_phaseMask; diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 2c2ca3081..b892be88e 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -305,7 +305,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) WorldPacket data(opcode, recv_data.size()); data.appendPackGUID(mover->GetGUID()); // write guid movementInfo.Write(data); // write data - GetPlayer()->SendMessageToSet(&data, false); + mover->SendMessageToSetExcept(&data, _player); if(plMover) // nothing is charmed, or player charmed { diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 333f1c97a..c0d547462 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1579,11 +1579,20 @@ void WorldObject::SendMessageToSet(WorldPacket *data, bool /*bToSelf*/) void WorldObject::SendMessageToSetInRange(WorldPacket *data, float dist, bool /*bToSelf*/) { //if object is in world, map for it already created! - Map * _map = IsInWorld() ? GetMap() : sMapMgr.FindMap(GetMapId(), GetInstanceId()); - if(_map) + if (Map * _map = IsInWorld() ? GetMap() : sMapMgr.FindMap(GetMapId(), GetInstanceId())) _map->MessageDistBroadcast(this, data, dist); } +void WorldObject::SendMessageToSetExcept(WorldPacket *data, Player const* skipped_receiver) +{ + //if object is in world, map for it already created! + if (Map * _map = IsInWorld() ? GetMap() : sMapMgr.FindMap(GetMapId(), GetInstanceId())) + { + MaNGOS::MessageDelivererExcept notifier(this, data, skipped_receiver); + Cell::VisitWorldObjects(this, notifier, _map->GetVisibilityDistance()); + } +} + void WorldObject::SendObjectDeSpawnAnim(uint64 guid) { WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); diff --git a/src/game/Object.h b/src/game/Object.h index 32beee20e..04c31f0f5 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -429,6 +429,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object virtual void SendMessageToSet(WorldPacket *data, bool self); virtual void SendMessageToSetInRange(WorldPacket *data, float dist, bool self); + void SendMessageToSetExcept(WorldPacket *data, Player const* skipped_receiver); void MonsterSay(const char* text, uint32 language, uint64 TargetGuid); void MonsterYell(const char* text, uint32 language, uint64 TargetGuid); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 1405e9d7e..e7e3b4366 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9795" + #define REVISION_NR "9796" #endif // __REVISION_NR_H__