/* * This file is part of the CMaNGOS Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _ITEMPROTOTYPE_H #define _ITEMPROTOTYPE_H #include "Common.h" enum ItemModType { ITEM_MOD_MANA = 0, ITEM_MOD_HEALTH = 1, ITEM_MOD_AGILITY = 3, ITEM_MOD_STRENGTH = 4, ITEM_MOD_INTELLECT = 5, ITEM_MOD_SPIRIT = 6, ITEM_MOD_STAMINA = 7, }; #define MAX_ITEM_MOD 8 enum ItemSpelltriggerType { ITEM_SPELLTRIGGER_ON_USE = 0, // use after equip cooldown ITEM_SPELLTRIGGER_ON_EQUIP = 1, ITEM_SPELLTRIGGER_CHANCE_ON_HIT = 2, ITEM_SPELLTRIGGER_SOULSTONE = 4, /* * ItemSpelltriggerType 5 might have changed on 2.4.3/3.0.3: Such auras * will be applied on item pickup and removed on item loss - maybe on the * other hand the item is destroyed if the aura is removed ("removed on * death" of spell 57348 makes me think so) */ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE = 5, // no equip cooldown }; #define MAX_ITEM_SPELLTRIGGER 6 enum ItemBondingType { NO_BIND = 0, BIND_WHEN_PICKED_UP = 1, BIND_WHEN_EQUIPPED = 2, BIND_WHEN_USE = 3, BIND_QUEST_ITEM = 4, BIND_QUEST_ITEM1 = 5 // not used in game }; #define MAX_BIND_TYPE 6 // Mask for ItemPrototype.Flags field enum ItemPrototypeFlags { ITEM_FLAG_NO_PICKUP = 0x00000001, // not used ITEM_FLAG_CONJURED = 0x00000002, ITEM_FLAG_HAS_LOOT = 0x00000004, // affect only non container items that can be "open" for loot. It or lockid set enable for client show "Right click to open". See also ITEM_DYNFLAG_UNLOCKED ITEM_FLAG_HEROIC_TOOLTIP = 0x00000008, // heroic item version ITEM_FLAG_DEPRECATED = 0x00000010, // can't repeat old note: appears red icon (like when item durability==0) ITEM_FLAG_NO_USER_DESTROY = 0x00000020, // used for totem. Item can not be destroyed, except by using spell (item can be reagent for spell and then allowed) ITEM_FLAG_PLAYERCAST = 0x00000040, // ? old note: usable ITEM_FLAG_NO_EQUIPCOOLDOWN = 0x00000080, ITEM_FLAG_MULTILOOTQUEST = 0x00000100, // saw this on item 47115, 49295... ITEM_FLAG_IS_WRAPPER = 0x00000200, // used or not used wrapper ITEM_FLAG_USES_RESOURCES = 0x00000400, // ignore bag space at new item creation? ITEM_FLAG_MULTI_DROP = 0x00000800, // determines if item is party loot or not ITEM_FLAG_ITEMPURCHASE_RECORD = 0x00001000, // item cost can be refunded within 2 hours after purchase ITEM_FLAG_PETITION = 0x00002000, // arena/guild charter ITEM_FLAG_HAS_TEXT = 0x00004000, ITEM_FLAG_NO_DISENCHANT = 0x00008000, // a lot of items have this ITEM_FLAG_REAL_DURATION = 0x00010000, // a lot of items have this ITEM_FLAG_NO_CREATOR = 0x00020000, ITEM_FLAG_IS_PROSPECTABLE = 0x00040000, // item can have prospecting loot (in fact some items expected have empty loot) ITEM_FLAG_UNIQUE_EQUIPPABLE = 0x00080000, ITEM_FLAG_IGNORE_FOR_AURAS = 0x00100000, ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS = 0x00200000, // last used flag in 1.12.1 }; enum BagFamily { BAG_FAMILY_NONE = 0, BAG_FAMILY_ARROWS = 1, BAG_FAMILY_BULLETS = 2, BAG_FAMILY_SOUL_SHARDS = 3, BAG_FAMILY_UNKNOWN1 = 4, BAG_FAMILY_UNKNOWN2 = 5, BAG_FAMILY_HERBS = 6, BAG_FAMILY_ENCHANTING_SUPP = 7, BAG_FAMILY_ENGINEERING_SUPP = 8, BAG_FAMILY_KEYS = 9, }; enum InventoryType { INVTYPE_NON_EQUIP = 0, INVTYPE_HEAD = 1, INVTYPE_NECK = 2, INVTYPE_SHOULDERS = 3, INVTYPE_BODY = 4, INVTYPE_CHEST = 5, INVTYPE_WAIST = 6, INVTYPE_LEGS = 7, INVTYPE_FEET = 8, INVTYPE_WRISTS = 9, INVTYPE_HANDS = 10, INVTYPE_FINGER = 11, INVTYPE_TRINKET = 12, INVTYPE_WEAPON = 13, INVTYPE_SHIELD = 14, INVTYPE_RANGED = 15, INVTYPE_CLOAK = 16, INVTYPE_2HWEAPON = 17, INVTYPE_BAG = 18, INVTYPE_TABARD = 19, INVTYPE_ROBE = 20, INVTYPE_WEAPONMAINHAND = 21, INVTYPE_WEAPONOFFHAND = 22, INVTYPE_HOLDABLE = 23, INVTYPE_AMMO = 24, INVTYPE_THROWN = 25, INVTYPE_RANGEDRIGHT = 26, INVTYPE_QUIVER = 27, INVTYPE_RELIC = 28 }; #define MAX_INVTYPE 29 enum ItemClass { ITEM_CLASS_CONSUMABLE = 0, ITEM_CLASS_CONTAINER = 1, ITEM_CLASS_WEAPON = 2, ITEM_CLASS_GEM = 3, ITEM_CLASS_ARMOR = 4, ITEM_CLASS_REAGENT = 5, ITEM_CLASS_PROJECTILE = 6, ITEM_CLASS_TRADE_GOODS = 7, ITEM_CLASS_GENERIC = 8, ITEM_CLASS_RECIPE = 9, ITEM_CLASS_MONEY = 10, ITEM_CLASS_QUIVER = 11, ITEM_CLASS_QUEST = 12, ITEM_CLASS_KEY = 13, ITEM_CLASS_PERMANENT = 14, ITEM_CLASS_MISC = 15 }; #define MAX_ITEM_CLASS 16 enum ItemSubclassConsumable { ITEM_SUBCLASS_CONSUMABLE = 0, ITEM_SUBCLASS_POTION = 1, ITEM_SUBCLASS_ELIXIR = 2, ITEM_SUBCLASS_FLASK = 3, ITEM_SUBCLASS_SCROLL = 4, ITEM_SUBCLASS_FOOD = 5, ITEM_SUBCLASS_ITEM_ENHANCEMENT = 6, ITEM_SUBCLASS_BANDAGE = 7, ITEM_SUBCLASS_CONSUMABLE_OTHER = 8 }; #define MAX_ITEM_SUBCLASS_CONSUMABLE 9 enum ItemSubclassContainer { ITEM_SUBCLASS_CONTAINER = 0, ITEM_SUBCLASS_SOUL_CONTAINER = 1, ITEM_SUBCLASS_HERB_CONTAINER = 2, ITEM_SUBCLASS_ENCHANTING_CONTAINER = 3, ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4, ITEM_SUBCLASS_GEM_CONTAINER = 5, ITEM_SUBCLASS_MINING_CONTAINER = 6, ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7 }; #define MAX_ITEM_SUBCLASS_CONTAINER 8 enum ItemSubclassWeapon { ITEM_SUBCLASS_WEAPON_AXE = 0, ITEM_SUBCLASS_WEAPON_AXE2 = 1, ITEM_SUBCLASS_WEAPON_BOW = 2, ITEM_SUBCLASS_WEAPON_GUN = 3, ITEM_SUBCLASS_WEAPON_MACE = 4, ITEM_SUBCLASS_WEAPON_MACE2 = 5, ITEM_SUBCLASS_WEAPON_POLEARM = 6, ITEM_SUBCLASS_WEAPON_SWORD = 7, ITEM_SUBCLASS_WEAPON_SWORD2 = 8, ITEM_SUBCLASS_WEAPON_obsolete = 9, ITEM_SUBCLASS_WEAPON_STAFF = 10, ITEM_SUBCLASS_WEAPON_EXOTIC = 11, ITEM_SUBCLASS_WEAPON_EXOTIC2 = 12, ITEM_SUBCLASS_WEAPON_FIST = 13, ITEM_SUBCLASS_WEAPON_MISC = 14, ITEM_SUBCLASS_WEAPON_DAGGER = 15, ITEM_SUBCLASS_WEAPON_THROWN = 16, ITEM_SUBCLASS_WEAPON_SPEAR = 17, ITEM_SUBCLASS_WEAPON_CROSSBOW = 18, ITEM_SUBCLASS_WEAPON_WAND = 19, ITEM_SUBCLASS_WEAPON_FISHING_POLE = 20 }; #define MAX_ITEM_SUBCLASS_WEAPON 21 /* enum ItemSubclassGem [-ZERO] not used in pre-bc { ITEM_SUBCLASS_GEM_RED = 0, ITEM_SUBCLASS_GEM_BLUE = 1, ITEM_SUBCLASS_GEM_YELLOW = 2, ITEM_SUBCLASS_GEM_PURPLE = 3, ITEM_SUBCLASS_GEM_GREEN = 4, ITEM_SUBCLASS_GEM_ORANGE = 5, ITEM_SUBCLASS_GEM_META = 6, ITEM_SUBCLASS_GEM_SIMPLE = 7, ITEM_SUBCLASS_GEM_PRISMATIC = 8 }; */ #define MAX_ITEM_SUBCLASS_GEM 1 enum ItemSubclassArmor { ITEM_SUBCLASS_ARMOR_MISC = 0, ITEM_SUBCLASS_ARMOR_CLOTH = 1, ITEM_SUBCLASS_ARMOR_LEATHER = 2, ITEM_SUBCLASS_ARMOR_MAIL = 3, ITEM_SUBCLASS_ARMOR_PLATE = 4, ITEM_SUBCLASS_ARMOR_BUCKLER = 5, ITEM_SUBCLASS_ARMOR_SHIELD = 6, ITEM_SUBCLASS_ARMOR_LIBRAM = 7, ITEM_SUBCLASS_ARMOR_IDOL = 8, ITEM_SUBCLASS_ARMOR_TOTEM = 9 }; #define MAX_ITEM_SUBCLASS_ARMOR 10 enum ItemSubclassReagent { ITEM_SUBCLASS_REAGENT = 0 }; #define MAX_ITEM_SUBCLASS_REAGENT 1 enum ItemSubclassProjectile { ITEM_SUBCLASS_WAND = 0, // ABS ITEM_SUBCLASS_BOLT = 1, // ABS ITEM_SUBCLASS_ARROW = 2, ITEM_SUBCLASS_BULLET = 3, ITEM_SUBCLASS_THROWN = 4 // ABS }; #define MAX_ITEM_SUBCLASS_PROJECTILE 5 enum ItemSubclassTradeGoods { ITEM_SUBCLASS_TRADE_GOODS = 0, ITEM_SUBCLASS_PARTS = 1, ITEM_SUBCLASS_EXPLOSIVES = 2, ITEM_SUBCLASS_DEVICES = 3, // ITEM_SUBCLASS_JEWELCRAFTING = 4, ITEM_SUBCLASS_CLOTH = 5, ITEM_SUBCLASS_LEATHER = 6, ITEM_SUBCLASS_METAL_STONE = 7, ITEM_SUBCLASS_MEAT = 8, ITEM_SUBCLASS_HERB = 9, ITEM_SUBCLASS_ELEMENTAL = 10, ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11, ITEM_SUBCLASS_ENCHANTING = 12 }; #define MAX_ITEM_SUBCLASS_TRADE_GOODS 14 enum ItemSubclassGeneric { ITEM_SUBCLASS_GENERIC = 0 }; #define MAX_ITEM_SUBCLASS_GENERIC 1 enum ItemSubclassRecipe { ITEM_SUBCLASS_BOOK = 0, ITEM_SUBCLASS_LEATHERWORKING_PATTERN = 1, ITEM_SUBCLASS_TAILORING_PATTERN = 2, ITEM_SUBCLASS_ENGINEERING_SCHEMATIC = 3, ITEM_SUBCLASS_BLACKSMITHING = 4, ITEM_SUBCLASS_COOKING_RECIPE = 5, ITEM_SUBCLASS_ALCHEMY_RECIPE = 6, ITEM_SUBCLASS_FIRST_AID_MANUAL = 7, ITEM_SUBCLASS_ENCHANTING_FORMULA = 8, ITEM_SUBCLASS_FISHING_MANUAL = 9, }; #define MAX_ITEM_SUBCLASS_RECIPE 11 enum ItemSubclassMoney { ITEM_SUBCLASS_MONEY = 0 }; #define MAX_ITEM_SUBCLASS_MONEY 1 enum ItemSubclassQuiver { ITEM_SUBCLASS_QUIVER0 = 0, // ABS ITEM_SUBCLASS_QUIVER1 = 1, // ABS ITEM_SUBCLASS_QUIVER = 2, ITEM_SUBCLASS_AMMO_POUCH = 3 }; #define MAX_ITEM_SUBCLASS_QUIVER 4 enum ItemSubclassQuest { ITEM_SUBCLASS_QUEST = 0 }; #define MAX_ITEM_SUBCLASS_QUEST 1 enum ItemSubclassKey { ITEM_SUBCLASS_KEY = 0, ITEM_SUBCLASS_LOCKPICK = 1 }; #define MAX_ITEM_SUBCLASS_KEY 2 enum ItemSubclassPermanent { ITEM_SUBCLASS_PERMANENT = 0 }; #define MAX_ITEM_SUBCLASS_PERMANENT 1 enum ItemSubclassJunk { ITEM_SUBCLASS_JUNK = 0, ITEM_SUBCLASS_JUNK_REAGENT = 1, ITEM_SUBCLASS_JUNK_PET = 2, ITEM_SUBCLASS_JUNK_HOLIDAY = 3, ITEM_SUBCLASS_JUNK_OTHER = 4, ITEM_SUBCLASS_JUNK_MOUNT = 5 }; #define MAX_ITEM_SUBCLASS_JUNK 6 const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = { MAX_ITEM_SUBCLASS_CONSUMABLE, MAX_ITEM_SUBCLASS_CONTAINER, MAX_ITEM_SUBCLASS_WEAPON, MAX_ITEM_SUBCLASS_GEM, MAX_ITEM_SUBCLASS_ARMOR, MAX_ITEM_SUBCLASS_REAGENT, MAX_ITEM_SUBCLASS_PROJECTILE, MAX_ITEM_SUBCLASS_TRADE_GOODS, MAX_ITEM_SUBCLASS_GENERIC, MAX_ITEM_SUBCLASS_RECIPE, MAX_ITEM_SUBCLASS_MONEY, MAX_ITEM_SUBCLASS_QUIVER, MAX_ITEM_SUBCLASS_QUEST, MAX_ITEM_SUBCLASS_KEY, MAX_ITEM_SUBCLASS_PERMANENT, MAX_ITEM_SUBCLASS_JUNK }; inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass) { switch (ItemClass) { case ITEM_CLASS_WEAPON: return ItemSubClass; case ITEM_CLASS_ARMOR: return ItemSubClass + 21; } return 0; } enum ItemExtraFlags { ITEM_EXTRA_REAL_TIME_DURATION = 0x01, // if set and have Duration time, then offline time included in counting, if not set then counted only in game time ITEM_EXTRA_IGNORE_QUEST_STATUS = 0x02, // if set, queststarter item will drop for player regardless of the related quest's status ITEM_EXTRA_ALL = 0x03 // all used flags, used for check DB data (mask all above flags) }; // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some platform #if defined( __GNUC__ ) #pragma pack(1) #else #pragma pack(push,1) #endif struct _Damage { float DamageMin; float DamageMax; uint32 DamageType; // id from Resistances.dbc }; struct _ItemStat { uint32 ItemStatType; int32 ItemStatValue; }; struct _Spell { uint32 SpellId; // id from Spell.dbc uint32 SpellTrigger; int32 SpellCharges; float SpellPPMRate; int32 SpellCooldown; uint32 SpellCategory; // id from SpellCategory.dbc int32 SpellCategoryCooldown; }; struct _Socket { uint32 Color; uint32 Content; }; #define MAX_ITEM_PROTO_DAMAGES 5 #define MAX_ITEM_PROTO_SPELLS 5 #define MAX_ITEM_PROTO_STATS 10 struct ItemPrototype { uint32 ItemId; uint32 Class; // id from ItemClass.dbc uint32 SubClass; // id from ItemSubClass.dbc char* Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; uint32 Flags; uint32 BuyCount; uint32 BuyPrice; uint32 SellPrice; uint32 InventoryType; uint32 AllowableClass; uint32 AllowableRace; uint32 ItemLevel; uint32 RequiredLevel; uint32 RequiredSkill; // id from SkillLine.dbc uint32 RequiredSkillRank; uint32 RequiredSpell; // id from Spell.dbc uint32 RequiredHonorRank; uint32 RequiredCityRank; uint32 RequiredReputationFaction; // id from Faction.dbc uint32 RequiredReputationRank; uint32 MaxCount; uint32 Stackable; uint32 ContainerSlots; _ItemStat ItemStat[MAX_ITEM_PROTO_STATS]; _Damage Damage[MAX_ITEM_PROTO_DAMAGES]; uint32 Armor; uint32 HolyRes; uint32 FireRes; uint32 NatureRes; uint32 FrostRes; uint32 ShadowRes; uint32 ArcaneRes; uint32 Delay; uint32 AmmoType; float RangedModRange; _Spell Spells[MAX_ITEM_PROTO_SPELLS]; uint32 Bonding; char* Description; uint32 PageText; uint32 LanguageID; uint32 PageMaterial; uint32 StartQuest; // id from QuestCache.wdb uint32 LockID; uint32 Material; // id from Material.dbc uint32 Sheath; uint32 RandomProperty; // id from ItemRandomProperties.dbc uint32 Block; uint32 ItemSet; // id from ItemSet.dbc uint32 MaxDurability; uint32 Area; // id from AreaTable.dbc uint32 Map; // id from Map.dbc uint32 BagFamily; uint32 ScriptId; uint32 DisenchantID; uint32 FoodType; uint32 MinMoneyLoot; uint32 MaxMoneyLoot; uint32 Duration; uint32 ExtraFlags; // see ItemExtraFlags // helpers bool CanChangeEquipStateInCombat() const { switch (InventoryType) { case INVTYPE_RELIC: case INVTYPE_SHIELD: case INVTYPE_HOLDABLE: return true; } switch (Class) { case ITEM_CLASS_WEAPON: case ITEM_CLASS_PROJECTILE: return true; } return false; } constexpr bool HasCreator() const { constexpr uint32 ITEM_HEARTHSTONE_ID = 6948; return Stackable <= 1 && Class != ITEM_CLASS_CONSUMABLE && Class != ITEM_CLASS_QUEST && !(Flags & ITEM_FLAG_NO_CREATOR) && ItemId != ITEM_HEARTHSTONE_ID; } uint32 GetMaxStackSize() const { return Stackable; } bool IsPotion() const { return Class == ITEM_CLASS_CONSUMABLE && SubClass == ITEM_SUBCLASS_POTION; } bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); } bool IsWeapon() const { return Class == ITEM_CLASS_WEAPON; } bool IsRangedWeapon() const { return IsWeapon() && (InventoryType == INVTYPE_RANGED || InventoryType == INVTYPE_THROWN || InventoryType == INVTYPE_RANGEDRIGHT); } }; // GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform #if defined( __GNUC__ ) #pragma pack() #else #pragma pack(pop) #endif struct ItemLocale { std::vector Name; std::vector Description; }; #endif