aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2024-05-03 15:58:05 +0200
committerGitHub <noreply@github.com>2024-05-03 15:58:05 +0200
commit2238844f567b63de1edd394b654b62ac4ddeb666 (patch)
tree88e5ccf8744fe8964a86047864d03c48e74717e9 /src
parent24bda9c73dcd89d4da4e871e00fd83a24b8275d2 (diff)
Core/Creatures: Allow profession tools to be used as equipment (#29915)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp27
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h14
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp10
3 files changed, 42 insertions, 9 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index fed55249eba..c9e1cb072fe 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -2054,6 +2054,33 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
}
+
+ auto isValidEquipmentSlot = [&](uint32 itemEntry, uint8 slot)
+ {
+ ItemEntry const* dbcItem = sItemStore.LookupEntry(itemEntry);
+ if (!dbcItem)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_EQUIP uses unknown item {} (slot {}) for creature {}, skipped.", itemEntry, slot, e.entryOrGuid);
+ return false;
+ }
+
+ if (std::ranges::none_of(InventoryTypesEquipable, [dbcItem](InventoryType inventoryType) { return inventoryType == dbcItem->InventoryType; }))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_EQUIP uses item {} (slot {}) not equipable in a hand for creature {}, skipped.", itemEntry, slot, e.entryOrGuid);
+ return false;
+ }
+
+ return true;
+ };
+
+ if (e.action.equip.slot1 && !isValidEquipmentSlot(e.action.equip.slot1, 0))
+ return false;
+
+ if (e.action.equip.slot2 && !isValidEquipmentSlot(e.action.equip.slot2, 1))
+ return false;
+
+ if (e.action.equip.slot3 && !isValidEquipmentSlot(e.action.equip.slot3, 2))
+ return false;
}
break;
}
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 1c8cf91c5fc..c4212348c4e 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -415,6 +415,20 @@ enum InventoryType : uint8
#define MAX_INVTYPE 35
+constexpr std::array<InventoryType, 10> InventoryTypesEquipable =
+{
+ INVTYPE_WEAPON,
+ INVTYPE_SHIELD,
+ INVTYPE_RANGED,
+ INVTYPE_2HWEAPON,
+ INVTYPE_WEAPONMAINHAND,
+ INVTYPE_WEAPONOFFHAND,
+ INVTYPE_HOLDABLE,
+ INVTYPE_THROWN,
+ INVTYPE_RANGEDRIGHT,
+ INVTYPE_PROFESSION_TOOL
+};
+
enum ItemClass : uint8
{
ITEM_CLASS_CONSUMABLE = 0,
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 10cb845f24d..d3f17f0acf4 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1526,15 +1526,7 @@ void ObjectMgr::LoadEquipmentTemplates()
continue;
}
- if (dbcItem->InventoryType != INVTYPE_WEAPON &&
- dbcItem->InventoryType != INVTYPE_SHIELD &&
- dbcItem->InventoryType != INVTYPE_RANGED &&
- dbcItem->InventoryType != INVTYPE_2HWEAPON &&
- dbcItem->InventoryType != INVTYPE_WEAPONMAINHAND &&
- dbcItem->InventoryType != INVTYPE_WEAPONOFFHAND &&
- dbcItem->InventoryType != INVTYPE_HOLDABLE &&
- dbcItem->InventoryType != INVTYPE_THROWN &&
- dbcItem->InventoryType != INVTYPE_RANGEDRIGHT)
+ if (std::ranges::none_of(InventoryTypesEquipable, [dbcItem](InventoryType inventoryType) { return inventoryType == dbcItem->InventoryType; }))
{
TC_LOG_ERROR("sql.sql", "Item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {} is not equipable in a hand, forced to 0.",
equipmentInfo.Items[i].ItemId, i + 1, entry, id);