diff options
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 112 |
1 files changed, 56 insertions, 56 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 97a535cd38b..355317856d5 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1437,7 +1437,10 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) return; } - int32 cost = 0; + int64 cost = 0; + std::vector<Item*> transmogrifier(count, NULL); + std::vector<Item*> transmogrified(count, NULL); + for (uint8 i = 0; i < count; ++i) { // slot of the transmogrified item @@ -1447,96 +1450,93 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) return; } - // entry of the transmogrifier item, if it's not 0 + // transmogrified item + Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]); + if (!itemTransmogrified) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUIDLow(), player->GetName().c_str(), slots[i]); + return; + } + + // if not resetting look + Item* itemTransmogrifier = NULL; if (newEntries[i]) { + // entry of the transmogrifier item ItemTemplate const* proto = sObjectMgr->GetItemTemplate(newEntries[i]); if (!proto) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify to an invalid item (entry: %u).", player->GetGUIDLow(), player->GetName().c_str(), newEntries[i]); return; } - } - Item* itemTransmogrifier = NULL; - // guid of the transmogrifier item, if it's not 0 - if (itemGuids[i]) - { + // guid of the transmogrifier item itemTransmogrifier = player->GetItemByGuid(itemGuids[i]); if (!itemTransmogrifier) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify with an invalid item (lowguid: %u).", player->GetGUIDLow(), player->GetName().c_str(), GUID_LOPART(itemGuids[i])); return; } - } - - // transmogrified item - Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]); - if (!itemTransmogrified) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUIDLow(), player->GetName().c_str(), slots[i]); - return; - } - // uint16 tempDest; - //// has to be able to equip item transmogrified item - //if (!player->CanEquipItem(slots[i], tempDest, itemTransmogrified, true, true)) - //{ - // TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) can't equip the item to be transmogrified (slot: %u, entry: %u).", player->GetGUIDLow(), player->GetName().c_str(), slots[i], itemTransmogrified->GetEntry()); - // return; - //} - // - //// has to be able to equip item transmogrifier item - //if (!player->CanEquipItem(slots[i], tempDest, itemTransmogrifier, true, true)) - //{ - // TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) can't equip the transmogrifier item (slot: %u, entry: %u).", player->GetGUIDLow(), player->GetName().c_str(), slots[i], itemTransmogrifier->GetEntry()); - // return; - //} - - if (!newEntries[i]) // reset look - { - itemTransmogrified->ClearEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT); - player->SetVisibleItemSlot(slots[i], itemTransmogrified); - } - else - { + // entry of transmogrifier and from packet if (itemTransmogrifier->GetEntry() != newEntries[i]) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify with an invalid entry (entry: %u) for item (lowguid: %u).", player->GetGUIDLow(), player->GetName().c_str(), newEntries[i], GUID_LOPART(itemGuids[i])); return; } + // validity of the transmogrification items if (!Item::CanTransmogrifyItemWithItem(itemTransmogrified, itemTransmogrifier)) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetGUIDLow(), player->GetName().c_str(), itemTransmogrified->GetEntry(), itemTransmogrifier->GetEntry()); return; } - // All okay, proceed - itemTransmogrified->SetEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT, newEntries[i], 0, 0); - player->SetVisibleItemSlot(slots[i], itemTransmogrified); + // add cost + cost += itemTransmogrified->GetSpecialPrice(); + } - itemTransmogrified->UpdatePlayedTime(player); + transmogrifier[i] = itemTransmogrifier; + transmogrified[i] = itemTransmogrified; + } - itemTransmogrified->SetOwnerGUID(player->GetGUID()); - itemTransmogrified->SetNotRefundable(player); - itemTransmogrified->ClearSoulboundTradeable(player); + if (cost) // 0 cost if reverting look + { + if (!player->HasEnoughMoney(cost)) + return; + player->ModifyMoney(-cost); + } - if (itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_USE) - itemTransmogrifier->SetBinding(true); + // Everything is fine, proceed - itemTransmogrifier->SetOwnerGUID(player->GetGUID()); - itemTransmogrifier->SetNotRefundable(player); - itemTransmogrifier->ClearSoulboundTradeable(player); + for (uint8 i = 0; i < count; ++i) + { + if (transmogrifier[i]) + { + // Transmogrify + transmogrified[i]->SetEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT, newEntries[i], 0, 0); + player->SetVisibleItemSlot(slots[i], transmogrified[i]); - cost += itemTransmogrified->GetSpecialPrice(); + transmogrified[i]->UpdatePlayedTime(player); + + transmogrified[i]->SetOwnerGUID(player->GetGUID()); + transmogrified[i]->SetNotRefundable(player); + transmogrified[i]->ClearSoulboundTradeable(player); + + if (transmogrifier[i]->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || transmogrifier[i]->GetTemplate()->Bonding == BIND_WHEN_USE) + transmogrifier[i]->SetBinding(true); + + transmogrifier[i]->SetOwnerGUID(player->GetGUID()); + transmogrifier[i]->SetNotRefundable(player); + transmogrifier[i]->ClearSoulboundTradeable(player); + } + else + { + // Reset + transmogrified[i]->ClearEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT); + player->SetVisibleItemSlot(slots[i], transmogrified[i]); } } - - // trusting the client, if it got here it has to have enough money - // ... unless client was modified - if (cost) // 0 cost if reverting look - player->ModifyMoney(-cost); } void WorldSession::SendReforgeResult(bool success) |