fix(Core/Item): Random item properties generation (#2331)

This commit is contained in:
Shard
2019-10-28 08:08:37 +01:00
committed by Stoabrogga
parent 58a0ae5762
commit 97c55c6152
8 changed files with 21 additions and 20 deletions
+8 -5
View File
@@ -1013,7 +1013,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, bool clone, uint32 randomPropertyId)
{
if (count < 1)
return NULL; //don't create item at zero count
@@ -1030,6 +1030,11 @@ Item* Item::CreateItem(uint32 item, uint32 count, Player const* player)
if (pItem->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_ITEM), item, player))
{
pItem->SetCount(count);
if (!clone)
pItem->SetItemRandomProperties(randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item));
else
if (randomPropertyId)
pItem->SetItemRandomProperties(randomPropertyId);
return pItem;
}
else
@@ -1042,7 +1047,8 @@ 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);
// player CAN be NULL in which case we must not update random properties because that accesses player's item update queue
Item * newItem = CreateItem(GetEntry(), count, player, true, player ? GetItemRandomPropertyId() : 0);
if (!newItem)
return NULL;
@@ -1050,9 +1056,6 @@ Item* Item::CloneItem(uint32 count, Player const* player) const
newItem->SetUInt32Value(ITEM_FIELD_GIFTCREATOR, GetUInt32Value(ITEM_FIELD_GIFTCREATOR));
newItem->SetUInt32Value(ITEM_FIELD_FLAGS, GetUInt32Value(ITEM_FIELD_FLAGS) & ~(ITEM_FIELD_FLAG_REFUNDABLE | ITEM_FIELD_FLAG_BOP_TRADEABLE));
newItem->SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION));
// player CAN be NULL in which case we must not update random properties because that accesses player's item update queue
if (player)
newItem->SetItemRandomProperties(GetItemRandomPropertyId());
return newItem;
}
+1 -1
View File
@@ -196,7 +196,7 @@ bool ItemCanGoIntoBag(ItemTemplate const* proto, ItemTemplate const* pBagProto);
class 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, bool clone = false, uint32 randomPropertyId = 0);
Item* CloneItem(uint32 count, Player const* player = NULL) const;
Item();
+5 -7
View File
@@ -1249,7 +1249,7 @@ bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount)
InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
if (msg == EQUIP_ERR_OK)
{
StoreNewItem(sDest, titem_id, true, Item::GenerateItemRandomPropertyId(titem_id));
StoreNewItem(sDest, titem_id, true);
return true; // stored
}
@@ -12522,7 +12522,7 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update
for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
count += itr->count;
Item* pItem = Item::CreateItem(item, count, this);
Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
if (pItem)
{
// pussywizard: obtaining blue or better items saves to db
@@ -12533,8 +12533,6 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update
ItemAddedQuestCheck(item, count);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, count);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, item, count);
if (randomPropertyId)
pItem->SetItemRandomProperties(randomPropertyId);
pItem = StoreItem(dest, pItem, update);
@@ -15874,7 +15872,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
ItemPosCountVec dest;
if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
{
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
Item* item = StoreNewItem(dest, itemId, true);
SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
@@ -15893,7 +15891,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
ItemPosCountVec dest;
if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
{
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
Item* item = StoreNewItem(dest, itemId, true);
SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
@@ -27222,7 +27220,7 @@ bool Player::AddItem(uint32 itemId, uint32 count)
return false;
}
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
Item* item = StoreNewItem(dest, itemId, true);
if (item)
SendNewItem(item, count, true, false);
else
+1 -1
View File
@@ -1758,7 +1758,7 @@ void Spell::DoCreateItem(uint8 /*effIndex*/, uint32 itemId)
if (addNumber)
{
// create the new item and store it
Item* pItem = player->StoreNewItem(dest, newitemid, true, Item::GenerateItemRandomPropertyId(newitemid));
Item* pItem = player->StoreNewItem(dest, newitemid, true);
// was it successful? return error if not
if (!pItem)
+1 -1
View File
@@ -1527,7 +1527,7 @@ public:
return false;
}
Item* item = playerTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
Item* item = playerTarget->StoreNewItem(dest, itemId, true);
// remove binding (let GM give it to another player later)
if (player == playerTarget)
+1 -1
View File
@@ -84,7 +84,7 @@ public:
ItemPosCountVec dest;
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 11522, 1, NULL);
if (msg == EQUIP_ERR_OK)
player->StoreNewItem(dest, 11522, 1, true);
player->StoreNewItem(dest, 11522, true);
}
}
@@ -751,7 +751,7 @@ public:
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30658, 1, NULL);
if (msg == EQUIP_ERR_OK)
{
player->StoreNewItem(dest, 30658, 1, true);
player->StoreNewItem(dest, 30658, true);
ClearGossipMenuFor(player);
}
}
@@ -761,7 +761,7 @@ public:
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30659, 1, NULL);
if (msg == EQUIP_ERR_OK)
{
player->StoreNewItem(dest, 30659, 1, true);
player->StoreNewItem(dest, 30659, true);
ClearGossipMenuFor(player);
}
}
+2 -2
View File
@@ -147,7 +147,7 @@ public:
ItemPosCountVec dest;
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 39883, 1); // Cracked Egg
if (msg == EQUIP_ERR_OK)
player->StoreNewItem(dest, 39883, true, Item::GenerateItemRandomPropertyId(39883));
player->StoreNewItem(dest, 39883, true);
return true;
}
@@ -167,7 +167,7 @@ public:
ItemPosCountVec dest;
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 44718, 1); // Ripe Disgusting Jar
if (msg == EQUIP_ERR_OK)
player->StoreNewItem(dest, 44718, true, Item::GenerateItemRandomPropertyId(44718));
player->StoreNewItem(dest, 44718, true);
return true;
}