aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp2
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.h1
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp60
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h17
-rwxr-xr-xsrc/server/game/World/World.cpp7
5 files changed, 79 insertions, 8 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index daad66cb0e0..bab5e8a30c8 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -124,7 +124,7 @@ void Vehicle::InstallAllAccessories()
{
RemoveAllPassengers(); // We might have aura's saved in the DB with now invalid casters - remove
- VehicleAccessoryList const* mVehicleList = sObjectMgr->GetVehicleAccessoryList(m_creatureEntry);
+ VehicleAccessoryList const* mVehicleList = sObjectMgr->GetVehicleAccessoryList(this);
if (!mVehicleList)
return;
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index b832a6077c0..9b7b0f7d9d1 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -124,6 +124,7 @@ class Vehicle
Unit *GetBase() const { return me; }
VehicleEntry const *GetVehicleInfo() const { return m_vehicleInfo; }
+ uint32 const& GetCreatureEntry() const { return m_creatureEntry; }
bool HasEmptySeat(int8 seatId) const;
Unit *GetPassenger(int8 seatId) const;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 48cca2df14b..f6a17695f1d 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -2741,6 +2741,62 @@ void ObjectMgr::LoadItemSetNames()
sLog->outString();
}
+void ObjectMgr::LoadVehicleTemplateAccessories()
+{
+ uint32 oldMSTime = getMSTime();
+
+ m_VehicleTemplateAccessoryMap.clear(); // needed for reload case
+
+ uint32 count = 0;
+
+ QueryResult result = WorldDatabase.Query("SELECT `entry`,`accessory_entry`,`seat_id`,`minion`,`summontype`,`summontimer` FROM `vehicle_template_accessory`");
+
+ if (!result)
+ {
+ sLog->outErrorDb(">> Loaded 0 vehicle template accessories. DB table `vehicle_template_accessory` is empty.");
+ sLog->outString();
+ return;
+ }
+
+ do
+ {
+ Field *fields = result->Fetch();
+
+ uint32 uiEntry = fields[0].GetUInt32();
+ uint32 uiAccessory = fields[1].GetUInt32();
+ int8 uiSeat = int8(fields[2].GetInt16());
+ bool bMinion = fields[3].GetBool();
+ uint8 uiSummonType = fields[4].GetUInt8();
+ uint32 uiSummonTimer= fields[5].GetUInt32();
+
+ if (!sCreatureStorage.LookupEntry<CreatureInfo>(uiEntry))
+ {
+ sLog->outErrorDb("Table `vehicle_template_accessory`: creature template entry %u does not exist.", uiEntry);
+ continue;
+ }
+
+ if (!sCreatureStorage.LookupEntry<CreatureInfo>(uiAccessory))
+ {
+ sLog->outErrorDb("Table `vehicle_template_accessory`: Accessory %u does not exist.", uiAccessory);
+ continue;
+ }
+
+ if (mSpellClickInfoMap.find(uiEntry) == mSpellClickInfoMap.end())
+ {
+ sLog->outErrorDb("Table `vehicle_template_accessory`: creature template entry %u has no data in npc_spellclick_spells", uiEntry);
+ continue;
+ }
+
+ m_VehicleTemplateAccessoryMap[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
+
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outString(">> Loaded %u Vehicle Accessories in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+}
+
void ObjectMgr::LoadVehicleAccessories()
{
uint32 oldMSTime = getMSTime();
@@ -2749,11 +2805,11 @@ void ObjectMgr::LoadVehicleAccessories()
uint32 count = 0;
- QueryResult result = WorldDatabase.Query("SELECT `entry`,`accessory_entry`,`seat_id`,`minion`,`summontype`,`summontimer` FROM `vehicle_accessory`");
+ QueryResult result = WorldDatabase.Query("SELECT `guid`,`accessory_entry`,`seat_id`,`minion`,`summontype`,`summontimer` FROM `vehicle_accessory`");
if (!result)
{
- sLog->outErrorDb(">> Loaded 0 LoadVehicleAccessor. DB table `vehicle_accessory` is empty.");
+ sLog->outErrorDb(">> Loaded 0 vehicle accessories. DB table `vehicle_accessory` is empty.");
sLog->outString();
return;
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index a593d369799..66ecd4f13ec 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -807,10 +807,19 @@ class ObjectMgr
return NULL;
}
- VehicleAccessoryList const* GetVehicleAccessoryList(uint32 uiEntry) const
+ VehicleAccessoryList const* GetVehicleAccessoryList(Vehicle* veh) const
{
- VehicleAccessoryMap::const_iterator itr = m_VehicleAccessoryMap.find(uiEntry);
- if (itr != m_VehicleAccessoryMap.end())
+ if (veh->GetBase()->ToCreature())
+ {
+ // Give preference to GUID-based accessories
+ VehicleAccessoryMap::const_iterator itr = m_VehicleAccessoryMap.find(veh->GetBase()->GetGUIDLow());
+ if (itr != m_VehicleAccessoryMap.end())
+ return &itr->second;
+ }
+
+ // Otherwise return entry-based
+ VehicleAccessoryMap::const_iterator itr = m_VehicleTemplateAccessoryMap.find(veh->GetCreatureEntry());
+ if (itr != m_VehicleTemplateAccessoryMap.end())
return &itr->second;
return NULL;
}
@@ -921,6 +930,7 @@ class ObjectMgr
void LoadInstanceTemplate();
void LoadInstanceEncounters();
void LoadMailLevelRewards();
+ void LoadVehicleTemplateAccessories();
void LoadVehicleAccessories();
void LoadVehicleScaling();
@@ -1325,6 +1335,7 @@ class ObjectMgr
ItemRequiredTargetMap m_ItemRequiredTarget;
+ VehicleAccessoryMap m_VehicleTemplateAccessoryMap;
VehicleAccessoryMap m_VehicleAccessoryMap;
VehicleScalingMap m_VehicleScalingMap;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 94bc4b4dc54..10a816096e6 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1399,11 +1399,14 @@ void World::SetInitialWorldSettings()
sLog->outString("Loading Game Event Data..."); // must be after loading pools fully
sGameEventMgr->LoadFromDB(); // TODOLEAK: add scopes
- sLog->outString("Loading UNIT_NPC_FLAG_SPELLCLICK Data...");
+ sLog->outString("Loading UNIT_NPC_FLAG_SPELLCLICK Data..."); // must be after LoadQuests
sObjectMgr->LoadNPCSpellClickSpells();
+ sLog->outString("Loading Vehicle Template Accessories...");
+ sObjectMgr->LoadVehicleTemplateAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
+
sLog->outString("Loading Vehicle Accessories...");
- sObjectMgr->LoadVehicleAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
+ sObjectMgr->LoadVehicleAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
sLog->outString("Loading Dungeon boss data...");
sObjectMgr->LoadInstanceEncounters();