*More work on vehicle.
--HG-- branch : trunk
This commit is contained in:
@@ -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);
|
||||
|
||||
+33
-2
@@ -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();
|
||||
|
||||
+1
-6
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user