Core/Vehicles: Rename vehicle_accessory to vehicle_template_accessory, and implement a new table named vehicle_accessory to allow accessory definitions based on GUID that will overwrite defeinitions based on entry.

Fixes #Nay
This commit is contained in:
Machiavelli
2011-03-06 23:45:22 +01:00
parent 4437cb9e3c
commit d6ddc6410c
6 changed files with 91 additions and 8 deletions
+1 -1
View File
@@ -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;
@@ -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;
+58 -2
View File
@@ -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;
}
+14 -3
View File
@@ -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;
+5 -2
View File
@@ -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();