/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "Chat.h" #include "CommandScript.h" #include "ObjectMgr.h" #include "Player.h" constexpr std::array itemQualityToString = { "poor", "normal", "uncommon", "rare", "epic", "legendary", "artifact", "all" }; using namespace Acore::ChatCommands; class bg_commandscript : public CommandScript { public: bg_commandscript() : CommandScript("bg_commandscript") { } ChatCommandTable GetCommands() const override { static ChatCommandTable commandTable = { { "bags clear", HandleBagsClearCommand, SEC_GAMEMASTER, Console::No }, }; return commandTable; } static bool HandleBagsClearCommand(ChatHandler* handler, std::string_view args) { if (args.empty()) { return false; } Player* player = handler->GetSession()->GetPlayer(); if (!player) { return false; } uint8 itemQuality = MAX_ITEM_QUALITY; for (uint8 i = ITEM_QUALITY_POOR; i < MAX_ITEM_QUALITY; ++i) { if (args == itemQualityToString[i]) { itemQuality = i; break; } } if (itemQuality == MAX_ITEM_QUALITY) { return false; } std::array removedItems = { }; // in inventory for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; ++i) { if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { if (ItemTemplate const* itemTemplate = item->GetTemplate()) { if (itemTemplate->Quality <= itemQuality) { player->DestroyItem(INVENTORY_SLOT_BAG_0, i, true); ++removedItems[itemTemplate->Quality]; } } } } // in inventory bags for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) { if (Bag* bag = player->GetBagByPos(i)) { for (uint32 j = 0; j < bag->GetBagSize(); j++) { if (Item* item = bag->GetItemByPos(j)) { if (ItemTemplate const* itemTemplate = item->GetTemplate()) { if (itemTemplate->Quality <= itemQuality) { player->DestroyItem(i, j, true); ++removedItems[itemTemplate->Quality]; } } } } } } std::ostringstream str; str << "Removed "; if (itemQuality == ITEM_QUALITY_HEIRLOOM) { str << "all"; } else { bool initialize = true; for (uint8 i = ITEM_QUALITY_POOR; i < MAX_ITEM_QUALITY; ++i) { if (uint32 itemCount = removedItems[i]) { std::string_view itemQualityString = itemQualityToString[i]; if (!initialize) { str << ", "; } str << "|c"; str << std::hex << ItemQualityColors[i] << std::dec; str << itemCount << " " << itemQualityString << "|r"; initialize = false; } } } str << " items from your bags."; handler->SendSysMessage(str.str().c_str()); return true; }; }; void AddSC_bag_commandscript() { new bg_commandscript(); }