From 47440e9dd2f5cad5d274e61a1ce8e559b80d0496 Mon Sep 17 00:00:00 2001 From: Meji Date: Sun, 11 May 2025 22:00:41 +0200 Subject: Core/Vehicles: Added field to set a default pitch (#30878) --- src/server/game/Entities/Vehicle/Vehicle.cpp | 11 ++++++++ src/server/game/Entities/Vehicle/Vehicle.h | 1 + src/server/game/Entities/Vehicle/VehicleDefines.h | 1 + src/server/game/Globals/ObjectMgr.cpp | 31 ++++++++++++++++++++--- 4 files changed, 40 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 25b4931d24a..6c435583b0e 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -632,6 +632,8 @@ void Vehicle::InitMovementInfoForBase() _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDPITCHING) _me->AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_PITCHING); + + _me->m_movementInfo.pitch = GetPitch(); } /** @@ -966,6 +968,15 @@ Milliseconds Vehicle::GetDespawnDelay() return 1ms; } +float Vehicle::GetPitch() +{ + if (VehicleTemplate const* vehicleTemplate = sObjectMgr->GetVehicleTemplate(this)) + if (vehicleTemplate->Pitch) + return *vehicleTemplate->Pitch; + + return std::clamp(0.0f, _vehicleInfo->PitchMin, _vehicleInfo->PitchMax); +} + std::string Vehicle::GetDebugInfo() const { std::stringstream sstr; diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index b46e6f47c13..5b68a429fe3 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -71,6 +71,7 @@ class TC_GAME_API Vehicle final : public TransportBase void RemovePendingEventsForPassenger(Unit* passenger); Milliseconds GetDespawnDelay(); + float GetPitch(); std::string GetDebugInfo() const; diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index 9155f23d1c9..764a039bbd0 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -144,6 +144,7 @@ struct VehicleAccessory struct VehicleTemplate { Milliseconds DespawnDelay = Milliseconds::zero(); + Optional Pitch; }; typedef std::vector VehicleAccessoryList; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index e3aca85d208..2ce15f2d166 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3528,8 +3528,8 @@ void ObjectMgr::LoadVehicleTemplate() _vehicleTemplateStore.clear(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT creatureId, despawnDelayMs FROM vehicle_template"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT creatureId, despawnDelayMs, Pitch FROM vehicle_template"); if (!result) { @@ -3543,15 +3543,38 @@ void ObjectMgr::LoadVehicleTemplate() uint32 creatureId = fields[0].GetUInt32(); - if (!GetCreatureTemplate(creatureId)) + CreatureTemplate const* creatureInfo = GetCreatureTemplate(creatureId); + if (!creatureInfo) + { + TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Creature (Entry: {}) does not exist.", creatureId); + continue; + } + + if (!creatureInfo->VehicleId) { - TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Vehicle {} does not exist.", creatureId); + TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Creature (Entry: {}) is not a vehicle.", creatureId); continue; } VehicleTemplate& vehicleTemplate = _vehicleTemplateStore[creatureId]; vehicleTemplate.DespawnDelay = Milliseconds(fields[1].GetInt32()); + if (!fields[2].IsNull()) + { + VehicleEntry const* vehicle = sVehicleStore.LookupEntry(creatureInfo->VehicleId); + if (!vehicle) + continue; + + float pitch = fields[2].GetFloat(); + if (pitch < vehicle->PitchMin || pitch > vehicle->PitchMax) + { + TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Creature (Entry: {}) has invalid Pitch ({}).`. Ignoring", + creatureId, pitch); + continue; + } + + vehicleTemplate.Pitch = pitch; + } } while (result->NextRow()); TC_LOG_INFO("server.loading", ">> Loaded {} Vehicle Template entries in {} ms", _vehicleTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime)); -- cgit v1.2.3