Added (blizzlike) packet broadcast to near teleport. Thanks to Zor and nalimleinad (AKA anonymous colleague #1) for research.

--HG--
branch : trunk
This commit is contained in:
Xanadu
2010-03-18 17:58:27 +01:00
parent 302af79bc2
commit 59e0d42260
5 changed files with 17 additions and 29 deletions
+12 -3
View File
@@ -1640,7 +1640,16 @@ uint8 Player::chatTag() const
return 0; return 0;
} }
void Player::SendTeleportAckMsg() void Player::SendTeleportPacket(Position &oldPos)
{
WorldPacket data2(MSG_MOVE_TELEPORT, 38);
data2.append(GetPackGUID());
BuildMovementPacket(&data2);
Relocate(&oldPos);
SendMessageToSet(&data2, false);
}
void Player::SendTeleportAckPacket()
{ {
WorldPacket data(MSG_MOVE_TELEPORT_ACK, 41); WorldPacket data(MSG_MOVE_TELEPORT_ACK, 41);
data.append(GetPackGUID()); data.append(GetPackGUID());
@@ -1777,8 +1786,8 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
Position oldPos; Position oldPos;
GetPosition(&oldPos); GetPosition(&oldPos);
Relocate(x, y, z, orientation); Relocate(x, y, z, orientation);
SendTeleportAckMsg(); SendTeleportAckPacket();
Relocate(&oldPos); SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
} }
} }
else else
+2 -1
View File
@@ -1825,7 +1825,8 @@ class Player : public Unit, public GridObject<Player>
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 SendTeleportAckMsg(); void SendTeleportPacket(Position &oldPos);
void SendTeleportAckPacket();
static void DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmChars = true); static void DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmChars = true);
+1 -1
View File
@@ -3898,7 +3898,7 @@ void Spell::EffectDistract(uint32 /*i*/)
{ {
// For players just turn them // For players just turn them
unitTarget->ToPlayer()->SetPosition(unitTarget->GetPositionX(), unitTarget->GetPositionY(), unitTarget->GetPositionZ(), angle, false); unitTarget->ToPlayer()->SetPosition(unitTarget->GetPositionX(), unitTarget->GetPositionY(), unitTarget->GetPositionZ(), angle, false);
unitTarget->ToPlayer()->SendTeleportAckMsg(); unitTarget->ToPlayer()->SendTeleportAckPacket();
} }
else else
{ {
+1 -23
View File
@@ -15990,7 +15990,7 @@ void Unit::ExitVehicle()
if (GetTypeId() == TYPEID_PLAYER) if (GetTypeId() == TYPEID_PLAYER)
{ {
//this->ToPlayer()->SetClientControl(this, 1); //this->ToPlayer()->SetClientControl(this, 1);
this->ToPlayer()->SendTeleportAckMsg(); this->ToPlayer()->SendTeleportAckPacket();
this->ToPlayer()->SetFallInformation(0, GetPositionZ()); this->ToPlayer()->SetFallInformation(0, GetPositionZ());
} }
WorldPacket data; WorldPacket data;
@@ -16109,31 +16109,9 @@ void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool ca
this->ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0)); this->ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0));
else else
{ {
WorldPacket data;
/*data.Initialize(MSG_MOVE_TELEPORT, 30);
data.append(GetPackGUID());
data << uint32(GetUnitMovementFlags());
data << uint16(0); // Probably walk flags here
data << getMSTime(); // time
data << x; // destination coords
data << y;
data << z;
data << orientation;
data << uint32 (0);
// Other information here: jumping angle etc
SendMessageToSet(&data, false);*/
// FIXME: this interrupts spell visual // FIXME: this interrupts spell visual
DestroyForNearbyPlayers(); DestroyForNearbyPlayers();
SetPosition(x, y, z, orientation, true); SetPosition(x, y, z, orientation, true);
//ObjectAccessor::UpdateObjectVisibility(this);
//WorldPacket data;
// Work strange for many spells: triggered active mover set for targeted player to creature
//BuildTeleportAckMsg(&data, x, y, z, orientation);
//BuildHeartBeatMsg(&data);
//SendMessageToSet(&data, false);
} }
} }
+1 -1
View File
@@ -341,7 +341,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId)
} }
//if(unit->GetTypeId() == TYPEID_PLAYER) //if(unit->GetTypeId() == TYPEID_PLAYER)
// unit->ToPlayer()->SendTeleportAckMsg(); // unit->ToPlayer()->SendTeleportAckPacket();
//unit->SendMovementFlagUpdate(); //unit->SendMovementFlagUpdate();
return true; return true;