*Fix a client crash caused by transport.
--HG-- branch : trunk
This commit is contained in:
@@ -261,6 +261,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!mover->GetTransport() || !mover->m_Vehicle)
|
||||
movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
|
||||
}
|
||||
else if (plMover && plMover->m_transport) // if we were on a transport, leave
|
||||
{
|
||||
@@ -293,11 +296,12 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
|
||||
data.append(recv_data.contents(), recv_data.size());
|
||||
GetPlayer()->SendMessageToSet(&data, false);
|
||||
|
||||
mover->m_movementInfo = movementInfo;
|
||||
mover->SetUnitMovementFlags(movementInfo.flags);
|
||||
|
||||
if(plMover) // nothing is charmed, or player charmed
|
||||
{
|
||||
plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
|
||||
plMover->m_movementInfo = movementInfo;
|
||||
plMover->SetUnitMovementFlags(movementInfo.flags);
|
||||
plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode());
|
||||
|
||||
if(plMover->isMovingOrTurning())
|
||||
@@ -493,20 +497,29 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
|
||||
if(!recv_data.readPackGUID(guid))
|
||||
return;
|
||||
|
||||
Vehicle *vehicle = ObjectAccessor::GetVehicle(guid);
|
||||
Vehicle *vehicle = guid ? ObjectAccessor::GetVehicle(guid) : GetPlayer()->m_Vehicle;
|
||||
if(!vehicle)
|
||||
return;
|
||||
|
||||
int8 seatNum;
|
||||
recv_data >> seatNum;
|
||||
if(vehicle == GetPlayer()->m_Vehicle && seatNum == GetPlayer()->GetTransSeat())
|
||||
return;
|
||||
|
||||
if(!vehicle->HasEmptySeat(seatNum))
|
||||
if(!guid)
|
||||
{
|
||||
seatNum = vehicle->GetNextEmptySeat(GetPlayer()->GetTransSeat(), seatNum > 0);
|
||||
if(seatNum < 0)
|
||||
return;
|
||||
}
|
||||
else if(!vehicle->HasEmptySeat(seatNum))
|
||||
return;
|
||||
|
||||
GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer());
|
||||
GetPlayer()->m_Vehicle = vehicle;
|
||||
if(GetPlayer()->m_Vehicle != vehicle)
|
||||
{
|
||||
GetPlayer()->m_Vehicle = vehicle;
|
||||
GetPlayer()->SetClientControl(vehicle, 1);
|
||||
WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
|
||||
GetPlayer()->GetSession()->SendPacket(&data);
|
||||
}
|
||||
if(!vehicle->AddPassenger(GetPlayer(), seatNum))
|
||||
assert(false);
|
||||
}
|
||||
|
||||
@@ -270,10 +270,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
|
||||
{
|
||||
case TYPEID_UNIT:
|
||||
{
|
||||
if(((Unit*)this)->m_Vehicle)
|
||||
flags2 |= MOVEMENTFLAG_ONTRANSPORT;
|
||||
else
|
||||
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT;
|
||||
flags2 &= ~MOVEMENTFLAG_SPLINE2;
|
||||
if(((Creature*)this)->isVehicle())
|
||||
((Unit*)this)->m_movementInfo.unk1 |= 0x20; // always allow pitch
|
||||
@@ -281,11 +277,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
|
||||
break;
|
||||
case TYPEID_PLAYER:
|
||||
{
|
||||
if(((Player*)this)->GetTransport() || ((Player*)this)->m_Vehicle)
|
||||
flags2 |= MOVEMENTFLAG_ONTRANSPORT;
|
||||
else
|
||||
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT;
|
||||
|
||||
// remove unknown, unused etc flags for now
|
||||
flags2 &= ~MOVEMENTFLAG_SPLINE2; // will be set manually
|
||||
|
||||
|
||||
+1
-1
@@ -13546,7 +13546,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
|
||||
else if(GetTransport())
|
||||
*data << (uint64)GetTransport()->GetGUID();
|
||||
else
|
||||
*data << (uint64)0;
|
||||
*data << (uint64)0; //This will cause client crash
|
||||
*data << float (GetTransOffsetX());
|
||||
*data << float (GetTransOffsetY());
|
||||
*data << float (GetTransOffsetZ());
|
||||
|
||||
+29
-3
@@ -45,6 +45,7 @@ void Vehicle::AddToWorld()
|
||||
AIM_Initialize();
|
||||
switch(GetEntry())
|
||||
{
|
||||
case 27850:InstallAccessory(27905,1);break;
|
||||
case 28312:InstallAccessory(28319,7);break;
|
||||
case 32627:InstallAccessory(32629,7);break;
|
||||
}
|
||||
@@ -154,6 +155,30 @@ bool Vehicle::HasEmptySeat(int8 seatNum) const
|
||||
return !seat->second.passenger;
|
||||
}
|
||||
|
||||
int8 Vehicle::GetNextEmptySeat(int8 seatNum, bool next) const
|
||||
{
|
||||
SeatMap::const_iterator seat = m_Seats.find(seatNum);
|
||||
if(seat == m_Seats.end()) return -1;
|
||||
while(seat->second.passenger)
|
||||
{
|
||||
if(next)
|
||||
{
|
||||
++seat;
|
||||
if(seat == m_Seats.end())
|
||||
seat = m_Seats.begin();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(seat == m_Seats.begin())
|
||||
seat = m_Seats.end();
|
||||
--seat;
|
||||
}
|
||||
if(seat->first == seatNum)
|
||||
return -1;
|
||||
}
|
||||
return seat->first;
|
||||
}
|
||||
|
||||
void Vehicle::InstallAccessory(uint32 entry, int8 seatNum)
|
||||
{
|
||||
//Creature *accessory = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ());
|
||||
@@ -197,12 +222,13 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum)
|
||||
seat->second.passenger = unit;
|
||||
|
||||
//RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
//SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||
|
||||
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
|
||||
VehicleSeatEntry const *veSeat = seat->second.seatInfo;
|
||||
unit->m_movementInfo.t_x = 0;//veSeat->m_attachmentOffsetX;
|
||||
unit->m_movementInfo.t_y = 0;//veSeat->m_attachmentOffsetY;
|
||||
unit->m_movementInfo.t_z = 0;//veSeat->m_attachmentOffsetZ;
|
||||
unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX;
|
||||
unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY;
|
||||
unit->m_movementInfo.t_z = veSeat->m_attachmentOffsetZ;
|
||||
unit->m_movementInfo.t_o = 0;
|
||||
unit->m_movementInfo.t_time = 4;
|
||||
unit->m_movementInfo.t_seat = seat->first;
|
||||
|
||||
@@ -53,6 +53,7 @@ class Vehicle : public Creature
|
||||
void SetVehicleId(uint32 vehicleid);
|
||||
|
||||
bool HasEmptySeat(int8 seatNum) const;
|
||||
int8 GetNextEmptySeat(int8 seatNum, bool next) const;
|
||||
bool AddPassenger(Unit *passenger, int8 seatNum = -1);
|
||||
void RemovePassenger(Unit *passenger);
|
||||
void InstallAccessory(uint32 entry, int8 seatNum);
|
||||
|
||||
Reference in New Issue
Block a user