diff options
-rw-r--r-- | src/game/GridNotifiers.h | 6 | ||||
-rw-r--r-- | src/game/MovementHandler.cpp | 15 | ||||
-rw-r--r-- | src/game/Object.cpp | 6 | ||||
-rw-r--r-- | src/game/Object.h | 1 | ||||
-rw-r--r-- | src/game/Player.cpp | 11 | ||||
-rw-r--r-- | src/game/Player.h | 1 |
6 files changed, 30 insertions, 10 deletions
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h index c6c4ee30a87..49d2bd38d02 100644 --- a/src/game/GridNotifiers.h +++ b/src/game/GridNotifiers.h @@ -127,9 +127,11 @@ namespace Trinity uint32 i_phaseMask; float i_distSq; uint32 team; - MessageDistDeliverer(WorldObject *src, WorldPacket *msg, float dist, bool own_team_only = false) + Player const* skipped_receiver; + MessageDistDeliverer(WorldObject *src, WorldPacket *msg, float dist, bool own_team_only = false, Player const* skipped = NULL) : i_source(src), i_message(msg), i_distSq(dist * dist), i_phaseMask(src->GetPhaseMask()) , team((own_team_only && src->GetTypeId() == TYPEID_PLAYER) ? ((Player*)src)->GetTeam() : 0) + , skipped_receiver(skipped) { } void Visit(PlayerMapType &m); @@ -140,7 +142,7 @@ namespace Trinity void SendPacket(Player* plr) { // never send packet to self - if(plr == i_source || team && plr->GetTeam() != team) + if(plr == i_source || (team && plr->GetTeam() != team) || skipped_receiver == plr) return; plr->GetSession()->SendPacket(i_message); diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 03ad6bf6e63..f138b42c486 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -349,7 +349,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) movementInfo.time = getMSTime(); movementInfo.guid = mover->GetGUID(); WriteMovementInfo(&data, &movementInfo); - GetPlayer()->SendMessageToSet(&data, false); + mover->SendMessageToSet(&data, _player); mover->m_movementInfo = movementInfo; @@ -360,9 +360,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) return; } + mover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); + if (plMover) // nothing is charmed, or player charmed { - plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->UpdateFallInformationIfNeed(movementInfo, opcode); if (movementInfo.z < -500.0f) @@ -396,17 +397,15 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } } } - else // creature charmed + /*else // creature charmed { - mover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - - /*if(mover->canFly()) + if(mover->canFly()) { bool flying = mover->IsFlying(); if(flying != ((mover->GetByteValue(UNIT_FIELD_BYTES_1, 3) & 0x02) ? true : false)) mover->SetFlying(flying); - }*/ - } + } + }*/ //sLog.outString("Receive Movement Packet %s:", opcodeTable[recv_data.GetOpcode()]); //mover->OutMovementInfo(); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index a5279e6a581..61f56cb0b81 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1656,6 +1656,12 @@ void WorldObject::SendMessageToSetInRange(WorldPacket *data, float dist, bool /* VisitNearbyWorldObject(dist, notifier); } +void WorldObject::SendMessageToSet(WorldPacket *data, Player const* skipped_rcvr) +{ + Trinity::MessageDistDeliverer notifier(this, data, GetMap()->GetVisibilityDistance(), false, skipped_rcvr); + VisitNearbyWorldObject(GetMap()->GetVisibilityDistance(), notifier); +} + 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 dd8b808b920..6029a756620 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -598,6 +598,7 @@ class WorldObject : public Object, public WorldLocation virtual void SendMessageToSet(WorldPacket *data, bool self); virtual void SendMessageToSetInRange(WorldPacket *data, float dist, bool self); + virtual void SendMessageToSet(WorldPacket *data, Player const* skipped_rcvr); void MonsterSay(const char* text, uint32 language, uint64 TargetGuid); void MonsterYell(const char* text, uint32 language, uint64 TargetGuid); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index d8b8e4d8b65..1a1bffa4b0a 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6045,6 +6045,17 @@ void Player::SendMessageToSetInRange(WorldPacket *data, float dist, bool self, b VisitNearbyWorldObject(dist, notifier); } +void Player::SendMessageToSet(WorldPacket *data, Player const* skipped_rcvr) +{ + if (skipped_rcvr != this) + GetSession()->SendPacket(data); + + // we use World::GetMaxVisibleDistance() because i cannot see why not use a distance + // update: replaced by GetMap()->GetVisibilityDistance() + Trinity::MessageDistDeliverer notifier(this, data, GetMap()->GetVisibilityDistance(), false, skipped_rcvr); + VisitNearbyWorldObject(GetMap()->GetVisibilityDistance(), notifier); +} + void Player::SendDirectMessage(WorldPacket *data) { if (m_session) diff --git a/src/game/Player.h b/src/game/Player.h index b1b32ce9008..0578553b83b 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1824,6 +1824,7 @@ class Player : public Unit, public GridObject<Player> void SendMessageToSet(WorldPacket *data, bool self);// overwrite Object::SendMessageToSet void SendMessageToSetInRange(WorldPacket *data, float fist, bool self);// overwrite Object::SendMessageToSetInRange void SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool own_team_only); + void SendMessageToSet(WorldPacket *data, Player const* skipped_rcvr); void SendTeleportPacket(Position &oldPos); void SendTeleportAckPacket(); |