Updated item stuff

This commit is contained in:
tomrus88 2008-10-26 10:18:58 +03:00
parent 78a41233aa
commit 579fc917bb
4 changed files with 115 additions and 53 deletions

View file

@ -204,6 +204,10 @@ bool ItemCanGoIntoBag(ItemPrototype const *pProto, ItemPrototype const *pBagProt
if(!(pProto->BagFamily & BAG_FAMILY_MASK_LEATHERWORKING_SUPP)) if(!(pProto->BagFamily & BAG_FAMILY_MASK_LEATHERWORKING_SUPP))
return false; return false;
return true; return true;
case ITEM_SUBCLASS_INSCRIPTION_CONTAINER:
if(!(pProto->BagFamily & BAG_FAMILY_MASK_INSCRIPTION_SUPP))
return false;
return true;
default: default:
return false; return false;
} }
@ -448,7 +452,7 @@ uint32 Item::GetSkill()
const static uint32 item_armor_skills[MAX_ITEM_SUBCLASS_ARMOR] = const static uint32 item_armor_skills[MAX_ITEM_SUBCLASS_ARMOR] =
{ {
0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0,0
}; };
ItemPrototype const* proto = GetProto(); ItemPrototype const* proto = GetProto();
@ -763,9 +767,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges)) if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges))
return; return;
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id);
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
} }
@ -774,7 +778,7 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
if(GetEnchantmentDuration(slot) == duration) if(GetEnchantmentDuration(slot) == duration)
return; return;
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
} }
@ -783,7 +787,7 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
if(GetEnchantmentCharges(slot) == charges) if(GetEnchantmentCharges(slot) == charges)
return; return;
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
} }
@ -793,7 +797,7 @@ void Item::ClearEnchantment(EnchantmentSlot slot)
return; return;
for(uint8 x = 0; x < 3; ++x) for(uint8 x = 0; x < 3; ++x)
SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
} }

View file

@ -152,23 +152,24 @@ enum EnchantmentSlot
SOCK_ENCHANTMENT_SLOT_2 = 3, SOCK_ENCHANTMENT_SLOT_2 = 3,
SOCK_ENCHANTMENT_SLOT_3 = 4, SOCK_ENCHANTMENT_SLOT_3 = 4,
BONUS_ENCHANTMENT_SLOT = 5, BONUS_ENCHANTMENT_SLOT = 5,
MAX_INSPECTED_ENCHANTMENT_SLOT = 6, WOTLK_ENCHANTMENT_SLOT = 6,
MAX_INSPECTED_ENCHANTMENT_SLOT = 7,
PROP_ENCHANTMENT_SLOT_0 = 6, // used with RandomSuffix PROP_ENCHANTMENT_SLOT_0 = 7, // used with RandomSuffix
PROP_ENCHANTMENT_SLOT_1 = 7, // used with RandomSuffix PROP_ENCHANTMENT_SLOT_1 = 8, // used with RandomSuffix
PROP_ENCHANTMENT_SLOT_2 = 8, // used with RandomSuffix and RandomProperty PROP_ENCHANTMENT_SLOT_2 = 9, // used with RandomSuffix and RandomProperty
PROP_ENCHANTMENT_SLOT_3 = 9, // used with RandomProperty PROP_ENCHANTMENT_SLOT_3 = 10, // used with RandomProperty
PROP_ENCHANTMENT_SLOT_4 = 10, // used with RandomProperty PROP_ENCHANTMENT_SLOT_4 = 11, // used with RandomProperty
MAX_ENCHANTMENT_SLOT = 11 MAX_ENCHANTMENT_SLOT = 12
}; };
#define MAX_VISIBLE_ITEM_OFFSET 16 // 16 fields per visible item (creator(2) + enchantments(12) + properties(1) + pad(1)) #define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1))
enum EnchantmentOffset enum EnchantmentOffset
{ {
ENCHANTMENT_ID_OFFSET = 0, ENCHANTMENT_ID_OFFSET = 0,
ENCHANTMENT_DURATION_OFFSET = 1, ENCHANTMENT_DURATION_OFFSET = 1,
ENCHANTMENT_CHARGES_OFFSET = 2 ENCHANTMENT_CHARGES_OFFSET = 2 // now here not only charges, but something new in wotlk
}; };
#define MAX_ENCHANTMENT_OFFSET 3 #define MAX_ENCHANTMENT_OFFSET 3
@ -254,9 +255,9 @@ class MANGOS_DLL_SPEC Item : public Object
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration); void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration);
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges); void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges);
void ClearEnchantment(EnchantmentSlot slot); void ClearEnchantment(EnchantmentSlot slot);
uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);} uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);}
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);} uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);} uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}
void SendTimeUpdate(Player* owner); void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff); void UpdateDuration(Player* owner, uint32 diff);

View file

@ -286,7 +286,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ItemId; data << pProto->ItemId;
data << pProto->Class; data << pProto->Class;
data << pProto->SubClass; data << pProto->SubClass;
data << uint32(-1); // new 2.0.3, not exist in wdb cache? data << pProto->Unk0; // new 2.0.3, not exist in wdb cache?
data << Name; data << Name;
data << uint8(0x00); //pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name... data << uint8(0x00); //pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name...
data << uint8(0x00); //pProto->Name3; // blizz not send name there, just uint8(0x00); data << uint8(0x00); //pProto->Name3; // blizz not send name there, just uint8(0x00);
@ -311,11 +311,14 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->MaxCount; data << pProto->MaxCount;
data << pProto->Stackable; data << pProto->Stackable;
data << pProto->ContainerSlots; data << pProto->ContainerSlots;
data << uint32(10); // item stats count?
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
data << pProto->ItemStat[i].ItemStatType; data << pProto->ItemStat[i].ItemStatType;
data << pProto->ItemStat[i].ItemStatValue; data << pProto->ItemStat[i].ItemStatValue;
} }
data << pProto->ScalingStatDistribution; // scaling stats distribution
data << pProto->ScalingStatValue; // some kind of flags used to determine stat values column
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
data << pProto->Damage[i].DamageMin; data << pProto->Damage[i].DamageMin;
@ -333,7 +336,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ArcaneRes; data << pProto->ArcaneRes;
data << pProto->Delay; data << pProto->Delay;
data << pProto->Ammo_type; data << pProto->AmmoType;
data << pProto->RangedModRange; data << pProto->RangedModRange;
for(int s = 0; s < 5; s++) for(int s = 0; s < 5; s++)
@ -399,7 +402,8 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->GemProperties; data << pProto->GemProperties;
data << pProto->RequiredDisenchantSkill; data << pProto->RequiredDisenchantSkill;
data << pProto->ArmorDamageModifier; data << pProto->ArmorDamageModifier;
data << uint32(0); // added in 2.4.2.8209, duration (seconds) data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
SendPacket( &data ); SendPacket( &data );
} }
else else

View file

@ -55,10 +55,18 @@ enum ItemModType
ITEM_MOD_CRIT_TAKEN_RATING = 34, ITEM_MOD_CRIT_TAKEN_RATING = 34,
ITEM_MOD_RESILIENCE_RATING = 35, ITEM_MOD_RESILIENCE_RATING = 35,
ITEM_MOD_HASTE_RATING = 36, ITEM_MOD_HASTE_RATING = 36,
ITEM_MOD_EXPERTISE_RATING = 37 ITEM_MOD_EXPERTISE_RATING = 37,
ITEM_MOD_ATTACK_POWER = 38,
ITEM_MOD_RANGED_ATTACK_POWER = 39,
ITEM_MOD_FERAL_ATTACK_POWER = 40,
ITEM_MOD_SPELL_HEALING_DONE = 41,
ITEM_MOD_SPELL_DAMAGE_DONE = 42,
ITEM_MOD_MANA_REGENERATION = 43,
ITEM_MOD_ARMOR_PENETRATION_RATING = 44,
ITEM_MOD_SPELL_POWER = 45
}; };
#define MAX_ITEM_MOD 38 #define MAX_ITEM_MOD 46
enum ItemSpelltriggerType enum ItemSpelltriggerType
{ {
@ -183,10 +191,11 @@ enum ItemClass
ITEM_CLASS_QUEST = 12, ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13, ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14, ITEM_CLASS_PERMANENT = 14,
ITEM_CLASS_JUNK = 15 ITEM_CLASS_MISC = 15,
ITEM_CLASS_GLYPH = 16
}; };
#define MAX_ITEM_CLASS 16 #define MAX_ITEM_CLASS 17
enum ItemSubclassConsumable enum ItemSubclassConsumable
{ {
@ -212,10 +221,11 @@ enum ItemSubclassContainer
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4, ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5, ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6, ITEM_SUBCLASS_MINING_CONTAINER = 6,
ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7 ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
}; };
#define MAX_ITEM_SUBCLASS_CONTAINER 8 #define MAX_ITEM_SUBCLASS_CONTAINER 9
enum ItemSubclassWeapon enum ItemSubclassWeapon
{ {
@ -270,10 +280,11 @@ enum ItemSubclassArmor
ITEM_SUBCLASS_ARMOR_SHIELD = 6, ITEM_SUBCLASS_ARMOR_SHIELD = 6,
ITEM_SUBCLASS_ARMOR_LIBRAM = 7, ITEM_SUBCLASS_ARMOR_LIBRAM = 7,
ITEM_SUBCLASS_ARMOR_IDOL = 8, ITEM_SUBCLASS_ARMOR_IDOL = 8,
ITEM_SUBCLASS_ARMOR_TOTEM = 9 ITEM_SUBCLASS_ARMOR_TOTEM = 9,
ITEM_SUBCLASS_ARMOR_SIGIL = 10
}; };
#define MAX_ITEM_SUBCLASS_ARMOR 10 #define MAX_ITEM_SUBCLASS_ARMOR 11
enum ItemSubclassReagent enum ItemSubclassReagent
{ {
@ -308,10 +319,12 @@ enum ItemSubclassTradeGoods
ITEM_SUBCLASS_ELEMENTAL = 10, ITEM_SUBCLASS_ELEMENTAL = 10,
ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11, ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11,
ITEM_SUBCLASS_ENCHANTING = 12, ITEM_SUBCLASS_ENCHANTING = 12,
ITEM_SUBCLASS_MATERIAL = 13 // Added in 2.4.2 ITEM_SUBCLASS_MATERIAL = 13,
ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14,
ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15
}; };
#define MAX_ITEM_SUBCLASS_TRADE_GOODS 14 #define MAX_ITEM_SUBCLASS_TRADE_GOODS 16
enum ItemSubclassGeneric enum ItemSubclassGeneric
{ {
@ -421,7 +434,8 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
MAX_ITEM_SUBCLASS_QUEST, MAX_ITEM_SUBCLASS_QUEST,
MAX_ITEM_SUBCLASS_KEY, MAX_ITEM_SUBCLASS_KEY,
MAX_ITEM_SUBCLASS_PERMANENT, MAX_ITEM_SUBCLASS_PERMANENT,
MAX_ITEM_SUBCLASS_JUNK MAX_ITEM_SUBCLASS_JUNK,
MAX_ITEM_SUBCLASS_GLYPH
}; };
inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass) inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
@ -446,14 +460,12 @@ struct _Damage
float DamageMin; float DamageMin;
float DamageMax; float DamageMax;
uint32 DamageType; // id from Resistances.dbc uint32 DamageType; // id from Resistances.dbc
}; };
struct _ItemStat struct _ItemStat
{ {
uint32 ItemStatType; uint32 ItemStatType;
int32 ItemStatValue; int32 ItemStatValue;
}; };
struct _Spell struct _Spell
{ {
@ -464,7 +476,6 @@ struct _Spell
int32 SpellCooldown; int32 SpellCooldown;
uint32 SpellCategory; // id from SpellCategory.dbc uint32 SpellCategory; // id from SpellCategory.dbc
int32 SpellCategoryCooldown; int32 SpellCategoryCooldown;
}; };
struct _Socket struct _Socket
@ -502,6 +513,8 @@ struct ItemPrototype
uint32 Stackable; uint32 Stackable;
uint32 ContainerSlots; uint32 ContainerSlots;
_ItemStat ItemStat[10]; _ItemStat ItemStat[10];
uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc
_Damage Damage[5]; _Damage Damage[5];
uint32 Armor; uint32 Armor;
uint32 HolyRes; uint32 HolyRes;
@ -511,9 +524,8 @@ struct ItemPrototype
uint32 ShadowRes; uint32 ShadowRes;
uint32 ArcaneRes; uint32 ArcaneRes;
uint32 Delay; uint32 Delay;
uint32 Ammo_type; uint32 AmmoType;
float RangedModRange; float RangedModRange;
_Spell Spells[5]; _Spell Spells[5];
uint32 Bonding; uint32 Bonding;
char* Description; char* Description;
@ -538,12 +550,13 @@ struct ItemPrototype
uint32 GemProperties; // id from GemProperties.dbc uint32 GemProperties; // id from GemProperties.dbc
uint32 RequiredDisenchantSkill; uint32 RequiredDisenchantSkill;
float ArmorDamageModifier; float ArmorDamageModifier;
int32 Duration; // negative = realtime, positive = ingame time
uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
char* ScriptName; char* ScriptName;
uint32 DisenchantID; uint32 DisenchantID;
uint32 FoodType; uint32 FoodType;
uint32 MinMoneyLoot; uint32 MinMoneyLoot;
uint32 MaxMoneyLoot; uint32 MaxMoneyLoot;
int32 Duration; // negative = realtime, positive = ingame time
// helpers // helpers
bool CanChangeEquipStateInCombat() const bool CanChangeEquipStateInCombat() const
@ -564,6 +577,46 @@ struct ItemPrototype
return false; return false;
} }
uint32 GetScalingStatValuesColumn() const
{
if(ScalingStatValue & 0x00000001) // stat mod
return 0;
if(ScalingStatValue & 0x00000002) // stat mod
return 1;
if(ScalingStatValue & 0x00000004) // stat mod
return 2;
if(ScalingStatValue & 0x00000008) // stat mod
return 3;
if(ScalingStatValue & 0x00000010) // stat mod
return 4;
if(ScalingStatValue & 0x00000020) // armor mod
return 5;
if(ScalingStatValue & 0x00000040) // armor mod
return 6;
if(ScalingStatValue & 0x00000080) // armor mod
return 7;
if(ScalingStatValue & 0x00000100) // armor mod
return 8;
if(ScalingStatValue & 0x00000200) // damage mod
return 9;
if(ScalingStatValue & 0x00000400) // damage mod
return 10;
if(ScalingStatValue & 0x00000800) // damage mod
return 11;
if(ScalingStatValue & 0x00001000) // damage mod
return 12;
if(ScalingStatValue & 0x00002000) // damage mod
return 13;
if(ScalingStatValue & 0x00004000) // damage mod
return 14;
if(ScalingStatValue & 0x00008000) // spell power
return 15;
if(ScalingStatValue & 0x00020000) // feral AP
return 16;
return 0;
}
}; };
struct ItemLocale struct ItemLocale