aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2017_02_19_03_world.sql7
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp20
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp11
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.h9
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp43
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;
}
}