bool LootStrategyAction::Execute(Event event) { string strategy = event.getParam(); LootObjectStack* lootItems = AI_VALUE(LootObjectStack*, "available loot"); set<uint32>& alwaysLootItems = AI_VALUE(set<uint32>&, "always loot list"); Value<LootStrategy>* lootStrategy = context->GetValue<LootStrategy>("loot strategy"); if (strategy == "?") { ostringstream out; out << "Loot strategy: "; out << LootStrategy2string(lootStrategy->Get()); out << ", always loot items: "; for (set<uint32>::iterator i = alwaysLootItems.begin(); i != alwaysLootItems.end(); i++) { ItemPrototype const *proto = sItemStorage.LookupEntry<ItemPrototype>(*i); if (!proto) continue; out << chat->formatItem(proto); } ai->TellMaster(out); } else { ItemIds items = chat->parseItems(strategy); if (items.size() == 0) { lootStrategy->Set(String2LootStrategy(strategy)); ostringstream out; out << "Loot strategy set to " << LootStrategy2string(lootStrategy->Get()); ai->TellMaster(out); return true; } bool remove = strategy.size() > 1 && strategy.substr(0, 1) == "-"; for (ItemIds::iterator i = items.begin(); i != items.end(); i++) { uint32 itemid = *i; if (remove) { set<uint32>::iterator j = alwaysLootItems.find(itemid); if (j != alwaysLootItems.end()) alwaysLootItems.erase(j); ai->TellMaster("Item(s) removed from always loot list"); } else { alwaysLootItems.insert(itemid); ai->TellMaster("Item(s) added to always loot list"); } } } return true; }
bool UnequipAction::Execute(Event event) { string text = event.getParam(); ItemIds ids = chat->parseItems(text); for (ItemIds::iterator i =ids.begin(); i != ids.end(); i++) { FindItemByIdVisitor visitor(*i); UnequipItem(&visitor); } return true; }
bool BuyAction::Execute(Event event) { string link = event.getParam(); ItemIds itemIds = chat->parseItems(link); if (itemIds.empty()) return false; Player* master = GetMaster(); if (!master) return false; Unit* vendor = master->GetSelectedUnit(); if (!vendor) return false; Creature *pCreature = bot->GetNPCIfCanInteractWith(vendor->GetGUID(), UNIT_NPC_FLAG_VENDOR); if (!pCreature) { ai->TellMaster("Cannot talk to vendor"); return false; } VendorItemData const* tItems = pCreature->GetVendorItems(); if (!tItems) { ai->TellMaster("This vendor has no items"); return false; } for (ItemIds::iterator i = itemIds.begin(); i != itemIds.end(); i++) { for (uint32 slot = 0; slot < tItems->GetItemCount(); slot++) { if (tItems->GetItem(slot)->item == *i) { bot->BuyItemFromVendorSlot(vendor->GetGUID(), slot, *i, 1, NULL_BAG, NULL_SLOT); ai->TellMaster("Bought item"); } } } return true; }
ItemIds ChatHelper::parseItems(string& text) { ItemIds itemIds; uint8 pos = 0; while (true) { int i = text.find("Hitem:", pos); if (i == -1) break; pos = i + 6; int endPos = text.find(':', pos); if (endPos == -1) break; string idC = text.substr(pos, endPos - pos); uint32 id = atol(idC.c_str()); pos = endPos; if (id) itemIds.insert(id); } return itemIds; }
list<Item*> InventoryAction::parseItems(string text) { set<Item*> found; size_t pos = text.find(" "); int count = pos!=string::npos ? atoi(text.substr(pos + 1).c_str()) : TRADE_SLOT_TRADED_COUNT; if (count < 1) count = 1; else if (count > TRADE_SLOT_TRADED_COUNT) count = TRADE_SLOT_TRADED_COUNT; if (text == "food") { FindFoodVisitor visitor(bot, 11); IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } if (text == "drink") { FindFoodVisitor visitor(bot, 59); IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } if (text == "mana potion") { FindPotionVisitor visitor(bot, SPELL_EFFECT_ENERGIZE); IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } if (text == "healing potion") { FindPotionVisitor visitor(bot, SPELL_EFFECT_HEAL); IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } FindUsableNamedItemVisitor visitor(bot, text); IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); uint32 quality = chat->parseItemQuality(text); if (quality != MAX_ITEM_QUALITY) { FindItemsToTradeByQualityVisitor visitor(quality, count); IterateItems(&visitor); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } uint32 itemClass = MAX_ITEM_CLASS, itemSubClass = 0; if (chat->parseItemClass(text, &itemClass, &itemSubClass)) { FindItemsToTradeByClassVisitor visitor(itemClass, itemSubClass, count); IterateItems(&visitor); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } uint32 fromSlot = chat->parseSlot(text); if (fromSlot != EQUIPMENT_SLOT_END) { Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, fromSlot); if (item) found.insert(item); } ItemIds ids = chat->parseItems(text); for (ItemIds::iterator i = ids.begin(); i != ids.end(); i++) { FindItemByIdVisitor visitor(*i); IterateItems(&visitor, ITERATE_ALL_ITEMS); found.insert(visitor.GetResult().begin(), visitor.GetResult().end()); } list<Item*> result; for (set<Item*>::iterator i = found.begin(); i != found.end(); ++i) result.push_back(*i); result.sort(compare_items_by_level); return result; }