aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-23 00:12:29 -0500
committermegamage <none@none>2009-04-23 00:12:29 -0500
commitbce871f253d65da99f298c7eaf798b61c8c31369 (patch)
treeb39c1e74cd31a49186b0b272509d905f8fb50b81 /src
parentf5fff5b186cffe7de4853897ba95cd8d08038d56 (diff)
*Fix a client crash caused by transport.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/MovementHandler.cpp29
-rw-r--r--src/game/Object.cpp9
-rw-r--r--src/game/Unit.cpp2
-rw-r--r--src/game/Vehicle.cpp32
-rw-r--r--src/game/Vehicle.h1
5 files changed, 52 insertions, 21 deletions
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index cf312ad3513..d018adb7e2e 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -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);
}
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 0739f89db2c..0575ef6623a 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -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
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 887ef6993df..832e2e6fff4 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -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());
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index a788bec1c48..f2d023300fe 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -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;
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
index 0b134348454..3e1118f4685 100644
--- a/src/game/Vehicle.h
+++ b/src/game/Vehicle.h
@@ -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);