From df4018b10de5340c8f3814e01d204670370a67b4 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 28 Jan 2020 13:27:52 +0100 Subject: [PATCH] Core/Vehicles: use pointers instead of tempoary copies --- src/server/game/Entities/Unit/Unit.cpp | 13 ++++++---- src/server/game/Entities/Vehicle/Vehicle.cpp | 25 +++++++++++++------ src/server/game/Entities/Vehicle/Vehicle.h | 2 +- .../game/Entities/Vehicle/VehicleDefines.h | 10 ++++---- src/server/game/Globals/ObjectMgr.h | 6 ++--- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index df0efee9cc..8b1a81cda7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13465,7 +13465,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) return; // This should be done before dismiss, because there may be some aura removal - VehicleSeatAddon const seatAddon = m_vehicle->GetSeatAddonForSeatOfPassenger(this); + VehicleSeatAddon const* seatAddon = m_vehicle->GetSeatAddonForSeatOfPassenger(this); Vehicle* vehicle = m_vehicle->RemovePassenger(this); Player* player = ToPlayer(); @@ -13491,10 +13491,13 @@ void Unit::_ExitVehicle(Position const* exitPosition) pos.SetOrientation(GetOrientation()); // Change exit position based on seat entry - if (seatAddon.ExitParameter == VehicleExitParameters::VehicleExitParamOffset) - pos.RelocateOffset({ seatAddon.ExitParameterX, seatAddon.ExitParameterY, seatAddon.ExitParameterZ, seatAddon.ExitParameterO }); - else if (seatAddon.ExitParameter == VehicleExitParameters::VehicleExitParamDest) - pos.Relocate({ seatAddon.ExitParameterX, seatAddon.ExitParameterY, seatAddon.ExitParameterZ, seatAddon.ExitParameterO }); + if (seatAddon) + { + if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamOffset) + pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO }); + else if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamDest) + pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO }); + } } float height = pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight(); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 33daaebbb4..f59089d3fa 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -41,7 +41,7 @@ UsableSeatNum(0), _me(unit), _vehicleInfo(vehInfo), _creatureEntry(creatureEntry if (uint32 seatId = _vehicleInfo->SeatID[i]) if (VehicleSeatEntry const* veSeat = sVehicleSeatStore.LookupEntry(seatId)) { - VehicleSeatAddon addon = sObjectMgr->GetVehicleSeatAddon(seatId); + VehicleSeatAddon const* addon = sObjectMgr->GetVehicleSeatAddon(seatId); Seats.insert(std::make_pair(i, VehicleSeat(veSeat, addon))); if (veSeat->CanEnterOrExit()) ++UsableSeatNum; @@ -396,15 +396,26 @@ SeatMap::const_iterator Vehicle::GetNextEmptySeat(int8 seatId, bool next) const return seat; } -VehicleSeatAddon const Vehicle::GetSeatAddonForSeatOfPassenger(Unit const* passenger) const +/** + * @fn VehicleSeatAddon const Vehicle::GetSeatAddonForSeatOfPassenger(Unit const* passenger) const + * + * @brief Gets the vehicle seat addon data for the seat of a passenger + * + * @author Ovahlord + * @date 28-1-2020 + * + * @param passenger Identifier for the current seat user + * + * @return The seat addon data for the currently used seat of a passenger + */ + +VehicleSeatAddon const* Vehicle::GetSeatAddonForSeatOfPassenger(Unit const* passenger) const { for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); itr++) - { if (!itr->second.IsEmpty() && itr->second.Passenger.Guid == passenger->GetGUID()) return itr->second.SeatAddon; - } - return VehicleSeatAddon(); + return nullptr; } /** @@ -873,7 +884,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) Passenger->RemoveAurasByType(SPELL_AURA_MOUNTED); VehicleSeatEntry const* veSeat = Seat->second.SeatInfo; - VehicleSeatAddon const veSeatAddon = Seat->second.SeatAddon; + VehicleSeatAddon const* veSeatAddon = Seat->second.SeatAddon; Player* player = Passenger->ToPlayer(); if (player) @@ -895,7 +906,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)) Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - float o = veSeatAddon.SeatOrientationOffset; + float o = veSeatAddon ? veSeatAddon->SeatOrientationOffset : 0.f; float x = veSeat->AttachmentOffset.X; float y = veSeat->AttachmentOffset.Y; float z = veSeat->AttachmentOffset.Z; diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 6c815067bc..ff766655a6 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -52,7 +52,7 @@ class TC_GAME_API Vehicle : public TransportBase bool HasEmptySeat(int8 seatId) const; Unit* GetPassenger(int8 seatId) const; SeatMap::const_iterator GetNextEmptySeat(int8 seatId, bool next) const; - VehicleSeatAddon const GetSeatAddonForSeatOfPassenger(Unit const* passenger) const; + VehicleSeatAddon const* GetSeatAddonForSeatOfPassenger(Unit const* passenger) const; uint8 GetAvailableSeatCount() const; bool AddPassenger(Unit* passenger, int8 seatId = -1); diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index 13e56c940b..c087a9cbe8 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -77,9 +77,9 @@ enum VehicleSpells enum class VehicleExitParameters { - VehicleExitParamNone, // provided parameters will be ignored - VehicleExitParamOffset, // provided parameters will be used as offset values - VehicleExitParamDest, // provided parameters will be used as absolute destination + VehicleExitParamNone = 0, // provided parameters will be ignored + VehicleExitParamOffset = 1, // provided parameters will be used as offset values + VehicleExitParamDest = 2, // provided parameters will be used as absolute destination VehicleExitParamMax }; @@ -114,7 +114,7 @@ struct VehicleSeatAddon struct VehicleSeat { - explicit VehicleSeat(VehicleSeatEntry const* seatInfo, VehicleSeatAddon const seatAddon) : SeatInfo(seatInfo), SeatAddon(seatAddon) + explicit VehicleSeat(VehicleSeatEntry const* seatInfo, VehicleSeatAddon const* seatAddon) : SeatInfo(seatInfo), SeatAddon(seatAddon) { Passenger.Reset(); } @@ -122,7 +122,7 @@ struct VehicleSeat bool IsEmpty() const { return Passenger.Guid.IsEmpty(); } VehicleSeatEntry const* SeatInfo; - VehicleSeatAddon const SeatAddon; + VehicleSeatAddon const* SeatAddon; PassengerInfo Passenger; }; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 0fb22c061c..d631657733 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1557,13 +1557,13 @@ class TC_GAME_API ObjectMgr uint32 GetGameObjectTypeByEntry(uint32 entry) const; - VehicleSeatAddon const GetVehicleSeatAddon(uint32 seatId) const + VehicleSeatAddon const* GetVehicleSeatAddon(uint32 seatId) const { VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId); if (itr == _vehicleSeatAddonStore.end()) - return VehicleSeatAddon(); + return nullptr; - return itr->second; + return &itr->second; } private: