aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp26
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h7
2 files changed, 31 insertions, 2 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 10d534f4568..924b52de044 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -701,6 +701,7 @@ void Vehicle::CalculatePassengerOffset(float& x, float& y, float& z, float& o)
void Vehicle::CancelJoinEvent(VehicleJoinEvent* e)
{
+ ASSERT(_pendingJoinEvents.back() == e);
e->to_Abort = true;
_pendingJoinEvents.pop_back();
}
@@ -731,6 +732,29 @@ void Vehicle::RemovePendingEvent(VehicleJoinEvent* e)
}
/**
+ * @fn void Vehicle::RemovePendingEventsForSeat(uint8 seatId)
+ *
+ * @brief Removes any pending events for given seatId. Executed when a @VehicleJoinEvent::Execute is called
+ *
+ * @author Machiavelli
+ * @date 23-2-2013
+ *
+ * @param seatId Identifier for the seat.
+ */
+
+void Vehicle::RemovePendingEventsForSeat(uint8 seatId)
+{
+ for (std::deque<VehicleJoinEvent*>::iterator itr = _pendingJoinEvents.begin(); itr != _pendingJoinEvents.end(); ++itr)
+ {
+ if (uint8((*itr)->Seat->first) == seatId)
+ {
+ (*itr)->to_Abort = true;
+ _pendingJoinEvents.erase(itr);
+ }
+ }
+}
+
+/**
* @fn bool VehicleJoinEvent::Execute(uint64, uint32)
*
* @brief Actually adds the passenger @Passenger to vehicle @Target.
@@ -750,6 +774,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
ASSERT(Passenger->IsInWorld());
ASSERT(Target->GetBase()->IsInWorld());
+ Target->RemovePendingEventsForSeat(uint8(Seat->first));
+
Passenger->m_vehicle = Target;
Seat->second.Passenger = Passenger->GetGUID();
if (Seat->second.SeatInfo->CanEnterOrExit())
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 40aea1a2d02..65aa6f2517b 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -94,6 +94,11 @@ class Vehicle : public TransportBase
/// This method transforms supplied global coordinates into local offsets
void CalculatePassengerOffset(float& x, float& y, float& z, float& o);
+ void CancelJoinEvent(VehicleJoinEvent* e);
+ void RemovePendingEvent(VehicleJoinEvent* e);
+ void RemovePendingEventsForSeat(uint8 seatId);
+
+ private:
Unit* _me; ///< The underlying unit with the vehicle kit. Can be player or creature.
VehicleEntry const* _vehicleInfo; ///< DBC data for vehicle
GuidSet vehiclePlayers;
@@ -102,8 +107,6 @@ class Vehicle : public TransportBase
Status _status; ///< Internal variable for sanity checks
Position m_lastShootPos;
std::deque<VehicleJoinEvent*> _pendingJoinEvents; ///< Collection of delayed join events for prospective passengers
- void CancelJoinEvent(VehicleJoinEvent* e);
- void RemovePendingEvent(VehicleJoinEvent* e);
};
class VehicleJoinEvent : public BasicEvent