void Transmogrification::PresetTransmog(Player* player, Item* itemTransmogrified, uint32 fakeEntry, uint8 slot) { if (!GetEnableSets()) return; if (!player || !itemTransmogrified) return; if (slot >= EQUIPMENT_SLOT_END) return; if (!CanTransmogrifyItemWithItem(player, itemTransmogrified->GetTemplate(), sObjectMgr->GetItemTemplate(fakeEntry))) return; // itemTransmogrified->ClearEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT); // player->SetVisibleItemSlot(slot, itemTransmogrified); // Custom if (GetFakeEntry(itemTransmogrified->GetGUID())) DeleteFakeEntry(player, slot, itemTransmogrified); // All okay, proceed // itemTransmogrified->SetEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT, newEntry, 0, 0); // player->SetVisibleItemSlot(slot, itemTransmogrified); // Custom SetFakeEntry(player, fakeEntry, slot, itemTransmogrified); // newEntry itemTransmogrified->UpdatePlayedTime(player); itemTransmogrified->SetOwnerGUID(player->GetGUID()); itemTransmogrified->SetNotRefundable(player); itemTransmogrified->ClearSoulboundTradeable(player); }
void Transmogrification::PresetTransmog(Player* player, Item* itemTransmogrified, uint32 fakeEntry, uint8 slot) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::PresetTransmog"); if (!EnableSets) return; if (!player || !itemTransmogrified) return; if (slot >= EQUIPMENT_SLOT_END) return; if (!CanTransmogrifyItemWithItem(player, itemTransmogrified->GetTemplate(), sObjectMgr->GetItemTemplate(fakeEntry))) return; SetFakeEntry(player, itemTransmogrified, fakeEntry); itemTransmogrified->UpdatePlayedTime(player); itemTransmogrified->SetOwnerGUID(player->GetGUID()); itemTransmogrified->SetNotRefundable(player); itemTransmogrified->ClearSoulboundTradeable(player); }
TransmogTrinityStrings Transmogrification::Transmogrify(Player* player, uint64 itemGUID, uint8 slot, /*uint32 newEntry, */bool no_cost) { int32 cost = 0; // slot of the transmogrified item if (slot >= EQUIPMENT_SLOT_END) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify an item (lowguid: %u) with a wrong slot (%u) when transmogrifying items.", player->GetGUIDLow(), player->GetName().c_str(), GUID_LOPART(itemGUID), slot); return LANG_ERR_TRANSMOG_INVALID_SLOT; } /* // GET FROM itemTransmogrifier // entry of the transmogrifier item, if it's not 0 if (newEntry) { ItemTemplate const* proto = sObjectMgr->GetItemTemplate(newEntry); if (!proto) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify to an invalid item (entry: %u).", player->GetGUIDLow(), player->GetName().c_str(), newEntry); return LANG_ERR_TRANSMOG_INVALID_SRC_ENTRY; } } */ Item* itemTransmogrifier = NULL; // guid of the transmogrifier item, if it's not 0 if (itemGUID) { itemTransmogrifier = player->GetItemByGuid(itemGUID); if (!itemTransmogrifier) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) tried to transmogrify with an invalid item (lowguid: %u).", player->GetGUIDLow(), player->GetName().c_str(), GUID_LOPART(itemGUID)); return LANG_ERR_TRANSMOG_MISSING_SRC_ITEM; } } // transmogrified item Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (!itemTransmogrified) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "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(), slot); return LANG_ERR_TRANSMOG_MISSING_DEST_ITEM; } // uint16 tempDest; //// has to be able to equip item transmogrified item //if (!player->CanEquipItem(slot, tempDest, itemTransmogrified, true, true)) //{ // TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "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(), slot, itemTransmogrified->GetEntry()); // return; //} // //// has to be able to equip item transmogrifier item //if (!player->CanEquipItem(slot, tempDest, itemTransmogrifier, true, true)) //{ // TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) can't equip the transmogrifier item (slot: %u, entry: %u).", player->GetGUIDLow(), player->GetName().c_str(), slot, itemTransmogrifier->GetEntry()); // return; //} if (!itemTransmogrifier) // reset look newEntry { // itemTransmogrified->ClearEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT); // player->SetVisibleItemSlot(slot, itemTransmogrified); // Custom DeleteFakeEntry(player, slot, itemTransmogrified); } else { if (!CanTransmogrifyItemWithItem(player, itemTransmogrified->GetTemplate(), itemTransmogrifier->GetTemplate())) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: HandleTransmogrifyItems - Player (GUID: %u, name: %s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetGUIDLow(), player->GetName().c_str(), itemTransmogrified->GetEntry(), itemTransmogrifier->GetEntry()); return LANG_ERR_TRANSMOG_INVALID_ITEMS; } if (!no_cost) { cost = GetSpecialPrice(itemTransmogrified->GetTemplate()); cost *= GetScaledCostModifier(); cost += GetCopperCost(); if (!player->HasEnoughMoney(cost)) return LANG_ERR_TRANSMOG_NOT_ENOUGH_MONEY; if (GetRequireToken()) { if (player->HasItemCount(GetTokenEntry(), GetTokenAmount())) player->DestroyItemCount(GetTokenEntry(), GetTokenAmount(), true); else return LANG_ERR_TRANSMOG_NOT_ENOUGH_TOKENS; } } // All okay, proceed // itemTransmogrified->SetEnchantment(TRANSMOGRIFY_ENCHANTMENT_SLOT, newEntry, 0, 0); // player->SetVisibleItemSlot(slot, itemTransmogrified); // Custom SetFakeEntry(player, itemTransmogrifier->GetEntry(), slot, itemTransmogrified); // newEntry itemTransmogrified->UpdatePlayedTime(player); itemTransmogrified->SetOwnerGUID(player->GetGUID()); itemTransmogrified->SetNotRefundable(player); itemTransmogrified->ClearSoulboundTradeable(player); if (itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_USE) itemTransmogrifier->SetBinding(true); itemTransmogrifier->SetOwnerGUID(player->GetGUID()); itemTransmogrifier->SetNotRefundable(player); itemTransmogrifier->ClearSoulboundTradeable(player); //cost += GetSpecialPrice(itemTransmogrified->GetTemplate()); //cost *= GetScaledCostModifier(); //cost += sT->GetCopperCost(); } // 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(-1*cost, false); return LANG_ERR_TRANSMOG_OK; }
TransmogTrinityStrings Transmogrification::Transmogrify(Player* player, ObjectGuid itemGUID, uint8 slot, bool no_cost) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify"); // slot of the transmogrified item if (slot >= EQUIPMENT_SLOT_END) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify - %s (%s) tried to transmogrify an %s with a wrong slot (%u) when transmogrifying items.", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemGUID.ToString().c_str(), slot); return LANG_ERR_TRANSMOG_INVALID_SLOT; } Item* itemTransmogrifier = NULL; // guid of the transmogrifier item, if it's not 0 if (!itemGUID.IsEmpty()) { itemTransmogrifier = player->GetItemByGuid(itemGUID); if (!itemTransmogrifier) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify - %s (%s) tried to transmogrify with an invalid %s.", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemGUID.ToString().c_str()); return LANG_ERR_TRANSMOG_MISSING_SRC_ITEM; } } // transmogrified item Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (!itemTransmogrified) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify - %s (%s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetName().c_str(), player->GetGUID().ToString().c_str(), slot); return LANG_ERR_TRANSMOG_MISSING_DEST_ITEM; } if (!itemTransmogrifier) // reset look newEntry { DeleteFakeEntry(player, itemTransmogrified); } else { if (!CanTransmogrifyItemWithItem(player, itemTransmogrified->GetTemplate(), itemTransmogrifier->GetTemplate())) { TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify - %s (%s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemTransmogrified->GetEntry(), itemTransmogrifier->GetEntry()); return LANG_ERR_TRANSMOG_INVALID_ITEMS; } if (!no_cost) { if (RequireToken) { if (player->HasItemCount(TokenEntry, TokenAmount)) player->DestroyItemCount(TokenEntry, TokenAmount, true); else return LANG_ERR_TRANSMOG_NOT_ENOUGH_TOKENS; } int32 cost = 0; cost = GetSpecialPrice(itemTransmogrified->GetTemplate()); cost *= ScaledCostModifier; cost += CopperCost; if (cost) // 0 cost if reverting look { if (cost < 0) TC_LOG_DEBUG("custom.transmog", "Transmogrification::Transmogrify - %s (%s) transmogrification invalid cost (non negative, amount %i). Transmogrified %u with %u", player->GetName().c_str(), player->GetGUID().ToString().c_str(), -cost, itemTransmogrified->GetEntry(), itemTransmogrifier->GetEntry()); else { if (!player->HasEnoughMoney(cost)) return LANG_ERR_TRANSMOG_NOT_ENOUGH_MONEY; player->ModifyMoney(-cost, false); } } } SetFakeEntry(player, itemTransmogrified, itemTransmogrifier->GetEntry()); itemTransmogrified->UpdatePlayedTime(player); itemTransmogrified->SetOwnerGUID(player->GetGUID()); itemTransmogrified->SetNotRefundable(player); itemTransmogrified->ClearSoulboundTradeable(player); if (itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_USE) itemTransmogrifier->SetBinding(true); itemTransmogrifier->SetOwnerGUID(player->GetGUID()); itemTransmogrifier->SetNotRefundable(player); itemTransmogrifier->ClearSoulboundTradeable(player); } return LANG_ERR_TRANSMOG_OK; }
void TransmogDisplayVendorMgr::HandleTransmogrify(Player* player, Creature* /*creature*/, uint32 vendorslot, uint32 itemEntry, bool no_cost) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify"); SelectionStore::Selection selection; if (!selectionStore.GetSelection(player->GetGUID().GetCounter(), selection)) return; // cheat, no slot selected const char* slotname = TransmogDisplayVendorMgr::getSlotName(selection.slot, player->GetSession()); if (!slotname) return; uint8 slot = selection.slot; // slot of the transmogrified item if (slot >= EQUIPMENT_SLOT_END) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify - %s (%s) tried to transmogrify item %u with a wrong slot (%u) when transmogrifying items.", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemEntry, slot); return; // LANG_ERR_TRANSMOG_INVALID_SLOT } const ItemTemplate* itemTransmogrifier = NULL; // guid of the transmogrifier item, if it's not 0 if (itemEntry) { itemTransmogrifier = sObjectMgr->GetItemTemplate(itemEntry); if (!itemTransmogrifier) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify - %s (%s) tried to transmogrify with an invalid item entry %u.", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemEntry); return; // LANG_ERR_TRANSMOG_MISSING_SRC_ITEM } } // transmogrified item Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (!itemTransmogrified) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify - %s (%s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetName().c_str(), player->GetGUID().ToString().c_str(), slot); player->GetSession()->SendNotification("No item in %s slot", slotname); return; // LANG_ERR_TRANSMOG_MISSING_DEST_ITEM } if (!itemTransmogrifier) // reset look newEntry { DeleteFakeEntry(player, itemTransmogrified); } else { if (!CanTransmogrifyItemWithItem(player, itemTransmogrified->GetTemplate(), itemTransmogrifier)) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify - %s (%s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetName().c_str(), player->GetGUID().ToString().c_str(), itemTransmogrified->GetEntry(), itemTransmogrifier->ItemId); player->GetSession()->SendNotification("Equipped item is not suitable for selected transmogrification"); return; // LANG_ERR_TRANSMOG_INVALID_ITEMS } if (uint32 fakeEntry = GetFakeEntry(itemTransmogrified)) { if (const ItemTemplate* fakeItemTemplate = sObjectMgr->GetItemTemplate(fakeEntry)) { if (fakeItemTemplate->DisplayInfoID == itemTransmogrifier->DisplayInfoID) { player->GetSession()->SendNotification("%s already transmogrified with %s", slotname, getItemName(itemTransmogrifier, player->GetSession()).c_str()); return; } } } // {{entry}, {entry}, ...} std::list<uint32> L; uint32 counter = 0; bool over = false; if (itemTransmogrified->GetTemplate()->Class != ITEM_CLASS_WEAPON && TransmogDisplayVendorMgr::AllowMixedArmorTypes) { for (uint32 i = 0; i < MAX_ITEM_SUBCLASS_ARMOR; ++i) { const EntryVector* oM = optionMap[MAX_ITEM_SUBCLASS_WEAPON + i][getCorrectInvType(itemTransmogrified->GetTemplate()->InventoryType)][selection.quality]; if (!oM) continue; if (!over && counter + oM->size() < selection.offset) { counter += oM->size(); } else { over = true; L.insert(L.end(), oM->begin(), oM->end()); } } } else if (itemTransmogrified->GetTemplate()->Class == ITEM_CLASS_WEAPON && TransmogDisplayVendorMgr::AllowMixedWeaponTypes) { for (uint32 i = 0; i < MAX_ITEM_SUBCLASS_WEAPON; ++i) { const EntryVector* oM = optionMap[i][getCorrectInvType(itemTransmogrified->GetTemplate()->InventoryType)][selection.quality]; if (!oM) continue; if (!over && counter + oM->size() < selection.offset) { counter += oM->size(); } else { over = true; L.insert(L.end(), oM->begin(), oM->end()); } } } else { const EntryVector* oM = optionMap[(itemTransmogrified->GetTemplate()->Class != ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0) + itemTransmogrified->GetTemplate()->SubClass][getCorrectInvType(itemTransmogrified->GetTemplate()->InventoryType)][selection.quality]; if (oM) { if (!over && counter + oM->size() < selection.offset) { counter += oM->size(); } else { over = true; L.insert(L.end(), oM->begin(), oM->end()); } } } std::list<uint32>::const_iterator it = L.begin(); std::advance(it, (selection.offset - counter) + vendorslot); if (it == L.end() || (*it) != itemEntry) { player->GetSession()->SendNotification("Equipped item is not suitable for selected transmogrification"); return; // either cheat or changed items (not found in correct place in transmog vendor view) } if (!no_cost) { if (RequireToken) { if (player->HasItemCount(TokenEntry, TokenAmount)) { player->DestroyItemCount(TokenEntry, TokenAmount, true); } else { player->GetSession()->SendNotification("You do not have enough %ss", getItemName(sObjectMgr->GetItemTemplate(TransmogDisplayVendorMgr::TokenEntry), player->GetSession()).c_str()); return; // LANG_ERR_TRANSMOG_NOT_ENOUGH_TOKENS } } int32 cost = 0; cost = GetSpecialPrice(itemTransmogrified->GetTemplate()); cost *= ScaledCostModifier; cost += CopperCost; if (cost) // 0 cost if reverting look { if (cost < 0) { TC_LOG_DEBUG("custom.transmog", "TransmogDisplayVendorMgr::HandleTransmogrify - %s (%s) transmogrification invalid cost (non negative, amount %i). Transmogrified %u with %u", player->GetName().c_str(), player->GetGUID().ToString().c_str(), -cost, itemTransmogrified->GetEntry(), itemTransmogrifier->ItemId); } else { if (!player->HasEnoughMoney(cost)) { player->GetSession()->SendNotification("You do not have enough money"); return; // LANG_ERR_TRANSMOG_NOT_ENOUGH_MONEY } player->ModifyMoney(-cost, false); } } SetFakeEntry(player, itemTransmogrified, itemTransmogrifier->ItemId); itemTransmogrified->UpdatePlayedTime(player); itemTransmogrified->SetOwnerGUID(player->GetGUID()); itemTransmogrified->SetNotRefundable(player); itemTransmogrified->ClearSoulboundTradeable(player); //if (itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || itemTransmogrifier->GetTemplate()->Bonding == BIND_WHEN_USE) // itemTransmogrifier->SetBinding(true); //itemTransmogrifier->SetOwnerGUID(player->GetGUID()); //itemTransmogrifier->SetNotRefundable(player); //itemTransmogrifier->ClearSoulboundTradeable(player); } player->PlayDirectSound(3337); player->GetSession()->SendAreaTriggerMessage("%s transmogrified", slotname); //return LANG_ERR_TRANSMOG_OK; } }