aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp82
1 files changed, 49 insertions, 33 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 8597b6098a9..85022c9164c 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -427,8 +427,8 @@ void ObjectMgr::LoadCreatureTemplates()
"spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, "
// 71 72 73 74 75 76 77 78 79 80 81 82
"InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, "
- // 83 84 85 86 87 88 89
- " questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName "
+ // 83 84 85 86 87 88
+ " questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName "
"FROM creature_template;");
if (!result)
@@ -525,10 +525,9 @@ void ObjectMgr::LoadCreatureTemplates()
creatureTemplate.movementId = fields[82].GetUInt32();
creatureTemplate.RegenHealth = fields[83].GetBool();
- creatureTemplate.equipmentId = fields[84].GetUInt32();
- creatureTemplate.MechanicImmuneMask = fields[85].GetUInt32();
- creatureTemplate.flags_extra = fields[86].GetUInt32();
- creatureTemplate.ScriptID = GetScriptId(fields[87].GetCString());
+ creatureTemplate.MechanicImmuneMask = fields[84].GetUInt32();
+ creatureTemplate.flags_extra = fields[85].GetUInt32();
+ creatureTemplate.ScriptID = GetScriptId(fields[86].GetCString());
++count;
}
@@ -877,15 +876,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
const_cast<CreatureTemplate*>(cInfo)->MovementType = IDLE_MOTION_TYPE;
}
- if (cInfo->equipmentId > 0) // 0 no equipment
- {
- if (!GetEquipmentInfo(cInfo->equipmentId))
- {
- sLog->outError(LOG_FILTER_SQL, "Table `creature_template` lists creature (Entry: %u) with `equipment_id` %u not found in table `creature_equip_template`, set to no equipment.", cInfo->Entry, cInfo->equipmentId);
- const_cast<CreatureTemplate*>(cInfo)->equipmentId = 0;
- }
- }
-
/// if not set custom creature scale then load scale from CreatureDisplayInfo.dbc
if (cInfo->scale <= 0.0f)
{
@@ -1011,11 +1001,28 @@ CreatureAddon const* ObjectMgr::GetCreatureTemplateAddon(uint32 entry)
return NULL;
}
-EquipmentInfo const* ObjectMgr::GetEquipmentInfo(uint32 entry)
+EquipmentInfo const* ObjectMgr::GetEquipmentInfo(uint32 entry, int8& id)
{
EquipmentInfoContainer::const_iterator itr = _equipmentInfoStore.find(entry);
- if (itr != _equipmentInfoStore.end())
- return &(itr->second);
+ if (itr == _equipmentInfoStore.end())
+ return NULL;
+
+ if (itr->second.empty())
+ return NULL;
+
+ if (id == -1) // select a random element
+ {
+ EquipmentInfoContainerInternal::const_iterator ritr = itr->second.begin();
+ std::advance(ritr, urand(0u, itr->second.size()));
+ id = std::distance(itr->second.begin(), ritr) + 1;
+ return &ritr->second;
+ }
+ else
+ {
+ EquipmentInfoContainerInternal::const_iterator itr2 = itr->second.find(id);
+ if (itr2 != itr->second.end())
+ return &itr2->second;
+ }
return NULL;
}
@@ -1024,7 +1031,8 @@ void ObjectMgr::LoadEquipmentTemplates()
{
uint32 oldMSTime = getMSTime();
- QueryResult result = WorldDatabase.Query("SELECT entry, itemEntry1, itemEntry2, itemEntry3 FROM creature_equip_template");
+ // 0 1 2 3 4
+ QueryResult result = WorldDatabase.Query("SELECT entry, id, itemEntry1, itemEntry2, itemEntry3 FROM creature_equip_template");
if (!result)
{
@@ -1037,13 +1045,21 @@ void ObjectMgr::LoadEquipmentTemplates()
{
Field* fields = result->Fetch();
- uint16 entry = fields[0].GetUInt16();
+ uint32 entry = fields[0].GetUInt32();
+
+ if (!sObjectMgr->GetCreatureTemplate(entry))
+ {
+ sLog->outError(LOG_FILTER_SQL, "Creature template (Entry: %u) does not exist but has a record in `creature_equip_template`", entry);
+ continue;
+ }
+
+ uint8 id = fields[1].GetUInt8();
- EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry];
+ EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry][id];
- equipmentInfo.ItemEntry[0] = fields[1].GetUInt32();
- equipmentInfo.ItemEntry[1] = fields[2].GetUInt32();
- equipmentInfo.ItemEntry[2] = fields[3].GetUInt32();
+ equipmentInfo.ItemEntry[0] = fields[2].GetUInt32();
+ equipmentInfo.ItemEntry[1] = fields[3].GetUInt32();
+ equipmentInfo.ItemEntry[2] = fields[4].GetUInt32();
for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i)
{
@@ -1054,8 +1070,8 @@ void ObjectMgr::LoadEquipmentTemplates()
if (!dbcItem)
{
- sLog->outError(LOG_FILTER_SQL, "Unknown item (entry=%u) in creature_equip_template.itemEntry%u for entry = %u, forced to 0.",
- equipmentInfo.ItemEntry[i], i+1, entry);
+ sLog->outError(LOG_FILTER_SQL, "Unknown item (entry=%u) in creature_equip_template.itemEntry%u for entry = %u and id=%u, forced to 0.",
+ equipmentInfo.ItemEntry[i], i+1, entry, id);
equipmentInfo.ItemEntry[i] = 0;
continue;
}
@@ -1070,8 +1086,8 @@ void ObjectMgr::LoadEquipmentTemplates()
dbcItem->InventoryType != INVTYPE_THROWN &&
dbcItem->InventoryType != INVTYPE_RANGEDRIGHT)
{
- sLog->outError(LOG_FILTER_SQL, "Item (entry=%u) in creature_equip_template.itemEntry%u for entry = %u is not equipable in a hand, forced to 0.",
- equipmentInfo.ItemEntry[i], i+1, entry);
+ sLog->outError(LOG_FILTER_SQL, "Item (entry=%u) in creature_equip_template.itemEntry%u for entry = %u and id = %u is not equipable in a hand, forced to 0.",
+ equipmentInfo.ItemEntry[i], i+1, entry, id);
equipmentInfo.ItemEntry[i] = 0;
}
}
@@ -1518,13 +1534,13 @@ void ObjectMgr::LoadCreatures()
if (!ok)
continue;
- // -1 no equipment, 0 use default
- if (data.equipmentId > 0)
+ // -1 random, 0 no equipment, 1 is default (may or may not have equipment)
+ if (data.equipmentId != 0)
{
- if (!GetEquipmentInfo(data.equipmentId))
+ if (!GetEquipmentInfo(data.id, data.equipmentId) && data.equipmentId != 1)
{
sLog->outError(LOG_FILTER_SQL, "Table `creature` have creature (Entry: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", data.id, data.equipmentId);
- data.equipmentId = -1;
+ data.equipmentId = 1;
}
}
@@ -1698,7 +1714,7 @@ uint32 ObjectMgr::AddCreData(uint32 entry, uint32 /*team*/, uint32 mapId, float
data.id = entry;
data.mapid = mapId;
data.displayid = 0;
- data.equipmentId = cInfo->equipmentId;
+ data.equipmentId = 1;
data.posX = x;
data.posY = y;
data.posZ = z;