diff options
author | silverice <none@none> | 2010-04-04 03:46:38 +0300 |
---|---|---|
committer | silverice <none@none> | 2010-04-04 03:46:38 +0300 |
commit | 5dfcccdd85691c79e93af7555eafc55214d0471e (patch) | |
tree | e91f144e0ec4f0610c6b2c14ccde7b99dc30eb47 /src | |
parent | 917193eda513d762260a9e4fd4904f00ff407caf (diff) |
correct movement packet broadcasting
mover should be source of movement packets, not player
resolves problem that movements of controlled unit not visible for nearby players
(you can detect it only when controlled unit too far from player-controller)
--HG--
branch : trunk
Diffstat (limited to 'src')
-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(); |