aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ItemHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 8c7f8190e09..6eab4072491 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -1292,3 +1292,65 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC
GetBattlePetMgr()->AddPet(battlePetSpecies->ID, battlePetSpecies->CreatureID, BattlePetMgr::RollPetBreed(battlePetSpecies->ID), BattlePetMgr::GetDefaultPetQuality(battlePetSpecies->ID));
_player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
}
+
+void WorldSession::HandleUpgradeItem(WorldPackets::Item::UpgradeItem& upgradeItem)
+{
+ WorldPackets::Item::ItemUpgradeResult itemUpgradeResult;
+ if (!_player->GetNPCIfCanInteractWith(upgradeItem.ItemMaster, UNIT_NPC_FLAG_ITEM_UPGRADE_MASTER))
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - %s not found or player can't interact with it.", upgradeItem.ItemMaster.ToString().c_str());
+ itemUpgradeResult.Success = false;
+ SendPacket(itemUpgradeResult.Write());
+ return;
+ }
+
+ Item* item = _player->GetItemByGuid(upgradeItem.ItemGUID);
+ if (!item)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems: Item %s not found!", upgradeItem.ItemGUID.ToString().c_str());
+ itemUpgradeResult.Success = false;
+ SendPacket(itemUpgradeResult.Write());
+ return;
+ }
+
+ ItemUpgradeEntry const* itemUpgradeEntry = sItemUpgradeStore.LookupEntry(upgradeItem.UpgradeID);
+ if (!itemUpgradeEntry)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) not found.", upgradeItem.UpgradeID);
+ itemUpgradeResult.Success = false;
+ SendPacket(itemUpgradeResult.Write());
+ return;
+ }
+
+ // Check if player has enough currency
+ if (!_player->HasCurrency(itemUpgradeEntry->CurrencyID, itemUpgradeEntry->CurrencyCost))
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - Player has not enougth currency (ID: %u, Cost: %u) not found.", itemUpgradeEntry->CurrencyID, itemUpgradeEntry->CurrencyCost);
+ itemUpgradeResult.Success = false;
+ SendPacket(itemUpgradeResult.Write());
+ return;
+ }
+
+ uint32 currentUpgradeId = item->GetModifier(ITEM_MODIFIER_UPGRADE_ID);
+ if (currentUpgradeId != itemUpgradeEntry->PrevItemUpgradeID)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) is not related to this ItemUpgradePath (%u).", itemUpgradeEntry->ID, currentUpgradeId);
+ itemUpgradeResult.Success = false;
+ SendPacket(itemUpgradeResult.Write());
+ return;
+ }
+
+ itemUpgradeResult.Success = true;
+ SendPacket(itemUpgradeResult.Write());
+
+ if (item->IsEquipped())
+ _player->_ApplyItemBonuses(item, item->GetSlot(), false);
+
+ item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemUpgradeEntry->ID);
+
+ if (item->IsEquipped())
+ _player->_ApplyItemBonuses(item, item->GetSlot(), true);
+
+ item->SetState(ITEM_CHANGED, _player);
+ _player->ModifyCurrency(itemUpgradeEntry->CurrencyID, -int32(itemUpgradeEntry->CurrencyCost));
+}