TooltipData ItemManager::getShortTooltip(ItemStack stack) { std::stringstream ss; TooltipData tip; if (stack.empty()) return tip; // name if (stack.quantity > 1) { ss << stack.quantity << " " << getItemName(stack.item); } else { ss << getItemName(stack.item); } tip.addColoredText(ss.str(), getItemColor(stack.item)); return tip; }
void UseCaseItem::initializeItemDialog() { UseCaseItemDialog *itemDialog = new UseCaseItemDialog(getItemName()); connect(itemDialog, SIGNAL(sendNewItemName(QString)), this, SLOT(setItemName(QString))); itemDialog->show(); itemDialog->raise(); itemDialog->activateWindow(); }
static int default_update(void) { switch(menu[item].type) { case TYPE_CMD: getItemCmd(menu[item].msg); __cprint(menu[item].y,menu[item].x,popwidth,0x17,expand(ItemName)); default: __cprint(menu[item].y,menu[item].x,popwidth,0x17,expand(getItemName(menu[item].msg)));break; } return 1; }
vector<string> Inventory::getAllItems() { std::vector<string> availableItems; for (int i = 0; i < TOTALSPACE; ++i) { if (items[i] != ItemType::NOITEM) { availableItems.push_back(getItemName(items[i])); } } return availableItems; }
static int edit_update(void) { if(item>0 && item<=envs_local) { __cprint(menu[item].y,menu[item].x,popwidth,0x17,envp_local[item-1]); } else if(item>envs_local && item<items_edit) { char *p; p=strchr(menu[item].msg,'='); *p=0; __cprint(menu[item].y,menu[item].x,popwidth,0x17,expand(menu[item].msg)); *p='='; } else __cprint(menu[item].y,menu[item].x,popwidth,0x17,expand(getItemName(menu[item].msg))); return 1; }
void ProgressData::callEvent() { if (eventHandler==NULL || !sendEvents) return; ItemState a; a.name=getItemName(lastChangedItem); a.currentAction=getItemCurrentAction(lastChangedItem); a.progress=10000.0f*(getItemProgress(lastChangedItem)/getItemProgressMaximum(lastChangedItem))/100; a.totalProgress=10000.0f*(getTotalProgress()/getTotalProgressMax())/100; a.itemOrder = getItemOrder(lastChangedItem); int64_t totalMem = 0; for (size_t i=0; i<itemName.size(); ++i) { totalMem += itemName[i].size(); } for (size_t i=0; i<itemCurrentAction.size(); ++i) { totalMem += itemCurrentAction[i].size(); } // This stuff is useful for debug: counts and shows events eventCounter++; //fprintf(stderr, "[%d] callEvent: %s, queue size: %Ld, total mem: %Ld (%s)\n", eventCounter, a.currentAction.c_str(), itemName.size(), totalMem, humanizeSize(totalMem).c_str()); //fprintf(stderr, "[%d] callEvent: %s/%s, progress: %d, totalProgress: %d, max: %f\n", eventCounter, a.name.c_str(), a.currentAction.c_str(), a.progress, a.totalProgress, getTotalProgressMax()); (*eventHandler) (a); }
static int default_update1(void) { char *str=myline; char *cmd; switch(menu[item].type) { case TYPE_CMD: cmd=getItemCmd(menu[item].msg); __cprint(menu[item].y,menu[item].x,popwidth,0x70,expand(ItemName)); if(ischoice(menu[item].msg)) { int i; str=myline; for(i=1;i<=9;i++) { cmd=getchoice(menu[item].msg,i); if(!cmd)break; getItemCmd(cmd); str +=sprintf(str,"%d:%s ",i,expand(ItemName)); } str=myline; __cprint(INFO_Y,0,INFO_W,0x70,str); } else { cmd=getItemCmd(cmd); __cprint(INFO_Y,0,INFO_W,0x70,expand(ItemName)); } break; default: __cprint(menu[item].y,menu[item].x,popwidth,0x70,expand(getItemName(menu[item].msg))); __cprint(INFO_Y,0,INFO_W,0x70,0); break; } return 1; }
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; } }
bool Item::operator==(Item& i){ return (getItemName()==i.getItemName()); }
/** * Create detailed tooltip showing all relevant item info */ TooltipData ItemManager::getTooltip(ItemStack stack, StatBlock *stats, int context) { TooltipData tip; if (stack.empty()) return tip; Color color = getItemColor(stack.item); // name std::stringstream ss; if (stack.quantity == 1) ss << getItemName(stack.item); else ss << getItemName(stack.item) << " (" << stack.quantity << ")"; tip.addColoredText(ss.str(), color); // quest item if (items[stack.item].quest_item) { tip.addColoredText(msg->get("Quest Item"), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } // only show the name of the currency item if (stack.item == eset->misc.currency_id) return tip; // flavor text if (items[stack.item].flavor != "") { tip.addColoredText(Utils::substituteVarsInString(items[stack.item].flavor, pc), font->getColor(FontEngine::COLOR_ITEM_FLAVOR)); } // level if (items[stack.item].level != 0) { tip.addText(msg->get("Level %d", items[stack.item].level)); } // type if (items[stack.item].type != "") { tip.addText(msg->get(getItemType(items[stack.item].type))); } // item quality text for colorblind users if (settings->colorblind && items[stack.item].quality != "") { color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); for (size_t i=0; i<item_qualities.size(); ++i) { if (item_qualities[i].id == items[stack.item].quality) { tip.addColoredText(msg->get("Quality: %s", msg->get(item_qualities[i].name)), color); break; } } } // damage for (size_t i = 0; i < eset->damage_types.list.size(); ++i) { if (items[stack.item].dmg_max[i] > 0) { std::stringstream dmg_str; dmg_str << eset->damage_types.list[i].name; if (items[stack.item].dmg_min[i] < items[stack.item].dmg_max[i]) { dmg_str << ": " << items[stack.item].dmg_min[i] << "-" << items[stack.item].dmg_max[i]; tip.addText(dmg_str.str()); } else { dmg_str << ": " << items[stack.item].dmg_max[i]; tip.addText(dmg_str.str()); } } } // absorb if (items[stack.item].abs_max > 0) { if (items[stack.item].abs_min < items[stack.item].abs_max) tip.addText(msg->get("Absorb: %d-%d", items[stack.item].abs_min, items[stack.item].abs_max)); else tip.addText(msg->get("Absorb: %d", items[stack.item].abs_max)); } // bonuses unsigned bonus_counter = 0; while (bonus_counter < items[stack.item].bonus.size()) { ss.str(""); BonusData* bdata = &items[stack.item].bonus[bonus_counter]; if (bdata->is_speed || bdata->is_attack_speed) { if (bdata->value >= 100) color = font->getColor(FontEngine::COLOR_ITEM_BONUS); else color = font->getColor(FontEngine::COLOR_ITEM_PENALTY); } else { if (bdata->value > 0) color = font->getColor(FontEngine::COLOR_ITEM_BONUS); else color = font->getColor(FontEngine::COLOR_ITEM_PENALTY); } getBonusString(ss, bdata); tip.addColoredText(ss.str(), color); bonus_counter++; } // power if (items[stack.item].power_desc != "") { tip.addColoredText(items[stack.item].power_desc, font->getColor(FontEngine::COLOR_ITEM_BONUS)); } // level requirement if (items[stack.item].requires_level > 0) { if (stats->level < items[stack.item].requires_level) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires Level %d", items[stack.item].requires_level), color); } // base stat requirement for (unsigned i=0; i<items[stack.item].req_stat.size(); ++i) { if (items[stack.item].req_val[i] > 0) { if (stats->get_primary(items[stack.item].req_stat[i]) < items[stack.item].req_val[i]) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires %s %d", eset->primary_stats.list[items[stack.item].req_stat[i]].name, items[stack.item].req_val[i]), color); } } // requires class if (items[stack.item].requires_class != "") { if (items[stack.item].requires_class != stats->character_class) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); tip.addColoredText(msg->get("Requires Class: %s", msg->get(items[stack.item].requires_class)), color); } // buy or sell price if (items[stack.item].getPrice() > 0 && stack.item != eset->misc.currency_id) { int price_per_unit; if (context == VENDOR_BUY) { price_per_unit = items[stack.item].getPrice(); if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); else tip.addColoredText(msg->get("Buy Price: %d %s each", price_per_unit, eset->loot.currency), color); } else if (context == VENDOR_SELL) { price_per_unit = items[stack.item].getSellPrice(stack.can_buyback); if (stats->currency < price_per_unit) color = font->getColor(FontEngine::COLOR_REQUIREMENTS_NOT_MET); else color = font->getColor(FontEngine::COLOR_WIDGET_NORMAL); if (items[stack.item].max_quantity <= 1) tip.addColoredText(msg->get("Buy Price: %d %s", price_per_unit, eset->loot.currency), color); else tip.addColoredText(msg->get("Buy Price: %d %s each", price_per_unit, eset->loot.currency), color); } else if (context == PLAYER_INV) { price_per_unit = items[stack.item].getSellPrice(DEFAULT_SELL_PRICE); if (price_per_unit == 0) price_per_unit = 1; if (items[stack.item].max_quantity <= 1) tip.addText(msg->get("Sell Price: %d %s", price_per_unit, eset->loot.currency)); else tip.addText(msg->get("Sell Price: %d %s each", price_per_unit, eset->loot.currency)); } } if (items[stack.item].set > 0) { // item set bonuses ItemSet set = item_sets[items[stack.item].set]; bonus_counter = 0; tip.addColoredText("\n" + msg->get("Set:") + ' ' + msg->get(item_sets[items[stack.item].set].name), set.color); while (bonus_counter < set.bonus.size()) { ss.str(""); SetBonusData* bdata = &set.bonus[bonus_counter]; ss << msg->get("%d items:", bdata->requirement) << ' '; getBonusString(ss, bdata); tip.addColoredText(ss.str(), set.color); bonus_counter++; } } // input hint for consumables/books // TODO hint when not using mouse control. The action for using an item there is hard to describe if (context == PLAYER_INV && !settings->no_mouse) { int power_id = items[stack.item].power; if (power_id > 0 && items[stack.item].type == "consumable") { tip.addColoredText('\n' + msg->get("Press [%s] to use", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } else if (!items[stack.item].book.empty()) { tip.addColoredText('\n' + msg->get("Press [%s] to read", inpt->getBindingString(Input::MAIN2)), font->getColor(FontEngine::COLOR_ITEM_BONUS)); } } return tip; }
bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) { WorldSession* session = player->GetSession(); player->PlayerTalkClass->ClearMenus(); switch(sender) { case SENDER_SELECT_VENDOR: // action = slot { Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action); if (!item) { if (const char* slotname = getSlotName(action)) session->SendNotification("No item equipped in %s slot", slotname); OnGossipHello(player, creature); return true; } const ItemTemplate * itemTemplate = item->GetTemplate(); optionData* oM = &optionMap[(itemTemplate->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+itemTemplate->SubClass][getCorrectInvType(itemTemplate->InventoryType)]; if (!oM->size()) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); OnGossipHello(player, creature); return true; } player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, (std::string)"Update selected; "+getItemName(itemTemplate, session), sender, action); for(optionData::iterator it = oM->begin(); it != oM->end(); ++it) { if (!TransmogDisplayVendorMgr::AllowedQuality(it->first)) // skip not allowed qualities continue; for(uint32 count = 0; count*MAX_VENDOR_ITEMS < it->second.size(); ++count) { std::ostringstream ss; ss << getQualityName(it->first); if (count) ss << " [" << count << "]"; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, ss.str().c_str(), it->first, count*MAX_VENDOR_ITEMS); } } if (player->PlayerTalkClass->GetGossipMenu().GetMenuItemCount() <= 1) { if (const char* slotname = getSlotName(action)) session->SendNotification("No transmogrifications available for %s", slotname); player->PlayerTalkClass->ClearMenus(); OnGossipHello(player, creature); return true; } selDataStruct temp = {action, 0, 0}; // slot, offset, quality selData[player->GetGUIDLow()] = temp; player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; case SENDER_BACK: // Back { OnGossipHello(player, creature); } break; case SENDER_REMOVE_ALL: // Remove TransmogDisplayVendorMgrs { bool removed = false; for (uint8 Slot = EQUIPMENT_SLOT_START; Slot < EQUIPMENT_SLOT_END; Slot++) { if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, Slot)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem) && !removed) removed = true; } } if (removed) { session->SendAreaTriggerMessage("Transmogrifications removed from equipped items"); player->PlayDirectSound(3337); } else session->SendNotification("You have no transmogrified items equipped"); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_ONE: // Remove TransmogDisplayVendorMgr from single item { const char* slotname = getSlotName(action); if (Item* newItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, action)) { if (TransmogDisplayVendorMgr::DeleteFakeEntry(newItem)) { if (slotname) session->SendAreaTriggerMessage("%s transmogrification removed", slotname); player->PlayDirectSound(3337); } else if (slotname) session->SendNotification("No transmogrification on %s slot", slotname); } else if (slotname) session->SendNotification("No item equipped in %s slot", slotname); OnGossipSelect(player, creature, SENDER_REMOVE_MENU, 0); } break; case SENDER_REMOVE_MENU: { for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) { const char* slotname = getSlotName(slot); if (!slotname) continue; std::ostringstream ss; ss << "Remove transmogrification from " << slotname << "?"; player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, (std::string)"Remove from "+slotname, SENDER_REMOVE_ONE, slot, ss.str().c_str(), 0, false); } player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "Remove all transmogrifications", SENDER_REMOVE_ALL, 0, "Are you sure you want to remove all transmogrifications?", 0, false); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Back..", SENDER_BACK, 0); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } break; default: // Show items you can use { if (sender >= MAX_ITEM_QUALITY) // sender = quality, action = iterator return false; // cheat if (selData.find(player->GetGUIDLow()) == selData.end()) return false; // cheat if (selData[player->GetGUIDLow()].offset != 0 || selData[player->GetGUIDLow()].quality != 0) return false; // cheat (something is off) selData[player->GetGUIDLow()].offset = action; selData[player->GetGUIDLow()].quality = sender; uint32 slot = selData[player->GetGUIDLow()].slot; // slot if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { if (!TransmogDisplayVendorMgr::AllowedQuality(item->GetTemplate()->Quality)) { session->SendNotification("Equipped item has wrong quality"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } optionDataList oM = optionMap[(item->GetTemplate()->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+item->GetTemplate()->SubClass][getCorrectInvType(item->GetTemplate()->InventoryType)][sender]; uint32 itemCount = (oM.size()-action); if (itemCount > MAX_VENDOR_ITEMS) itemCount = MAX_VENDOR_ITEMS; if (!itemCount) { session->SendAreaTriggerMessage("No items found"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } player->CLOSE_GOSSIP_MENU(); TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_LIST_INVENTORY"); Creature* vendor = player->GetNPCIfCanInteractWith(creature->GetGUID(), UNIT_NPC_FLAG_VENDOR); if (!vendor) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: SendListInventory - Unit (GUID: %u) not found or you can not interact with him.", creature->GetGUIDLow()); player->SendSellError(SELL_ERR_CANT_FIND_VENDOR, NULL, 0, 0); return true; } if (player->HasUnitState(UNIT_STATE_DIED)) player->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (vendor->HasUnitState(UNIT_STATE_MOVING)) vendor->StopMoving(); uint8 count = 0; WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + itemCount * 8 * 4); data << uint64(creature->GetGUID()); size_t countPos = data.wpos(); data << uint8(count); bool added = false; optionDataList::iterator it = oM.begin(); std::advance(it, action); for (; it != oM.end() && count < itemCount; ++it, ++count) { if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(*it)) { data << uint32(count + 1); data << uint32(itemTemplate->ItemId); data << uint32(itemTemplate->DisplayInfoID); data << int32(0xFFFFFFFF); data << uint32(0); data << uint32(itemTemplate->MaxDurability); data << uint32(itemTemplate->BuyCount); data << uint32(0); added = true; } } if (!added) { data << uint8(0); session->SendPacket(&data); } else { data.put<uint8>(countPos, count); session->SendPacket(&data); } } else { session->SendNotification("No item equipped"); OnGossipSelect(player, creature, SENDER_SELECT_VENDOR, slot); return true; } } break; } return true; }
void TransmogDisplayVendorMgr::HandleTransmogrify(Player* player, Creature* creature, uint32 vendorslot, uint32 itemEntry) { selDataType::iterator data = selData.find(player->GetGUIDLow()); if (data == selData.end()) return; // cheat, no slot selected const char* slotname = getSlotName(data->second.slot); if (!slotname) return; WorldSession* session = player->GetSession(); Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, data->second.slot); if (!item) { session->SendNotification("Equipment slot is empty"); return; } if (item->GetOwnerGUID() != player->GetGUID()) return; ItemTemplate const * srcTemplate = sObjectMgr->GetItemTemplate(itemEntry); ItemTemplate const * tarTemplate = item->GetTemplate(); optionDataList oM = optionMap[(tarTemplate->Class == ITEM_CLASS_WEAPON ? MAX_ITEM_SUBCLASS_WEAPON : 0)+tarTemplate->SubClass][getCorrectInvType(tarTemplate->InventoryType)][data->second.quality]; optionDataList::iterator it = oM.begin(); std::advance(it, data->second.offset + vendorslot); if (it == oM.end() || (*it) != itemEntry) { session->SendNotification("Items do not match"); return; // either cheat or changed items (not found in correct place in transmog vendor view) } if (!TransmogDisplayVendorMgr::CanTransmogrify(tarTemplate, srcTemplate)) { session->SendNotification("Items do not match"); return; } if (uint32 fakeEntry = GetFakeEntry(item->GetGUIDLow())) { if (const ItemTemplate* fakeItemTemplate = sObjectMgr->GetItemTemplate(fakeEntry)) { if (fakeItemTemplate->DisplayInfoID == srcTemplate->DisplayInfoID) { session->SendAreaTriggerMessage("%s already transmogrified with %s", slotname, getItemName(tarTemplate, session).c_str()); return; } } } if (TransmogDisplayVendorMgr::RequireToken && player->GetItemCount(TransmogDisplayVendorMgr::TokenEntry) < TransmogDisplayVendorMgr::TokenAmount) { session->SendNotification("You don't have enough %ss", getItemName(sObjectMgr->GetItemTemplate(TransmogDisplayVendorMgr::TokenEntry), session).c_str()); return; } int32 price = 0; if (TransmogDisplayVendorMgr::RequireGold) price = getFakePrice(tarTemplate); if (player->HasEnoughMoney(price)) player->ModifyMoney(-price); else { session->SendNotification("You don't have enough money"); return; } if (TransmogDisplayVendorMgr::RequireToken) player->DestroyItemCount(TransmogDisplayVendorMgr::TokenEntry, TransmogDisplayVendorMgr::TokenAmount, true); TransmogDisplayVendorMgr::SetFakeEntry(item, itemEntry); player->PlayDirectSound(3337); session->SendAreaTriggerMessage("%s transmogrified", slotname); }
/** * Create detailed tooltip showing all relevant item info */ TooltipData ItemManager::getTooltip(ItemStack stack, StatBlock *stats, int context) { TooltipData tip; if (stack.empty()) return tip; Color color = getItemColor(stack.item); // name std::stringstream ss; if (stack.quantity == 1) ss << getItemName(stack.item); else ss << getItemName(stack.item) << " (" << stack.quantity << ")"; tip.addText(ss.str(), color); // quest item if (items[stack.item].quest_item) { tip.addText(msg->get("Quest Item"), color_bonus); } // only show the name of the currency item if (stack.item == CURRENCY_ID) return tip; // flavor text if (items[stack.item].flavor != "") { tip.addText(substituteVarsInString(items[stack.item].flavor, pc), color_flavor); } // level if (items[stack.item].level != 0) { tip.addText(msg->get("Level %d", items[stack.item].level)); } // type if (items[stack.item].type != "") { tip.addText(msg->get(getItemType(items[stack.item].type))); } // item quality text for colorblind users if (COLORBLIND && items[stack.item].quality != "") { color = color_normal; for (size_t i=0; i<item_qualities.size(); ++i) { if (item_qualities[i].id == items[stack.item].quality) { tip.addText(msg->get("Quality: %s", msg->get(item_qualities[i].name)), color); break; } } } // damage if (items[stack.item].dmg_melee_max > 0) { if (items[stack.item].dmg_melee_min < items[stack.item].dmg_melee_max) tip.addText(msg->get("Melee damage: %d-%d", items[stack.item].dmg_melee_min, items[stack.item].dmg_melee_max)); else tip.addText(msg->get("Melee damage: %d", items[stack.item].dmg_melee_max)); } if (items[stack.item].dmg_ranged_max > 0) { if (items[stack.item].dmg_ranged_min < items[stack.item].dmg_ranged_max) tip.addText(msg->get("Ranged damage: %d-%d", items[stack.item].dmg_ranged_min, items[stack.item].dmg_ranged_max)); else tip.addText(msg->get("Ranged damage: %d", items[stack.item].dmg_ranged_max)); } if (items[stack.item].dmg_ment_max > 0) { if (items[stack.item].dmg_ment_min < items[stack.item].dmg_ment_max) tip.addText(msg->get("Mental damage: %d-%d", items[stack.item].dmg_ment_min, items[stack.item].dmg_ment_max)); else tip.addText(msg->get("Mental damage: %d", items[stack.item].dmg_ment_max)); } // absorb if (items[stack.item].abs_max > 0) { if (items[stack.item].abs_min < items[stack.item].abs_max) tip.addText(msg->get("Absorb: %d-%d", items[stack.item].abs_min, items[stack.item].abs_max)); else tip.addText(msg->get("Absorb: %d", items[stack.item].abs_max)); } // bonuses unsigned bonus_counter = 0; while (bonus_counter < items[stack.item].bonus.size()) { ss.str(""); BonusData* bdata = &items[stack.item].bonus[bonus_counter]; if (bdata->is_speed) { ss << msg->get("%d%% Speed", bdata->value); if (bdata->value >= 100) color = color_bonus; else color = color_penalty; } else { if (bdata->value > 0) { color = color_bonus; } else { color = color_penalty; } getBonusString(ss, bdata); } tip.addText(ss.str(), color); bonus_counter++; } // power if (items[stack.item].power_desc != "") { tip.addText(items[stack.item].power_desc, color_bonus); } // level requirement if (items[stack.item].requires_level > 0) { if (stats->level < items[stack.item].requires_level) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Level %d", items[stack.item].requires_level), color); } // base stat requirement for (unsigned i=0; i<items[stack.item].req_stat.size(); ++i) { if (items[stack.item].req_val[i] > 0) { if (items[stack.item].req_stat[i] == REQUIRES_PHYS) { if (stats->get_physical() < items[stack.item].req_val[i]) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Physical %d", items[stack.item].req_val[i]), color); } else if (items[stack.item].req_stat[i] == REQUIRES_MENT) { if (stats->get_mental() < items[stack.item].req_val[i]) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Mental %d", items[stack.item].req_val[i]), color); } else if (items[stack.item].req_stat[i] == REQUIRES_OFF) { if (stats->get_offense() < items[stack.item].req_val[i]) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Offense %d", items[stack.item].req_val[i]), color); } else if (items[stack.item].req_stat[i] == REQUIRES_DEF) { if (stats->get_defense() < items[stack.item].req_val[i]) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Defense %d", items[stack.item].req_val[i]), color); } } } // requires class if (items[stack.item].requires_class != "") { if (items[stack.item].requires_class != stats->character_class) color = color_requirements_not_met; else color = color_normal; tip.addText(msg->get("Requires Class: %s", msg->get(items[stack.item].requires_class)), color); } // buy or sell price if (items[stack.item].getPrice() > 0 && stack.item != CURRENCY_ID) { int price_per_unit; if (context == VENDOR_BUY) { price_per_unit = items[stack.item].getPrice(); if (stats->currency < price_per_unit) color = color_requirements_not_met; else color = color_normal; if (items[stack.item].max_quantity <= 1) tip.addText(msg->get("Buy Price: %d %s", price_per_unit, CURRENCY), color); else tip.addText(msg->get("Buy Price: %d %s each", price_per_unit, CURRENCY), color); } else if (context == VENDOR_SELL) { price_per_unit = items[stack.item].getSellPrice(); if (stats->currency < price_per_unit) color = color_requirements_not_met; else color = color_normal; if (items[stack.item].max_quantity <= 1) tip.addText(msg->get("Buy Price: %d %s", price_per_unit, CURRENCY), color); else tip.addText(msg->get("Buy Price: %d %s each", price_per_unit, CURRENCY), color); } else if (context == PLAYER_INV) { price_per_unit = items[stack.item].getSellPrice(); if (price_per_unit == 0) price_per_unit = 1; if (items[stack.item].max_quantity <= 1) tip.addText(msg->get("Sell Price: %d %s", price_per_unit, CURRENCY)); else tip.addText(msg->get("Sell Price: %d %s each", price_per_unit, CURRENCY)); } } if (items[stack.item].set > 0) { // item set bonuses ItemSet set = item_sets[items[stack.item].set]; bonus_counter = 0; tip.addText("\n" + msg->get("Set: ") + msg->get(item_sets[items[stack.item].set].name), set.color); while (bonus_counter < set.bonus.size()) { ss.str(""); Set_bonus* bdata = &set.bonus[bonus_counter]; ss << msg->get("%d items: ", bdata->requirement); if (bdata->is_speed) { ss << msg->get("%d%% Speed", bdata->value); } else { getBonusString(ss, bdata); } tip.addText(ss.str(), set.color); bonus_counter++; } } return tip; }