/*
* 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 "Language.h"
#include "Player.h"
#include "WorldSession.h"
constexpr std::array bagSpecsToString =
{
"normal",
"soul",
"herb",
"enchanting",
"engineering",
"gem",
"mining",
"leatherworking",
"inscription"
};
constexpr std::array bagSpecsColors =
{
0xfff0de18, // YELLOW - Normal
0xffa335ee, // PURPLE - Souls
0xff1eff00, // GREEN - Herb
0xffe37166, // PINK - Enchanting
0xffa68b30, // BROWN - Engineering
0xff0070dd, // BLUE - Gem
0xffc1c8c9, // GREY - Mining
0xfff5a925, // ORANGE - Leatherworking
0xff54504f // DARK GREY - Inscription
};
//constexpr std::array bagSpecsColorToString =
//{
// "normal",
// "soul",
// "herb",
// "enchanting",
// "engineering",
// "gem",
// "mining",
// "leatherworking",
// "inscription"
//};
using namespace Acore::ChatCommands;
class inventory_commandscript : public CommandScript
{
public:
inventory_commandscript() : CommandScript("inventory_commandscript") { }
ChatCommandTable GetCommands() const override
{
static ChatCommandTable inventoryCommandTable =
{
{ "count", HandleInventoryCountCommand, SEC_MODERATOR, Console::No }
};
static ChatCommandTable commandTable =
{
{ "inventory", inventoryCommandTable }
};
return commandTable;
}
static bool HandleInventoryCountCommand(ChatHandler* handler, Optional player)
{
if (!player)
{
player = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!player)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
Player* target = player->GetConnectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
std::array freeSlotsInBags = { };
uint32 freeSlotsForBags = 0;
bool haveFreeSlot = false;
// Check backpack
for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
{
if (!target->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
{
haveFreeSlot = true;
++freeSlotsInBags[ITEM_SUBCLASS_CONTAINER];
}
}
// Check bags
for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{
if (Bag* bag = target->GetBagByPos(i))
{
if (ItemTemplate const* bagTemplate = bag->GetTemplate())
{
if (bagTemplate->Class == ITEM_CLASS_CONTAINER || bagTemplate->Class == ITEM_CLASS_QUIVER)
{
haveFreeSlot = true;
freeSlotsInBags[bagTemplate->SubClass] += bag->GetFreeSlots();
}
}
}
else
{
++freeSlotsForBags;
}
}
std::ostringstream str;
if (haveFreeSlot)
{
str << "Player " << target->GetName() << " have ";
bool initialize = true;
for (uint8 i = ITEM_SUBCLASS_CONTAINER; i < MAX_ITEM_SUBCLASS_CONTAINER; ++i)
{
if (uint32 freeSlots = freeSlotsInBags[i])
{
std::string bagSpecString = bagSpecsToString[i];
if (!initialize)
{
str << ", ";
}
str << "|c";
str << std::hex << bagSpecsColors[i] << std::dec;
str << freeSlots << " in " << bagSpecString << " bags|r";
initialize = false;
}
}
}
else
{
str << "Player " << target->GetName() << " does not have free slots in their bags";
}
if (freeSlotsForBags)
{
str << " and also has " << freeSlotsForBags << " free slots for bags";
}
str << ".";
handler->SendSysMessage(str.str().c_str());
return true;
}
};
void AddSC_inventory_commandscript()
{
new inventory_commandscript();
}