mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-13 09:07:19 +00:00
137 lines
3.3 KiB
C++
137 lines
3.3 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it
|
|
* and/or modify it under version 2 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#include "SellAction.h"
|
|
|
|
#include "Event.h"
|
|
#include "ItemUsageValue.h"
|
|
#include "ItemVisitors.h"
|
|
#include "Playerbots.h"
|
|
#include "ItemPackets.h"
|
|
|
|
class SellItemsVisitor : public IterateItemsVisitor
|
|
{
|
|
public:
|
|
SellItemsVisitor(SellAction* action) : IterateItemsVisitor(), action(action) {}
|
|
|
|
bool Visit(Item* item) override
|
|
{
|
|
action->Sell(item);
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
SellAction* action;
|
|
};
|
|
|
|
class SellGrayItemsVisitor : public SellItemsVisitor
|
|
{
|
|
public:
|
|
SellGrayItemsVisitor(SellAction* action) : SellItemsVisitor(action) {}
|
|
|
|
bool Visit(Item* item) override
|
|
{
|
|
if (item->GetTemplate()->Quality != ITEM_QUALITY_POOR)
|
|
return true;
|
|
|
|
return SellItemsVisitor::Visit(item);
|
|
}
|
|
};
|
|
|
|
class SellVendorItemsVisitor : public SellItemsVisitor
|
|
{
|
|
public:
|
|
SellVendorItemsVisitor(SellAction* action, AiObjectContext* con) : SellItemsVisitor(action) { context = con; }
|
|
|
|
AiObjectContext* context;
|
|
|
|
bool Visit(Item* item) override
|
|
{
|
|
ItemUsage usage = context->GetValue<ItemUsage>("item usage", item->GetEntry())->Get();
|
|
if (usage != ITEM_USAGE_VENDOR && usage != ITEM_USAGE_AH)
|
|
return true;
|
|
|
|
return SellItemsVisitor::Visit(item);
|
|
}
|
|
};
|
|
|
|
bool SellAction::Execute(Event event)
|
|
{
|
|
std::string const text = event.getParam();
|
|
if (text == "gray" || text == "*")
|
|
{
|
|
SellGrayItemsVisitor visitor(this);
|
|
IterateItems(&visitor);
|
|
return true;
|
|
}
|
|
|
|
if (text == "vendor")
|
|
{
|
|
SellVendorItemsVisitor visitor(this, context);
|
|
IterateItems(&visitor);
|
|
return true;
|
|
}
|
|
|
|
if (text != "")
|
|
{
|
|
std::vector<Item*> items = parseItems(text, ITERATE_ITEMS_IN_BAGS);
|
|
for (Item* item : items)
|
|
{
|
|
Sell(item);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
botAI->TellError("Usage: s gray/*/vendor/[item link]");
|
|
return false;
|
|
}
|
|
|
|
void SellAction::Sell(FindItemVisitor* visitor)
|
|
{
|
|
IterateItems(visitor);
|
|
std::vector<Item*> items = visitor->GetResult();
|
|
for (Item* item : items)
|
|
{
|
|
Sell(item);
|
|
}
|
|
}
|
|
|
|
void SellAction::Sell(Item* item)
|
|
{
|
|
std::ostringstream out;
|
|
|
|
GuidVector vendors = botAI->GetAiObjectContext()->GetValue<GuidVector>("nearest npcs")->Get();
|
|
|
|
for (ObjectGuid const vendorguid : vendors)
|
|
{
|
|
Creature* pCreature = bot->GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
|
|
if (!pCreature)
|
|
continue;
|
|
|
|
ObjectGuid itemguid = item->GetGUID();
|
|
uint32 count = item->GetCount();
|
|
|
|
uint32 botMoney = bot->GetMoney();
|
|
|
|
WorldPacket p(CMSG_SELL_ITEM);
|
|
p << vendorguid << itemguid << count;
|
|
|
|
WorldPackets::Item::SellItem nicePacket(std::move(p));
|
|
nicePacket.Read();
|
|
bot->GetSession()->HandleSellItemOpcode(nicePacket);
|
|
|
|
if (botAI->HasCheat(BotCheatMask::gold))
|
|
{
|
|
bot->SetMoney(botMoney);
|
|
}
|
|
|
|
out << "Selling " << chat->FormatItem(item->GetTemplate());
|
|
botAI->TellMaster(out);
|
|
|
|
bot->PlayDistanceSound(120);
|
|
break;
|
|
}
|
|
}
|