mirror of
https://github.com/mod-playerbots/mod-playerbots
synced 2025-11-29 15:58:20 +08:00
104 lines
3.1 KiB
C++
104 lines
3.1 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 "DestroyItemAction.h"
|
|
#include "Event.h"
|
|
#include "ItemCountValue.h"
|
|
#include "Playerbots.h"
|
|
|
|
bool DestroyItemAction::Execute(Event event)
|
|
{
|
|
std::string const text = event.getParam();
|
|
ItemIds ids = chat->parseItems(text);
|
|
|
|
for (ItemIds::iterator i = ids.begin(); i != ids.end(); i++)
|
|
{
|
|
FindItemByIdVisitor visitor(*i);
|
|
DestroyItem(&visitor);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void DestroyItemAction::DestroyItem(FindItemVisitor* visitor)
|
|
{
|
|
IterateItems(visitor);
|
|
std::vector<Item*> items = visitor->GetResult();
|
|
for (Item* item : items)
|
|
{
|
|
std::ostringstream out;
|
|
out << chat->FormatItem(item->GetTemplate()) << " destroyed";
|
|
botAI->TellMaster(out);
|
|
|
|
bot->DestroyItem(item->GetBagSlot(),item->GetSlot(), true);
|
|
}
|
|
}
|
|
|
|
bool SmartDestroyItemAction::isUseful()
|
|
{
|
|
return !botAI->HasActivePlayerMaster();
|
|
}
|
|
|
|
bool SmartDestroyItemAction::Execute(Event event)
|
|
{
|
|
uint8 bagSpace = AI_VALUE(uint8, "bag space");
|
|
|
|
if (bagSpace < 90)
|
|
return false;
|
|
|
|
// only destoy grey items if with real player/guild
|
|
if (botAI->HasRealPlayerMaster() && botAI->IsInRealGuild())
|
|
{
|
|
std::set<Item*> items;
|
|
FindItemsToTradeByQualityVisitor visitor(ITEM_QUALITY_POOR, 5);
|
|
IterateItems(&visitor, ITERATE_ITEMS_IN_BAGS);
|
|
items.insert(visitor.GetResult().begin(), visitor.GetResult().end());
|
|
|
|
for (auto& item : items)
|
|
{
|
|
FindItemByIdVisitor visitor(item->GetTemplate()->ItemId);
|
|
DestroyItem(&visitor);
|
|
|
|
bagSpace = AI_VALUE(uint8, "bag space");
|
|
|
|
if (bagSpace < 90)
|
|
return true;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::vector<uint32> bestToDestroy = { ITEM_USAGE_NONE }; //First destroy anything useless.
|
|
|
|
if (!AI_VALUE(bool, "can sell") && AI_VALUE(bool, "should get money")) // We need money so quest items are less important since they can't directly be sold.
|
|
bestToDestroy.push_back(ITEM_USAGE_QUEST);
|
|
else // We don't need money so destroy the cheapest stuff.
|
|
{
|
|
bestToDestroy.push_back(ITEM_USAGE_VENDOR);
|
|
bestToDestroy.push_back(ITEM_USAGE_AH);
|
|
}
|
|
|
|
// If we still need room
|
|
bestToDestroy.push_back(ITEM_USAGE_SKILL); // Items that might help tradeskill are more important than above but still expenable.
|
|
bestToDestroy.push_back(ITEM_USAGE_USE); // These are more likely to be usefull 'soon' but still expenable.
|
|
|
|
for (auto& usage : bestToDestroy)
|
|
{
|
|
std::vector<Item*> items = AI_VALUE2(std::vector<Item*>, "inventory items", "usage " + std::to_string(usage));
|
|
std::reverse(items.begin(), items.end());
|
|
|
|
for (auto& item : items)
|
|
{
|
|
FindItemByIdVisitor visitor(item->GetTemplate()->ItemId);
|
|
DestroyItem(&visitor);
|
|
|
|
bagSpace = AI_VALUE(uint8, "bag space");
|
|
|
|
if (bagSpace < 90)
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|