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.cpp112
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)