diff options
author | Meji <alvaro.megias@outlook.com> | 2025-05-11 22:00:41 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-26 20:49:45 +0200 |
commit | 20a31ea9d8d594466f3af2e4d469de7558bf60fa (patch) | |
tree | 1fa2da4c10fe7b7d0b4dea5dce04fdcdf87f6e74 | |
parent | c093df0f9cc62c3be2f7d638d3eeb671601e0568 (diff) |
Core/Vehicles: Added field to set a default pitch (#30878)
(cherry picked from commit 47440e9dd2f5cad5d274e61a1ce8e559b80d0496)
# Conflicts:
# sql/old/4.4.x/world/25021_2025_05_11/2025_05_11_03_world.sql
5 files changed, 42 insertions, 4 deletions
diff --git a/sql/updates/world/cata_classic/2025_05_17_00_world_2025_05_11_03_world.sql b/sql/updates/world/cata_classic/2025_05_17_00_world_2025_05_11_03_world.sql new file mode 100644 index 00000000000..bf47fa39fbf --- /dev/null +++ b/sql/updates/world/cata_classic/2025_05_17_00_world_2025_05_11_03_world.sql @@ -0,0 +1,2 @@ +ALTER TABLE `vehicle_template` + ADD `Pitch` FLOAT DEFAULT NULL AFTER `despawnDelayMs`; 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<float> Pitch; }; typedef std::vector<VehicleAccessory> VehicleAccessoryList; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 0e0535f0aab..a48d30e6e17 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3266,8 +3266,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) { @@ -3281,15 +3281,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)); |