diff options
-rw-r--r-- | sql/updates/world/master/2017_02_19_03_world.sql | 7 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 20 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 9 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 43 |
6 files changed, 58 insertions, 34 deletions
diff --git a/sql/updates/world/master/2017_02_19_03_world.sql b/sql/updates/world/master/2017_02_19_03_world.sql new file mode 100644 index 00000000000..123c42a0599 --- /dev/null +++ b/sql/updates/world/master/2017_02_19_03_world.sql @@ -0,0 +1,7 @@ +ALTER TABLE `creature_equip_template` + ADD `AppearanceModID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID1`, + ADD `ItemVisual1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID1`, + ADD `AppearanceModID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID2`, + ADD `ItemVisual2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID2`, + ADD `AppearanceModID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID3`, + ADD `ItemVisual3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID3`; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 465cc4b5c84..16506842570 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1603,7 +1603,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (Creature* npc = (*itr)->ToCreature()) { - uint32 slot[3]; + EquipmentItem slot[3]; int8 equipId = (int8)e.action.equip.entry; if (equipId) { @@ -1615,22 +1615,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } npc->SetCurrentEquipmentId(equipId); - slot[0] = einfo->ItemEntry[0]; - slot[1] = einfo->ItemEntry[1]; - slot[2] = einfo->ItemEntry[2]; + slot[0] = einfo->Items[0]; + slot[1] = einfo->Items[1]; + slot[2] = einfo->Items[2]; } else { - slot[0] = e.action.equip.slot1; - slot[1] = e.action.equip.slot2; - slot[2] = e.action.equip.slot3; + slot[0].ItemId = e.action.equip.slot1; + slot[1].ItemId = e.action.equip.slot2; + slot[2].ItemId = e.action.equip.slot3; } if (!e.action.equip.mask || (e.action.equip.mask & 1)) - npc->SetVirtualItem(0, slot[0]); + npc->SetVirtualItem(0, slot[0].ItemId, slot[0].AppearanceModId, slot[0].ItemVisual); if (!e.action.equip.mask || (e.action.equip.mask & 2)) - npc->SetVirtualItem(1, slot[1]); + npc->SetVirtualItem(1, slot[1].ItemId, slot[1].AppearanceModId, slot[1].ItemVisual); if (!e.action.equip.mask || (e.action.equip.mask & 4)) - npc->SetVirtualItem(2, slot[2]); + npc->SetVirtualItem(2, slot[2].ItemId, slot[2].AppearanceModId, slot[2].ItemVisual); } } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index a4ed92e6dcf..62954a4bcbe 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1146,15 +1146,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) if (e.GetScriptType() == SMART_SCRIPT_TYPE_CREATURE) { int8 equipId = (int8)e.action.equip.entry; - - if (equipId) + if (equipId && !sObjectMgr->GetEquipmentInfo(e.entryOrGuid, equipId)) { - EquipmentInfo const* einfo = sObjectMgr->GetEquipmentInfo(e.entryOrGuid, equipId); - if (!einfo) - { - TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info id %u for creature " SI64FMTD ", skipped.", equipId, e.entryOrGuid); - return false; - } + TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info id %u for creature " SI64FMTD ", skipped.", equipId, e.entryOrGuid); + return false; } } break; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ac3dfae7fbf..d19cc9602d4 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1461,7 +1461,7 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) m_equipmentId = id; for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i) - SetVirtualItem(i, einfo->ItemEntry[i]); + SetVirtualItem(i, einfo->Items[i].ItemId, einfo->Items[i].AppearanceModId, einfo->Items[i].ItemVisual); } void Creature::SetSpawnHealth() diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 1d5293d2a4c..58250d043fd 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -499,9 +499,16 @@ struct PointOfInterestLocale StringVector Name; }; +struct EquipmentItem +{ + uint32 ItemId = 0; + uint16 AppearanceModId = 0; + uint16 ItemVisual = 0; +}; + struct EquipmentInfo { - uint32 ItemEntry[MAX_EQUIPMENT_ITEMS]; + EquipmentItem Items[MAX_EQUIPMENT_ITEMS]; }; // Benchmarked: Faster than std::map (insert/find) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 07630a55c8d..c07f6bd83bf 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1288,8 +1288,13 @@ void ObjectMgr::LoadEquipmentTemplates() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 - QueryResult result = WorldDatabase.Query("SELECT CreatureID, ID, ItemID1, ItemID2, ItemID3 FROM creature_equip_template"); + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT CreatureID, ID, ItemID1, AppearanceModID1, ItemVisual1, " + // 5 6 7 + "ItemID2, AppearanceModID2, ItemVisual2, " + // 8 9 10 + "ItemID3, AppearanceModID3, ItemVisual3 " + "FROM creature_equip_template"); if (!result) { @@ -1318,23 +1323,33 @@ void ObjectMgr::LoadEquipmentTemplates() } EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry][id]; - - 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) { - if (!equipmentInfo.ItemEntry[i]) - continue; + equipmentInfo.Items[i].ItemId = fields[2 + i * 3].GetUInt32(); + equipmentInfo.Items[i].AppearanceModId = fields[3 + i * 3].GetUInt16(); + equipmentInfo.Items[i].ItemVisual = fields[4 + i * 3].GetUInt16(); - ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]); + if (!equipmentInfo.Items[i].ItemId) + continue; + ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.Items[i].ItemId); if (!dbcItem) { TC_LOG_ERROR("sql.sql", "Unknown item (ID=%u) in creature_equip_template.ItemID%u for CreatureID = %u and ID=%u, forced to 0.", - equipmentInfo.ItemEntry[i], i+1, entry, id); - equipmentInfo.ItemEntry[i] = 0; + equipmentInfo.Items[i].ItemId, i + 1, entry, id); + equipmentInfo.Items[i].ItemId = 0; + continue; + } + + if (!sDB2Manager.GetItemModifiedAppearance(equipmentInfo.Items[i].ItemId, equipmentInfo.Items[i].AppearanceModId)) + { + TC_LOG_ERROR("sql.sql", "Unknown item appearance for (ID=%u, AppearanceModID=%u) pair in creature_equip_template.ItemID%u creature_equip_template.AppearanceModID%u " + "for CreatureID = %u and ID=%u, forced to default.", + equipmentInfo.Items[i].ItemId, equipmentInfo.Items[i].AppearanceModId, i + 1, i + 1, entry, id); + if (ItemModifiedAppearanceEntry const* defaultAppearance = sDB2Manager.GetDefaultItemModifiedAppearance(equipmentInfo.Items[i].ItemId)) + equipmentInfo.Items[i].AppearanceModId = defaultAppearance->AppearanceModID; + else + equipmentInfo.Items[i].AppearanceModId = 0; continue; } @@ -1349,8 +1364,8 @@ void ObjectMgr::LoadEquipmentTemplates() dbcItem->InventoryType != INVTYPE_RANGEDRIGHT) { TC_LOG_ERROR("sql.sql", "Item (ID=%u) in creature_equip_template.ItemID%u for CreatureID = %u and ID = %u is not equipable in a hand, forced to 0.", - equipmentInfo.ItemEntry[i], i+1, entry, id); - equipmentInfo.ItemEntry[i] = 0; + equipmentInfo.Items[i].ItemId, i + 1, entry, id); + equipmentInfo.Items[i].ItemId = 0; } } |