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
This commit is contained in:
@@ -127,9 +127,11 @@ namespace Trinity
|
|||||||
uint32 i_phaseMask;
|
uint32 i_phaseMask;
|
||||||
float i_distSq;
|
float i_distSq;
|
||||||
uint32 team;
|
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())
|
: 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)
|
, team((own_team_only && src->GetTypeId() == TYPEID_PLAYER) ? ((Player*)src)->GetTeam() : 0)
|
||||||
|
, skipped_receiver(skipped)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void Visit(PlayerMapType &m);
|
void Visit(PlayerMapType &m);
|
||||||
@@ -140,7 +142,7 @@ namespace Trinity
|
|||||||
void SendPacket(Player* plr)
|
void SendPacket(Player* plr)
|
||||||
{
|
{
|
||||||
// never send packet to self
|
// 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;
|
return;
|
||||||
|
|
||||||
plr->GetSession()->SendPacket(i_message);
|
plr->GetSession()->SendPacket(i_message);
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
|
|||||||
movementInfo.time = getMSTime();
|
movementInfo.time = getMSTime();
|
||||||
movementInfo.guid = mover->GetGUID();
|
movementInfo.guid = mover->GetGUID();
|
||||||
WriteMovementInfo(&data, &movementInfo);
|
WriteMovementInfo(&data, &movementInfo);
|
||||||
GetPlayer()->SendMessageToSet(&data, false);
|
mover->SendMessageToSet(&data, _player);
|
||||||
|
|
||||||
mover->m_movementInfo = movementInfo;
|
mover->m_movementInfo = movementInfo;
|
||||||
|
|
||||||
@@ -360,9 +360,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
|
||||||
|
|
||||||
if (plMover) // nothing is charmed, or player charmed
|
if (plMover) // nothing is charmed, or player charmed
|
||||||
{
|
{
|
||||||
plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
|
|
||||||
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
|
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
|
||||||
|
|
||||||
if (movementInfo.z < -500.0f)
|
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();
|
bool flying = mover->IsFlying();
|
||||||
if(flying != ((mover->GetByteValue(UNIT_FIELD_BYTES_1, 3) & 0x02) ? true : false))
|
if(flying != ((mover->GetByteValue(UNIT_FIELD_BYTES_1, 3) & 0x02) ? true : false))
|
||||||
mover->SetFlying(flying);
|
mover->SetFlying(flying);
|
||||||
}*/
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
//sLog.outString("Receive Movement Packet %s:", opcodeTable[recv_data.GetOpcode()]);
|
//sLog.outString("Receive Movement Packet %s:", opcodeTable[recv_data.GetOpcode()]);
|
||||||
//mover->OutMovementInfo();
|
//mover->OutMovementInfo();
|
||||||
|
|||||||
@@ -1656,6 +1656,12 @@ void WorldObject::SendMessageToSetInRange(WorldPacket *data, float dist, bool /*
|
|||||||
VisitNearbyWorldObject(dist, notifier);
|
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)
|
void WorldObject::SendObjectDeSpawnAnim(uint64 guid)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8);
|
WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8);
|
||||||
|
|||||||
@@ -598,6 +598,7 @@ class WorldObject : public Object, public WorldLocation
|
|||||||
|
|
||||||
virtual void SendMessageToSet(WorldPacket *data, bool self);
|
virtual void SendMessageToSet(WorldPacket *data, bool self);
|
||||||
virtual void SendMessageToSetInRange(WorldPacket *data, float dist, 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 MonsterSay(const char* text, uint32 language, uint64 TargetGuid);
|
||||||
void MonsterYell(const char* text, uint32 language, uint64 TargetGuid);
|
void MonsterYell(const char* text, uint32 language, uint64 TargetGuid);
|
||||||
|
|||||||
@@ -6045,6 +6045,17 @@ void Player::SendMessageToSetInRange(WorldPacket *data, float dist, bool self, b
|
|||||||
VisitNearbyWorldObject(dist, notifier);
|
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)
|
void Player::SendDirectMessage(WorldPacket *data)
|
||||||
{
|
{
|
||||||
if (m_session)
|
if (m_session)
|
||||||
|
|||||||
@@ -1824,6 +1824,7 @@ class Player : public Unit, public GridObject<Player>
|
|||||||
void SendMessageToSet(WorldPacket *data, bool self);// overwrite Object::SendMessageToSet
|
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 fist, bool self);// overwrite Object::SendMessageToSetInRange
|
||||||
void SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool own_team_only);
|
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 SendTeleportPacket(Position &oldPos);
|
||||||
void SendTeleportAckPacket();
|
void SendTeleportAckPacket();
|
||||||
|
|||||||
Reference in New Issue
Block a user