aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-21 13:36:34 -0500
committermegamage <none@none>2009-04-21 13:36:34 -0500
commitb154137401d49b66d585463226e62b31b3be9d80 (patch)
tree79df6effaafee5f423a925e12499b86f221ecdf7
parent4e1143c990154e2dc52ddacdc522f89e455338cc (diff)
*More work on vehicle.
--HG-- branch : trunk
-rw-r--r--src/game/MovementHandler.cpp8
-rw-r--r--src/game/Vehicle.cpp35
-rw-r--r--src/game/Vehicle.h7
3 files changed, 39 insertions, 11 deletions
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();