aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/ObjectMgr.cpp56
-rw-r--r--src/game/ObjectMgr.h13
-rw-r--r--src/game/Vehicle.cpp23
-rw-r--r--src/game/Vehicle.h11
-rw-r--r--src/game/World.cpp3
5 files changed, 96 insertions, 10 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 2ba3942ed4a..c6cccc7f45e 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -46,6 +46,7 @@
#include "WaypointManager.h"
#include "InstanceData.h" //for condition_instance_data
#include "GossipDef.h"
+#include "Vehicle.h"
INSTANTIATE_SINGLETON_1(ObjectMgr);
@@ -2362,6 +2363,61 @@ void ObjectMgr::LoadItemPrototypes()
sLog.outErrorDb("Item (Entry: %u) not exist in `item_template` but referenced in `CharStartOutfit.dnc`", *itr);
}
+void ObjectMgr::LoadVehicleAccessories()
+{
+ m_VehicleAccessoryMap.clear(); // needed for reload case
+ VehicleAccessoryList mVehicleList;
+
+ uint32 count = 0;
+
+ QueryResult_AutoPtr result = WorldDatabase.Query("SELECT `entry`,`accessory_entry`,`seat_id`,`minion` FROM `vehicle_accessory`");
+
+ if (!result)
+ {
+ barGoLink bar(1);
+
+ bar.step();
+
+ sLog.outString();
+ sLog.outErrorDb(">> Loaded 0 LoadVehicleAccessor. DB table `vehicle_accessory` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+
+ do
+ {
+ Field *fields = result->Fetch();
+ bar.step();
+
+ uint32 uiEntry = fields[0].GetUInt32();
+ uint32 uiAccessory = fields[1].GetUInt32();
+ int8 uiSeat = int8(fields[2].GetInt16());
+ bool bMinion = fields[3].GetBool();
+
+ if (!sCreatureStorage.LookupEntry<CreatureInfo>(uiEntry))
+ {
+ sLog.outErrorDb("Table `vehicle_accessory`: creature template entry %u does not exist.", uiEntry);
+ continue;
+ }
+
+ if (!sCreatureStorage.LookupEntry<CreatureInfo>(uiAccessory))
+ {
+ sLog.outErrorDb("Table `vehicle_accessory`: Accessory %u does not exist.", uiAccessory);
+ continue;
+ }
+
+ mVehicleList = GetVehicleAccessoryList(uiEntry);
+ mVehicleList.push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion));
+ m_VehicleAccessoryMap[uiEntry] = mVehicleList;
+
+ ++count;
+ } while (result->NextRow());
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u Vehicle Accessories", count);
+}
+
void ObjectMgr::LoadItemRequiredTarget()
{
m_ItemRequiredTarget.clear(); // needed for reload case
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 3bb83e4a980..6193eaa2257 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -40,6 +40,7 @@
#include "ObjectDefines.h"
#include "Policies/Singleton.h"
#include "Database/SQLStorage.h"
+#include "Vehicle.h"
#include <string>
#include <map>
@@ -577,6 +578,15 @@ class ObjectMgr
return NULL;
}
+ VehicleAccessoryList GetVehicleAccessoryList(uint32 uiEntry)
+ {
+ VehicleAccessoryList mVehList;
+ VehicleAccessoryMap::const_iterator itr = m_VehicleAccessoryMap.find(uiEntry);
+ if (itr != m_VehicleAccessoryMap.end())
+ mVehList = itr->second;
+ return mVehList;
+ }
+
void LoadGuilds();
void LoadArenaTeams();
void LoadGroups();
@@ -639,6 +649,7 @@ class ObjectMgr
void LoadPointOfInterestLocales();
void LoadInstanceTemplate();
void LoadMailLevelRewards();
+ void LoadVehicleAccessories();
void LoadGossipText();
@@ -1047,6 +1058,8 @@ class ObjectMgr
ItemRequiredTargetMap m_ItemRequiredTarget;
+ VehicleAccessoryMap m_VehicleAccessoryMap;
+
typedef std::vector<LocaleConstant> LocalForIndex;
LocalForIndex m_LocalForIndex;
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index 0773a3dda37..07c0f32a6e8 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -91,7 +91,11 @@ void Vehicle::Install()
void Vehicle::InstallAllAccessories()
{
- switch(me->GetEntry())
+ VehicleAccessoryList mVehicleList = objmgr.GetVehicleAccessoryList(me->GetEntry());
+ if (mVehicleList.size())
+ for (VehicleAccessoryList::iterator itr2 = mVehicleList.begin(); itr2 < mVehicleList.end(); ++itr2)
+ InstallAccessory(itr2->uiAccessory, itr2->uiSeat, itr2->bMinion);
+ /*switch(me->GetEntry())
{
//case 27850:InstallAccessory(27905,1);break;
case 28782:InstallAccessory(28768,0,false);break; // Acherus Deathcharger
@@ -136,7 +140,7 @@ void Vehicle::InstallAllAccessories()
case 33418:InstallAccessory(35326,0);break; //Silvermoon Hawkstrider
case 33299:InstallAccessory(35323,0);break; //Darkspear Raptor
case 35491:InstallAccessory(35451,0,false);break; //Black Knight
- }
+ }*/
}
void Vehicle::Uninstall()
@@ -162,17 +166,16 @@ void Vehicle::Die()
void Vehicle::Reset()
{
sLog.outDebug("Vehicle::Reset");
- if(m_usableSeatNum)
+ if (me->GetTypeId() == TYPEID_PLAYER)
{
- if (me->GetTypeId() == TYPEID_PLAYER)
- {
+ if (m_usableSeatNum)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE);
- }
- else
- {
- InstallAllAccessories();
+ }
+ else
+ {
+ InstallAllAccessories();
+ if (m_usableSeatNum)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- }
}
}
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
index c8b12f9f6cb..1770a60798d 100644
--- a/src/game/Vehicle.h
+++ b/src/game/Vehicle.h
@@ -38,6 +38,17 @@ struct VehicleSeat
Unit* passenger;
};
+struct VehicleAccessory
+{
+ explicit VehicleAccessory(uint32 _uiAccessory, int8 _uiSeat, bool _bMinion) : uiAccessory(_uiAccessory), uiSeat(_uiSeat), bMinion(_bMinion) {}
+ uint32 uiAccessory;
+ int8 uiSeat;
+ uint32 bMinion;
+};
+
+typedef std::vector<VehicleAccessory> VehicleAccessoryList;
+typedef std::map<uint32, VehicleAccessoryList> VehicleAccessoryMap;
+
typedef std::map<int8, VehicleSeat> SeatMap;
class Vehicle
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 689f35f4177..b936162b367 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1393,6 +1393,9 @@ void World::SetInitialWorldSettings()
sLog.outString("Loading Creature Template Addon Data...");
objmgr.LoadCreatureAddons(); // must be after LoadCreatureTemplates() and LoadCreatures()
+ sLog.outString("Loading Vehicle Accessories...");
+ objmgr.LoadVehicleAccessories(); // must be after LoadCreatureTemplates()
+
sLog.outString("Loading Creature Respawn Data..."); // must be after PackInstances()
objmgr.LoadCreatureRespawnTimes();