*More work on vehicle.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-21 13:36:34 -05:00
parent 4e1143c990
commit b154137401
3 changed files with 39 additions and 11 deletions
+5 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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();