mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-13 17:09:08 +00:00
75 lines
1.8 KiB
C++
75 lines
1.8 KiB
C++
#include "OpenItemAction.h"
|
|
#include "PlayerbotAI.h"
|
|
#include "ItemTemplate.h"
|
|
#include "WorldPacket.h"
|
|
#include "Player.h"
|
|
#include "ObjectMgr.h"
|
|
|
|
bool OpenItemAction::Execute(Event event)
|
|
{
|
|
bool foundOpenable = false;
|
|
|
|
// Check main inventory slots
|
|
for (uint8 slot = EQUIPMENT_SLOT_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
|
|
{
|
|
Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
|
|
|
|
if (item && CanOpenItem(item))
|
|
{
|
|
OpenItem(item, INVENTORY_SLOT_BAG_0, slot);
|
|
foundOpenable = true;
|
|
}
|
|
}
|
|
|
|
// Check items in the bags
|
|
for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag)
|
|
{
|
|
Bag* bagItem = bot->GetBagByPos(bag);
|
|
if (!bagItem)
|
|
continue;
|
|
|
|
for (uint32 slot = 0; slot < bagItem->GetBagSize(); ++slot)
|
|
{
|
|
Item* item = bot->GetItemByPos(bag, slot);
|
|
|
|
if (item && CanOpenItem(item))
|
|
{
|
|
OpenItem(item, bag, slot);
|
|
foundOpenable = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If no openable items found
|
|
if (!foundOpenable)
|
|
{
|
|
botAI->TellError("No openable items in inventory.");
|
|
}
|
|
|
|
return foundOpenable;
|
|
}
|
|
|
|
bool OpenItemAction::CanOpenItem(Item* item)
|
|
{
|
|
if (!item)
|
|
return false;
|
|
|
|
ItemTemplate const* itemTemplate = item->GetTemplate();
|
|
if (!itemTemplate)
|
|
return false;
|
|
|
|
// Check if the item has the openable flag
|
|
return itemTemplate->Flags & ITEM_FLAG_HAS_LOOT;
|
|
}
|
|
|
|
void OpenItemAction::OpenItem(Item* item, uint8 bag, uint8 slot)
|
|
{
|
|
WorldPacket packet(CMSG_OPEN_ITEM);
|
|
packet << bag << slot;
|
|
bot->GetSession()->HandleOpenItemOpcode(packet);
|
|
|
|
std::ostringstream out;
|
|
out << "Opened item: " << item->GetTemplate()->Name1;
|
|
botAI->TellMaster(out.str());
|
|
}
|