diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 1c86c9daa..79afb11c8 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -2093,7 +2093,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) // mail if(reward->sender) { - Item* item = reward->itemId ? Item::CreateItem(reward->itemId,1,GetPlayer ()) : NULL; + Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetPlayer ()) : NULL; int loc_idx = GetPlayer()->GetSession()->GetSessionDbLocaleIndex(); diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 7035efb64..cf868da5e 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -661,13 +661,6 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id) if ((!itemProto->RandomProperty) && (!itemProto->RandomSuffix)) return 0; - // item can have not null only one from field values - if ((itemProto->RandomProperty) && (itemProto->RandomSuffix)) - { - sLog.outErrorDb("Item template %u have RandomProperty==%u and RandomSuffix==%u, but must have one from field =0", itemProto->ItemId, itemProto->RandomProperty, itemProto->RandomSuffix); - return 0; - } - // Random Property case if (itemProto->RandomProperty) { @@ -1081,7 +1074,7 @@ void Item::SendTimeUpdate(Player* owner) owner->GetSession()->SendPacket(&data); } -Item* Item::CreateItem( uint32 item, uint32 count, Player const* player ) +Item* Item::CreateItem( uint32 item, uint32 count, Player const* player, uint32 randomPropertyId) { if (count < 1) return NULL; //don't create item at zero count @@ -1097,6 +1090,9 @@ Item* Item::CreateItem( uint32 item, uint32 count, Player const* player ) if (pItem->Create(sObjectMgr.GenerateItemLowGuid(), item, player)) { pItem->SetCount(count); + if (uint32 randId = randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item)) + pItem->SetItemRandomProperties(randId); + return pItem; } else @@ -1107,7 +1103,7 @@ Item* Item::CreateItem( uint32 item, uint32 count, Player const* player ) Item* Item::CloneItem(uint32 count, Player const* player) const { - Item* newItem = CreateItem(GetEntry(), count, player); + Item* newItem = CreateItem(GetEntry(), count, player, GetItemRandomPropertyId()); if (!newItem) return NULL; @@ -1115,7 +1111,6 @@ Item* Item::CloneItem(uint32 count, Player const* player) const newItem->SetGuidValue(ITEM_FIELD_GIFTCREATOR, GetGuidValue(ITEM_FIELD_GIFTCREATOR)); newItem->SetUInt32Value(ITEM_FIELD_FLAGS, GetUInt32Value(ITEM_FIELD_FLAGS)); newItem->SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION)); - newItem->SetItemRandomProperties(GetItemRandomPropertyId()); return newItem; } diff --git a/src/game/Item.h b/src/game/Item.h index 9c877cdf3..37ae673d8 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -273,7 +273,7 @@ bool ItemCanGoIntoBag(ItemPrototype const *proto, ItemPrototype const *pBagProto class MANGOS_DLL_SPEC Item : public Object { public: - static Item* CreateItem(uint32 item, uint32 count, Player const* player = NULL); + static Item* CreateItem(uint32 item, uint32 count, Player const* player = NULL, uint32 randomPropertyId = 0); Item* CloneItem( uint32 count, Player const* player = NULL ) const; Item(); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 1f34284fe..dfd50b292 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -2134,108 +2134,118 @@ void ObjectMgr::LoadItemPrototypes() } } - if(proto->Bonding >= MAX_BIND_TYPE) + if (proto->Bonding >= MAX_BIND_TYPE) sLog.outErrorDb("Item (Entry: %u) has wrong Bonding value (%u)",i,proto->Bonding); - if(proto->PageText) + if (proto->PageText) { - if(!sPageTextStore.LookupEntry(proto->PageText)) + if (!sPageTextStore.LookupEntry(proto->PageText)) sLog.outErrorDb("Item (Entry: %u) has non existing first page (Id:%u)", i,proto->PageText); } - if(proto->LockID && !sLockStore.LookupEntry(proto->LockID)) + if (proto->LockID && !sLockStore.LookupEntry(proto->LockID)) sLog.outErrorDb("Item (Entry: %u) has wrong LockID (%u)",i,proto->LockID); - if(proto->Sheath >= MAX_SHEATHETYPE) + if (proto->Sheath >= MAX_SHEATHETYPE) { sLog.outErrorDb("Item (Entry: %u) has wrong Sheath (%u)",i,proto->Sheath); const_cast(proto)->Sheath = SHEATHETYPE_NONE; } - if(proto->RandomProperty && !sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(proto->RandomProperty))) + if (proto->RandomProperty && !sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(proto->RandomProperty))) { sLog.outErrorDb("Item (Entry: %u) has unknown (wrong or not listed in `item_enchantment_template`) RandomProperty (%u)",i,proto->RandomProperty); const_cast(proto)->RandomProperty = 0; } - if(proto->RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(proto->RandomSuffix))) + if (proto->RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(proto->RandomSuffix))) { sLog.outErrorDb("Item (Entry: %u) has wrong RandomSuffix (%u)",i,proto->RandomSuffix); const_cast(proto)->RandomSuffix = 0; } - if(proto->ItemSet && !sItemSetStore.LookupEntry(proto->ItemSet)) + // item can have not null only one from field values + if (proto->RandomProperty && proto->RandomSuffix) { - sLog.outErrorDb("Item (Entry: %u) have wrong ItemSet (%u)",i,proto->ItemSet); + sLog.outErrorDb("Item (Entry: %u) have RandomProperty==%u and RandomSuffix==%u, but must have one from field = 0", + proto->ItemId, proto->RandomProperty, proto->RandomSuffix); + const_cast(proto)->RandomSuffix = 0; + } + + if (proto->ItemSet && !sItemSetStore.LookupEntry(proto->ItemSet)) + { + sLog.outErrorDb("Item (Entry: %u) have wrong ItemSet (%u)", i, proto->ItemSet); const_cast(proto)->ItemSet = 0; } - if(proto->Area && !GetAreaEntryByAreaID(proto->Area)) - sLog.outErrorDb("Item (Entry: %u) has wrong Area (%u)",i,proto->Area); + if (proto->Area && !GetAreaEntryByAreaID(proto->Area)) + sLog.outErrorDb("Item (Entry: %u) has wrong Area (%u)", i, proto->Area); - if(proto->Map && !sMapStore.LookupEntry(proto->Map)) - sLog.outErrorDb("Item (Entry: %u) has wrong Map (%u)",i,proto->Map); + if (proto->Map && !sMapStore.LookupEntry(proto->Map)) + sLog.outErrorDb("Item (Entry: %u) has wrong Map (%u)", i, proto->Map); - if(proto->BagFamily) + if (proto->BagFamily) { // check bits - for(uint32 j = 0; j < sizeof(proto->BagFamily)*8; ++j) + for (uint32 j = 0; j < sizeof(proto->BagFamily) * 8; ++j) { uint32 mask = 1 << j; - if((proto->BagFamily & mask)==0) + if (!(proto->BagFamily & mask)) continue; ItemBagFamilyEntry const* bf = sItemBagFamilyStore.LookupEntry(j+1); - if(!bf) + if (!bf) { - sLog.outErrorDb("Item (Entry: %u) has bag family bit set not listed in ItemBagFamily.dbc, remove bit",i); + sLog.outErrorDb("Item (Entry: %u) has bag family bit set not listed in ItemBagFamily.dbc, remove bit", i); const_cast(proto)->BagFamily &= ~mask; continue; } - if(BAG_FAMILY_MASK_CURRENCY_TOKENS & mask) + if (BAG_FAMILY_MASK_CURRENCY_TOKENS & mask) { CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(proto->ItemId); - if(!ctEntry) + if (!ctEntry) { - sLog.outErrorDb("Item (Entry: %u) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit",i); + sLog.outErrorDb("Item (Entry: %u) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit", i); const_cast(proto)->BagFamily &= ~mask; } } } } - if(proto->TotemCategory && !sTotemCategoryStore.LookupEntry(proto->TotemCategory)) - sLog.outErrorDb("Item (Entry: %u) has wrong TotemCategory (%u)",i,proto->TotemCategory); + if (proto->TotemCategory && !sTotemCategoryStore.LookupEntry(proto->TotemCategory)) + sLog.outErrorDb("Item (Entry: %u) has wrong TotemCategory (%u)", i, proto->TotemCategory); for (int j = 0; j < MAX_ITEM_PROTO_SOCKETS; ++j) { - if(proto->Socket[j].Color && (proto->Socket[j].Color & SOCKET_COLOR_ALL) != proto->Socket[j].Color) + if (proto->Socket[j].Color && (proto->Socket[j].Color & SOCKET_COLOR_ALL) != proto->Socket[j].Color) { - sLog.outErrorDb("Item (Entry: %u) has wrong socketColor_%d (%u)",i,j+1,proto->Socket[j].Color); + sLog.outErrorDb("Item (Entry: %u) has wrong socketColor_%d (%u)", i, j+1, proto->Socket[j].Color); const_cast(proto)->Socket[j].Color = 0; } } - if(proto->GemProperties && !sGemPropertiesStore.LookupEntry(proto->GemProperties)) - sLog.outErrorDb("Item (Entry: %u) has wrong GemProperties (%u)",i,proto->GemProperties); + if (proto->GemProperties && !sGemPropertiesStore.LookupEntry(proto->GemProperties)) + sLog.outErrorDb("Item (Entry: %u) has wrong GemProperties (%u)", i, proto->GemProperties); if (proto->RequiredDisenchantSkill < -1) { - sLog.outErrorDb("Item (Entry: %u) has wrong RequiredDisenchantSkill (%i), set to (-1).",i,proto->RequiredDisenchantSkill); + sLog.outErrorDb("Item (Entry: %u) has wrong RequiredDisenchantSkill (%i), set to (-1).", i, proto->RequiredDisenchantSkill); const_cast(proto)->RequiredDisenchantSkill = -1; } else if (proto->RequiredDisenchantSkill != -1) { if (proto->Quality > ITEM_QUALITY_EPIC || proto->Quality < ITEM_QUALITY_UNCOMMON) { - ERROR_DB_STRICT_LOG("Item (Entry: %u) has unexpected RequiredDisenchantSkill (%u) for non-disenchantable quality (%u), reset it.",i,proto->RequiredDisenchantSkill,proto->Quality); + ERROR_DB_STRICT_LOG("Item (Entry: %u) has unexpected RequiredDisenchantSkill (%u) for non-disenchantable quality (%u), reset it.", + i, proto->RequiredDisenchantSkill, proto->Quality); const_cast(proto)->RequiredDisenchantSkill = -1; } else if (proto->Class != ITEM_CLASS_WEAPON && proto->Class != ITEM_CLASS_ARMOR) { // some wrong data in wdb for unused items - ERROR_DB_STRICT_LOG("Item (Entry: %u) has unexpected RequiredDisenchantSkill (%u) for non-disenchantable item class (%u), reset it.",i,proto->RequiredDisenchantSkill,proto->Class); + ERROR_DB_STRICT_LOG("Item (Entry: %u) has unexpected RequiredDisenchantSkill (%u) for non-disenchantable item class (%u), reset it.", + i, proto->RequiredDisenchantSkill, proto->Class); const_cast(proto)->RequiredDisenchantSkill = -1; } } @@ -2244,17 +2254,17 @@ void ObjectMgr::LoadItemPrototypes() { if (proto->Quality > ITEM_QUALITY_EPIC || proto->Quality < ITEM_QUALITY_UNCOMMON) { - sLog.outErrorDb("Item (Entry: %u) has wrong quality (%u) for disenchanting, remove disenchanting loot id.",i,proto->Quality); + sLog.outErrorDb("Item (Entry: %u) has wrong quality (%u) for disenchanting, remove disenchanting loot id.", i, proto->Quality); const_cast(proto)->DisenchantID = 0; } else if (proto->Class != ITEM_CLASS_WEAPON && proto->Class != ITEM_CLASS_ARMOR) { - sLog.outErrorDb("Item (Entry: %u) has wrong item class (%u) for disenchanting, remove disenchanting loot id.",i,proto->Class); + sLog.outErrorDb("Item (Entry: %u) has wrong item class (%u) for disenchanting, remove disenchanting loot id.", i, proto->Class); const_cast(proto)->DisenchantID = 0; } else if (proto->RequiredDisenchantSkill < 0) { - sLog.outErrorDb("Item (Entry: %u) marked as non-disenchantable by RequiredDisenchantSkill == -1, remove disenchanting loot id.",i); + sLog.outErrorDb("Item (Entry: %u) marked as non-disenchantable by RequiredDisenchantSkill == -1, remove disenchanting loot id.", i); const_cast(proto)->DisenchantID = 0; } } @@ -2262,31 +2272,31 @@ void ObjectMgr::LoadItemPrototypes() { // lot DB cases if (proto->RequiredDisenchantSkill >= 0) - ERROR_DB_STRICT_LOG("Item (Entry: %u) marked as disenchantable by RequiredDisenchantSkill, but not have disenchanting loot id.",i); + ERROR_DB_STRICT_LOG("Item (Entry: %u) marked as disenchantable by RequiredDisenchantSkill, but not have disenchanting loot id.", i); } - if(proto->FoodType >= MAX_PET_DIET) + if (proto->FoodType >= MAX_PET_DIET) { - sLog.outErrorDb("Item (Entry: %u) has wrong FoodType value (%u)",i,proto->FoodType); + sLog.outErrorDb("Item (Entry: %u) has wrong FoodType value (%u)", i, proto->FoodType); const_cast(proto)->FoodType = 0; } - if(proto->ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(proto->ItemLimitCategory)) + if (proto->ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(proto->ItemLimitCategory)) { - sLog.outErrorDb("Item (Entry: %u) has wrong LimitCategory value (%u)",i,proto->ItemLimitCategory); + sLog.outErrorDb("Item (Entry: %u) has wrong LimitCategory value (%u)", i, proto->ItemLimitCategory); const_cast(proto)->ItemLimitCategory = 0; } - if(proto->HolidayId && !sHolidaysStore.LookupEntry(proto->HolidayId)) + if (proto->HolidayId && !sHolidaysStore.LookupEntry(proto->HolidayId)) { sLog.outErrorDb("Item (Entry: %u) has wrong HolidayId value (%u)", i, proto->HolidayId); const_cast(proto)->HolidayId = 0; } - if(proto->ExtraFlags) + if (proto->ExtraFlags) { if (proto->ExtraFlags & ~ITEM_EXTRA_ALL) - sLog.outErrorDb("Item (Entry: %u) has wrong ExtraFlags (%u) with unused bits set",i,proto->ExtraFlags); + sLog.outErrorDb("Item (Entry: %u) has wrong ExtraFlags (%u) with unused bits set", i, proto->ExtraFlags); if (proto->ExtraFlags & ITEM_EXTRA_NON_CONSUMABLE) { @@ -2326,7 +2336,7 @@ void ObjectMgr::LoadItemPrototypes() if (!entry) continue; - for(int j = 0; j < MAX_OUTFIT_ITEMS; ++j) + for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) { if (entry->ItemId[j] <= 0) continue; @@ -2339,7 +2349,7 @@ void ObjectMgr::LoadItemPrototypes() } } - for(std::set::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr) + for (std::set::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr) sLog.outErrorDb("Item (Entry: %u) not exist in `item_template` but referenced in `CharStartOutfit.dbc`", *itr); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index ef1a18509..870555c15 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -11114,13 +11114,11 @@ Item* Player::StoreNewItem( ItemPosCountVec const& dest, uint32 item, bool updat for(ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr) count += itr->count; - Item *pItem = Item::CreateItem( item, count, this ); - if( pItem ) + Item *pItem = Item::CreateItem(item, count, this, randomPropertyId); + if (pItem) { ItemAddedQuestCheck( item, count ); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, count); - if(randomPropertyId) - pItem->SetItemRandomProperties(randomPropertyId); pItem = StoreItem( dest, pItem, update ); } return pItem; @@ -11260,7 +11258,7 @@ Item* Player::_StoreItem( uint16 pos, Item *pItem, uint32 count, bool clone, boo Item* Player::EquipNewItem( uint16 pos, uint32 item, bool update ) { - if (Item *pItem = Item::CreateItem( item, 1, this )) + if (Item *pItem = Item::CreateItem(item, 1, this)) { ItemAddedQuestCheck( item, 1 ); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, 1); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c48a8fbe6..549c474f3 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11701" + #define REVISION_NR "11702" #endif // __REVISION_NR_H__