diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/VehicleDefines.h | 6 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 40 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 3 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 3 |
7 files changed, 63 insertions, 1 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a09f5bb6032..ea937c76e79 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12956,7 +12956,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) if (vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION) && vehicle->GetBase()->GetTypeId() == TYPEID_UNIT) if (((Minion*)vehicle->GetBase())->GetOwner() == this) - vehicle->GetBase()->ToCreature()->DespawnOrUnsummon(1); + vehicle->GetBase()->ToCreature()->DespawnOrUnsummon(vehicle->GetDespawnDelay()); if (HasUnitTypeMask(UNIT_MASK_ACCESSORY)) { diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 7e37b5212ae..1dec34be1f3 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -885,3 +885,11 @@ void VehicleJoinEvent::Abort(uint64) if (Passenger->IsInWorld() && Passenger->HasUnitTypeMask(UNIT_MASK_ACCESSORY)) Passenger->ToCreature()->DespawnOrUnsummon(); } + +Milliseconds Vehicle::GetDespawnDelay() +{ + if (VehicleTemplate const* vehicleTemplate = sObjectMgr->GetVehicleTemplate(this)) + return vehicleTemplate->DespawnDelay; + + return 1ms; +} diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 07f1715b5fe..081daf53250 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -71,6 +71,8 @@ class TC_GAME_API Vehicle : public TransportBase void RemovePendingEventsForPassenger(Unit* passenger); + Milliseconds GetDespawnDelay(); + protected: friend class VehicleJoinEvent; uint32 UsableSeatNum; ///< Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index 6ed5e0338fa..a428de24ff4 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -19,6 +19,7 @@ #define __TRINITY_VEHICLEDEFINES_H #include "Define.h" +#include "Duration.h" #include <vector> #include <map> @@ -113,6 +114,11 @@ struct VehicleAccessory uint8 SummonedType; }; +struct VehicleTemplate +{ + Milliseconds DespawnDelay = Milliseconds::zero(); +}; + typedef std::vector<VehicleAccessory> VehicleAccessoryList; typedef std::map<ObjectGuid::LowType, VehicleAccessoryList> VehicleAccessoryContainer; typedef std::map<uint32, VehicleAccessoryList> VehicleAccessoryTemplateContainer; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c5f4f51599a..5cfe337d362 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3252,6 +3252,41 @@ void ObjectMgr::LoadVehicleTemplateAccessories() TC_LOG_INFO("server.loading", ">> Loaded %u Vehicle Template Accessories in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +void ObjectMgr::LoadVehicleTemplate() +{ + uint32 oldMSTime = getMSTime(); + + _vehicleTemplateStore.clear(); + + // 0 1 + QueryResult result = WorldDatabase.Query("SELECT creatureId, despawnDelayMs FROM vehicle_template"); + + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 vehicle template. DB table `vehicle_template` is empty."); + return; + } + + do + { + Field* fields = result->Fetch(); + + uint32 creatureId = fields[0].GetUInt32(); + + if (!sObjectMgr->GetCreatureTemplate(creatureId)) + { + TC_LOG_ERROR("sql.sql", "Table `vehicle_template`: Vehicle %u does not exist.", creatureId); + continue; + } + + VehicleTemplate& vehicleTemplate = _vehicleTemplateStore[creatureId]; + vehicleTemplate.DespawnDelay = Milliseconds(fields[1].GetInt32()); + + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " Vehicle Template entries in %u ms", _vehicleTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime)); +} + void ObjectMgr::LoadVehicleAccessories() { uint32 oldMSTime = getMSTime(); @@ -9991,6 +10026,11 @@ CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const return nullptr; } +VehicleTemplate const* ObjectMgr::GetVehicleTemplate(Vehicle* veh) const +{ + return Trinity::Containers::MapGetValuePtr(_vehicleTemplateStore, veh->GetCreatureEntry()); +} + VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) const { if (Creature* cre = veh->GetBase()->ToCreature()) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 45756e922dd..de5037d1432 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1189,6 +1189,7 @@ class TC_GAME_API ObjectMgr return nullptr; } + VehicleTemplate const* GetVehicleTemplate(Vehicle* veh) const; VehicleAccessoryList const* GetVehicleAccessoryList(Vehicle* veh) const; DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) const; @@ -1292,6 +1293,7 @@ class TC_GAME_API ObjectMgr void LoadInstanceEncounters(); void LoadMailLevelRewards(); void LoadVehicleTemplateAccessories(); + void LoadVehicleTemplate(); void LoadVehicleAccessories(); void LoadNPCText(); @@ -1749,6 +1751,7 @@ class TC_GAME_API ObjectMgr SpellScriptsContainer _spellScriptsStore; + std::unordered_map<uint32, VehicleTemplate> _vehicleTemplateStore; VehicleAccessoryTemplateContainer _vehicleTemplateAccessoryStore; VehicleAccessoryContainer _vehicleAccessoryStore; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2f820271d60..020d6eb5627 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1940,6 +1940,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading UNIT_NPC_FLAG_SPELLCLICK Data..."); // must be after LoadQuests sObjectMgr->LoadNPCSpellClickSpells(); + TC_LOG_INFO("server.loading", "Loading Vehicle Templates..."); + sObjectMgr->LoadVehicleTemplate(); // must be after LoadCreatureTemplates() + TC_LOG_INFO("server.loading", "Loading Vehicle Template Accessories..."); sObjectMgr->LoadVehicleTemplateAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells() |
