From 0ef974a9de4187f080e90a9e3aa0a8087113a59d Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 22 Feb 2013 01:21:49 +0100 Subject: Core/Creatures: Set hover movement flag if bytes1 have hover flag and creature cannot fly --- src/server/game/Entities/Creature/Creature.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d2bc7c624b5..39534c1c2bf 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2112,9 +2112,11 @@ bool Creature::LoadCreaturesAddon(bool reload) SetByteValue(UNIT_FIELD_BYTES_1, 3, uint8((cainfo->bytes1 >> 24) & 0xFF)); //! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2: - //! If no inhabittype_fly (if no MovementFlag_DisableGravity flag found in sniffs) + //! If no inhabittype_fly (if no MovementFlag_DisableGravity or MovementFlag_CanFly flag found in sniffs) + //! Check using InhabitType as movement flags are assigned dynamically + //! basing on whether the creature is in air or not //! Set MovementFlag_Hover. Otherwise do nothing. - if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE1_FLAG_HOVER && !IsLevitating()) + if (GetByteValue(UNIT_FIELD_BYTES_1, 3) & UNIT_BYTE1_FLAG_HOVER && !(GetCreatureTemplate()->InhabitType & INHABIT_AIR)) AddUnitMovementFlag(MOVEMENTFLAG_HOVER); } -- cgit v1.2.3 From 2f0bbe67ae1ffbadc4ace7a3028cf791fc262a7e Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 22 Feb 2013 17:46:29 +0100 Subject: Core/Vehicles: Fixed accessing freed memory in Vehicle::RemoveAllPassengers - _pendingJoinEvents needs to be cleaned from events that had already executed or were aborted --- src/server/game/Entities/Vehicle/Vehicle.cpp | 27 ++++++++++++++++++++++++++- src/server/game/Entities/Vehicle/Vehicle.h | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 1f6c62f0579..05a86653c55 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -256,7 +256,7 @@ void Vehicle::RemoveAllPassengers() /// Setting to_Abort to true will cause @VehicleJoinEvent::Abort to be executed on next @Unit::UpdateEvents call /// This will properly "reset" the pending join process for the passenger. - while (_pendingJoinEvents.size()) + while (!_pendingJoinEvents.empty()) { VehicleJoinEvent* e = _pendingJoinEvents.front(); e->to_Abort = true; @@ -705,6 +705,31 @@ void Vehicle::CancelJoinEvent(VehicleJoinEvent* e) _pendingJoinEvents.pop_back(); } +/** + * @fn void Vehicle::RemovePendingEvent(VehicleJoinEvent* e) + * + * @brief Removes @VehicleJoinEvent objects from pending join event store. + * This method only removes it after it's executed or aborted to prevent leaving + * pointers to deleted events. + * + * @author Shauren + * @date 22-2-2013 + * + * @param [in] e The VehicleJoinEvent* to remove from pending event store. + */ + +void Vehicle::RemovePendingEvent(VehicleJoinEvent* e) +{ + for (std::deque::iterator itr = _pendingJoinEvents.begin(); itr != _pendingJoinEvents.end(); ++itr) + { + if (*itr == e) + { + _pendingJoinEvents.erase(itr); + break; + } + } +} + /** * @fn bool VehicleJoinEvent::Execute(uint64, uint32) * diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 7ec0df8e533..e1263a8e661 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -101,6 +101,7 @@ class Vehicle : public TransportBase Position m_lastShootPos; std::deque _pendingJoinEvents; ///< Collection of delayed join events for prospective passengers void CancelJoinEvent(VehicleJoinEvent* e); + void RemovePendingEvent(VehicleJoinEvent* e); }; class VehicleJoinEvent : public BasicEvent @@ -108,6 +109,7 @@ class VehicleJoinEvent : public BasicEvent friend class Vehicle; protected: VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()) {} + ~VehicleJoinEvent() { Target->RemovePendingEvent(this); } bool Execute(uint64, uint32); void Abort(uint64); -- cgit v1.2.3 From ae8e423c73245c69f239fe471ba057d7cfd09aa3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 22 Feb 2013 17:46:57 +0100 Subject: Core/Vehicles: Minor cleanup in header file --- src/server/game/Entities/Vehicle/Vehicle.h | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index e1263a8e661..40aea1a2d02 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -27,11 +27,19 @@ struct VehicleEntry; class Unit; -typedef std::set GuidSet; class VehicleJoinEvent; +typedef std::set GuidSet; + class Vehicle : public TransportBase { + protected: + friend bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry); + Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry); + + friend void Unit::RemoveVehicleKit(); + ~Vehicle(); + public: void Install(); void Uninstall(); @@ -61,19 +69,13 @@ class Vehicle : public TransportBase void SetLastShootPos(Position const& pos) { m_lastShootPos.Relocate(pos); } Position GetLastShootPos() { return m_lastShootPos; } - SeatMap Seats; ///< The collection of all seats on the vehicle. Including vacant ones. + SeatMap Seats; ///< The collection of all seats on the vehicle. Including vacant ones. VehicleSeatEntry const* GetSeatForPassenger(Unit* passenger); protected: friend class VehicleJoinEvent; - uint32 UsableSeatNum; ///< Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags - - protected: - friend bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry); - Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry); - friend void Unit::RemoveVehicleKit(); - ~Vehicle(); + uint32 UsableSeatNum; ///< Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags private: enum Status @@ -92,12 +94,12 @@ class Vehicle : public TransportBase /// This method transforms supplied global coordinates into local offsets void CalculatePassengerOffset(float& x, float& y, float& z, float& o); - Unit* _me; ///< The underlying unit with the vehicle kit. Can be player or creature. - VehicleEntry const* _vehicleInfo; ///< DBC data for vehicle + Unit* _me; ///< The underlying unit with the vehicle kit. Can be player or creature. + VehicleEntry const* _vehicleInfo; ///< DBC data for vehicle GuidSet vehiclePlayers; - uint32 _creatureEntry; ///< Can be different than the entry of _me in case of players - Status _status; ///< Internal variable for sanity checks + uint32 _creatureEntry; ///< Can be different than the entry of _me in case of players + Status _status; ///< Internal variable for sanity checks Position m_lastShootPos; std::deque _pendingJoinEvents; ///< Collection of delayed join events for prospective passengers void CancelJoinEvent(VehicleJoinEvent* e); @@ -117,4 +119,5 @@ class VehicleJoinEvent : public BasicEvent Unit* Passenger; SeatMap::iterator Seat; }; + #endif -- cgit v1.2.3 From 729a37363b7613b95fa2c629adfa68c0b7dc3835 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 22 Feb 2013 18:01:57 +0100 Subject: Core/Vehicles: Corrected logging message format specifiers --- src/server/game/Entities/Vehicle/Vehicle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 05a86653c55..10d534f4568 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -422,12 +422,12 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) /// @Prevent adding passengers when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.) if (_status == STATUS_UNINSTALLING) { - sLog->outError(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, attempting to board vehicle GuidLow: %u, Entry: %u during uninstall! SeatId: %i", + sLog->outError(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, attempting to board vehicle GuidLow: %u, Entry: %u during uninstall! SeatId: %d", unit->GetGUIDLow(), unit->GetEntry(), _me->GetGUIDLow(), _me->GetEntry(), (int32)seatId); return false; } - sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s scheduling enter vehicle (entry: %u, vehicleId: %u, guid: %u (dbguid: %s) on seat %d", + sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s scheduling enter vehicle (entry: %u, vehicleId: %u, guid: %u (dbguid: %u) on seat %d", unit->GetName().c_str(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (_me->GetTypeId() == TYPEID_UNIT ? _me->ToCreature()->GetDBTableGUIDLow() : 0), (int32)seatId); -- cgit v1.2.3