#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()); }