diff options
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 62 |
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)); +} |