aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSevi <gonzo1247@yahoo.de>2020-12-28 16:27:44 +0100
committerjackpoz <giacomopoz@gmail.com>2021-01-03 22:10:55 +0100
commit6392d9ac481dd015133d6b69a6642437a503d94a (patch)
tree6cd12944a72343c1bf1e90955a16ab0474c8e3ee /src
parented975ef4c0e614addc069785f23c1b7f522f3b8e (diff)
Core/Vehicles: add a way to delay the Vehicle despawn Time if its needed.
* New database table `vehicle_template` holds info for despawn delay with option to extend it in the future (cherry picked from commit c7b10d3c5fd082faf6c2835239e340babc3dfc76) # Conflicts: # src/server/game/Entities/Unit/Unit.cpp # src/server/game/Entities/Vehicle/Vehicle.cpp # src/server/game/Globals/ObjectMgr.cpp # src/server/game/Globals/ObjectMgr.h
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp8
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h2
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h6
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp40
-rw-r--r--src/server/game/Globals/ObjectMgr.h3
-rw-r--r--src/server/game/World/World.cpp3
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 d3d4a40ff80..d4b57c61487 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -12719,7 +12719,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(1ms);
+ 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 287829d39bf..7857aa07723 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -952,3 +952,11 @@ bool Vehicle::HasPendingEventForSeat(int8 seatId) const
}
return false;
}
+
+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 29c28d8adce..26635e81c6f 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -72,6 +72,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 9fed8fdb131..621c482f5e6 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<uint32, VehicleAccessoryList> VehicleAccessoryContainer;
typedef std::map<int8, VehicleSeat> SeatMap;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index fdd51329b91..db4a45d5011 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3577,6 +3577,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();
@@ -10143,6 +10178,11 @@ QuestPOIWrapper const* ObjectMgr::GetQuestPOIWrapper(uint32 questId) const
return Trinity::Containers::MapGetValuePtr(_questPOIStore, questId);
}
+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 f4ceca2174a..d465272c5e9 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1121,6 +1121,7 @@ class TC_GAME_API ObjectMgr
QuestPOIWrapper const* GetQuestPOIWrapper(uint32 questId) const;
+ VehicleTemplate const* GetVehicleTemplate(Vehicle* veh) const;
VehicleAccessoryList const* GetVehicleAccessoryList(Vehicle* veh) const;
DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) const;
@@ -1197,6 +1198,7 @@ class TC_GAME_API ObjectMgr
void LoadInstanceEncounters();
void LoadMailLevelRewards();
void LoadVehicleTemplateAccessories();
+ void LoadVehicleTemplate();
void LoadVehicleAccessories();
void LoadVehicleSeatAddon();
@@ -1644,6 +1646,7 @@ class TC_GAME_API ObjectMgr
SpellScriptsContainer _spellScriptsStore;
+ std::unordered_map<uint32, VehicleTemplate> _vehicleTemplateStore;
VehicleAccessoryContainer _vehicleTemplateAccessoryStore;
VehicleAccessoryContainer _vehicleAccessoryStore;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index cec4d760ae9..d509e308093 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1864,6 +1864,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()