From 4e1143c990154e2dc52ddacdc522f89e455338cc Mon Sep 17 00:00:00 2001 From: megamage Date: Tue, 21 Apr 2009 12:55:26 -0500 Subject: *Fix a crash of vehicle. --HG-- branch : trunk --- src/game/MovementHandler.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/game/MovementHandler.cpp') diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 50152de4e97..a5d79b678b2 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -496,6 +496,21 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) recv_data >> d >> e >> f >> g >> h >> i >> j >> k; recv_data >> seat; //sLog.outError("change seat %u %u %u %u %u %u %u %u %u %u %u %u", a, b,c,d,e,f,g,h,i,j,k,seat); + + if(seat == GetPlayer()->GetTransSeat()) + return; + + if(Vehicle *vehicle = GetPlayer()->m_Vehicle) + { + if(vehicle->HasEmptySeat(seat)) + { + vehicle->RemovePassenger(GetPlayer()); + if(!vehicle->AddPassenger(GetPlayer(), seat)) + { + assert(false); + } + } + } } void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data) -- cgit v1.2.3 From b154137401d49b66d585463226e62b31b3be9d80 Mon Sep 17 00:00:00 2001 From: megamage Date: Tue, 21 Apr 2009 13:36:34 -0500 Subject: *More work on vehicle. --HG-- branch : trunk --- src/game/MovementHandler.cpp | 8 +++++--- src/game/Vehicle.cpp | 35 +++++++++++++++++++++++++++++++++-- src/game/Vehicle.h | 7 +------ 3 files changed, 39 insertions(+), 11 deletions(-) (limited to 'src/game/MovementHandler.cpp') diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index a5d79b678b2..c400e1f23fc 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -500,11 +500,13 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) if(seat == GetPlayer()->GetTransSeat()) return; - if(Vehicle *vehicle = GetPlayer()->m_Vehicle) + if(GetPlayer()->m_Vehicle) { - if(vehicle->HasEmptySeat(seat)) + if(Vehicle *vehicle = GetPlayer()->m_Vehicle->HasEmptySeat(seat)) { - vehicle->RemovePassenger(GetPlayer()); + GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer()); + //If the player is going to a turret, the vehicle should be changed + GetPlayer()->m_Vehicle = vehicle; if(!vehicle->AddPassenger(GetPlayer(), seat)) { assert(false); diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index 2292e981d5b..48edcdd9340 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -60,7 +60,15 @@ void Vehicle::RemoveFromWorld() void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState { if(s == JUST_DIED) + { + for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) + { + if(Unit *passenger = itr->second.passenger) + if(passenger->GetTypeId() == TYPEID_UNIT && ((Creature*)passenger)->isVehicle()) + ((Vehicle*)passenger)->setDeathState(s); + } RemoveAllPassengers(); + } Creature::setDeathState(s); } @@ -100,9 +108,11 @@ bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, u void Vehicle::RemoveAllPassengers() { for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) - if(itr->second.passenger) + if(Unit *passenger = itr->second.passenger) { - itr->second.passenger->ExitVehicle(); + if(passenger->GetTypeId() == TYPEID_UNIT && ((Creature*)passenger)->isVehicle()) + ((Vehicle*)passenger)->RemoveAllPassengers(); + passenger->ExitVehicle(); assert(!itr->second.passenger); } } @@ -132,6 +142,21 @@ void Vehicle::SetVehicleId(uint32 id) assert(!m_Seats.empty()); } +Vehicle* Vehicle::HasEmptySeat(int8 seatNum) const +{ + SeatMap::const_iterator seat = m_Seats.find(seatNum); + //No such seat + if(seat == m_Seats.end()) return NULL; + //Not occupied + if(!seat->second.passenger) return (Vehicle*)this; + //Check if turret is empty + if(seat->second.passenger->GetTypeId() == TYPEID_UNIT + && ((Creature*)seat->second.passenger)->isVehicle()) + return ((Vehicle*)seat->second.passenger)->HasEmptySeat(seatNum); + //Occupied + return NULL; +} + bool Vehicle::AddPassenger(Unit *unit, int8 seatNum) { if(unit->m_Vehicle != this) @@ -236,6 +261,12 @@ void Vehicle::RemovePassenger(Unit *unit) void Vehicle::Dismiss() { + for(SeatMap::iterator itr = m_Seats.begin(); itr != m_Seats.end(); ++itr) + { + if(Unit *passenger = itr->second.passenger) + if(passenger->GetTypeId() == TYPEID_UNIT && ((Creature*)passenger)->isVehicle()) + ((Vehicle*)passenger)->Dismiss(); + } RemoveAllPassengers(); SendObjectDeSpawnAnim(GetGUID()); CombatStop(); diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h index a4dffa9ea03..401efd32d61 100644 --- a/src/game/Vehicle.h +++ b/src/game/Vehicle.h @@ -52,12 +52,7 @@ class Vehicle : public Creature VehicleEntry const *GetVehicleInfo() { return m_vehicleInfo; } void SetVehicleId(uint32 vehicleid); - bool HasEmptySeat(int8 seatNum) const - { - SeatMap::const_iterator seat = m_Seats.find(seatNum); - if(seat == m_Seats.end()) return false; - return !seat->second.passenger; - } + Vehicle* HasEmptySeat(int8 seatNum) const; bool AddPassenger(Unit *passenger, int8 seatNum = -1); void RemovePassenger(Unit *passenger); void Dismiss(); -- cgit v1.2.3