mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
333 lines
10 KiB
C++
Executable File
333 lines
10 KiB
C++
Executable File
#include "../client.h"
|
|
#include "../object.h"
|
|
|
|
void command_peekinv(Client *c, const Seperator *sep)
|
|
{
|
|
// this can be cleaned up once inventory is cleaned up
|
|
enum {
|
|
peekNone = 0x0000,
|
|
peekEquip = 0x0001,
|
|
peekGen = 0x0002,
|
|
peekCursor = 0x0004,
|
|
peekLimbo = 0x0008,
|
|
peekTrib = 0x0010,
|
|
peekBank = 0x0020,
|
|
peekShBank = 0x0040,
|
|
peekTrade = 0x0080,
|
|
peekWorld = 0x0100,
|
|
peekOutOfScope = (peekWorld * 2) // less than
|
|
};
|
|
|
|
static const char *scope_prefix[] = {"equip", "gen", "cursor", "limbo", "trib", "bank", "shbank", "trade", "world"};
|
|
|
|
static const int16 scope_range[][2] = {
|
|
{EQ::invslot::EQUIPMENT_BEGIN, EQ::invslot::EQUIPMENT_END},
|
|
{EQ::invslot::GENERAL_BEGIN, EQ::invslot::GENERAL_END},
|
|
{EQ::invslot::slotCursor, EQ::invslot::slotCursor},
|
|
{EQ::invslot::SLOT_INVALID, EQ::invslot::SLOT_INVALID},
|
|
{EQ::invslot::TRIBUTE_BEGIN, EQ::invslot::TRIBUTE_END},
|
|
{EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END},
|
|
{EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END},
|
|
{EQ::invslot::TRADE_BEGIN, EQ::invslot::TRADE_END},
|
|
{EQ::invslot::SLOT_BEGIN, (EQ::invtype::WORLD_SIZE - 1)}
|
|
};
|
|
|
|
static const bool scope_bag[] = {false, true, true, true, false, true, true, true, true};
|
|
|
|
if (!c) {
|
|
return;
|
|
}
|
|
|
|
if (c->GetTarget() && !c->GetTarget()->IsClient()) {
|
|
c->Message(Chat::White, "You must target a PC for this command.");
|
|
return;
|
|
}
|
|
|
|
int scopeMask = peekNone;
|
|
|
|
if (strcasecmp(sep->arg[1], "all") == 0) { scopeMask = (peekOutOfScope - 1); }
|
|
else if (strcasecmp(sep->arg[1], "equip") == 0) { scopeMask |= peekEquip; }
|
|
else if (strcasecmp(sep->arg[1], "gen") == 0) { scopeMask |= peekGen; }
|
|
else if (strcasecmp(sep->arg[1], "cursor") == 0) { scopeMask |= peekCursor; }
|
|
else if (strcasecmp(sep->arg[1], "poss") == 0) { scopeMask |= (peekEquip | peekGen | peekCursor); }
|
|
else if (strcasecmp(sep->arg[1], "limbo") == 0) { scopeMask |= peekLimbo; }
|
|
else if (strcasecmp(sep->arg[1], "curlim") == 0) { scopeMask |= (peekCursor | peekLimbo); }
|
|
else if (strcasecmp(sep->arg[1], "trib") == 0) { scopeMask |= peekTrib; }
|
|
else if (strcasecmp(sep->arg[1], "bank") == 0) { scopeMask |= peekBank; }
|
|
else if (strcasecmp(sep->arg[1], "shbank") == 0) { scopeMask |= peekShBank; }
|
|
else if (strcasecmp(sep->arg[1], "allbank") == 0) { scopeMask |= (peekBank | peekShBank); }
|
|
else if (strcasecmp(sep->arg[1], "trade") == 0) { scopeMask |= peekTrade; }
|
|
else if (strcasecmp(sep->arg[1], "world") == 0) { scopeMask |= peekWorld; }
|
|
|
|
if (!scopeMask) {
|
|
c->Message(
|
|
Chat::White,
|
|
"Usage: #peekinv [equip|gen|cursor|poss|limbo|curlim|trib|bank|shbank|allbank|trade|world|all]"
|
|
);
|
|
c->Message(Chat::White, "- Displays a portion of the targeted user's inventory");
|
|
c->Message(Chat::White, "- Caution: 'all' is a lot of information!");
|
|
return;
|
|
}
|
|
|
|
Client *targetClient = c;
|
|
if (c->GetTarget()) {
|
|
targetClient = c->GetTarget()->CastToClient();
|
|
}
|
|
|
|
const EQ::ItemInstance *inst_main = nullptr;
|
|
const EQ::ItemInstance *inst_sub = nullptr;
|
|
const EQ::ItemInstance *inst_aug = nullptr;
|
|
const EQ::ItemData *item_data = nullptr;
|
|
|
|
EQ::SayLinkEngine linker;
|
|
linker.SetLinkType(EQ::saylink::SayLinkItemInst);
|
|
|
|
c->Message(Chat::White, "Displaying inventory for %s...", targetClient->GetName());
|
|
|
|
Object *objectTradeskill = targetClient->GetTradeskillObject();
|
|
|
|
bool itemsFound = false;
|
|
|
|
for (int scopeIndex = 0, scopeBit = peekEquip; scopeBit < peekOutOfScope; ++scopeIndex, scopeBit <<= 1) {
|
|
if (scopeBit & ~scopeMask) {
|
|
continue;
|
|
}
|
|
|
|
if (scopeBit & peekWorld) {
|
|
if (objectTradeskill == nullptr) {
|
|
c->Message(Chat::Default, "No world tradeskill object selected...");
|
|
continue;
|
|
}
|
|
else {
|
|
c->Message(
|
|
Chat::White,
|
|
"[WorldObject DBID: %i (entityid: %i)]",
|
|
objectTradeskill->GetDBID(),
|
|
objectTradeskill->GetID());
|
|
}
|
|
}
|
|
|
|
for (int16 indexMain = scope_range[scopeIndex][0]; indexMain <= scope_range[scopeIndex][1]; ++indexMain) {
|
|
if (indexMain == EQ::invslot::SLOT_INVALID) {
|
|
continue;
|
|
}
|
|
|
|
inst_main = ((scopeBit & peekWorld) ? objectTradeskill->GetItem(indexMain) : targetClient->GetInv().GetItem(
|
|
indexMain
|
|
));
|
|
if (inst_main) {
|
|
itemsFound = true;
|
|
item_data = inst_main->GetItem();
|
|
}
|
|
else {
|
|
item_data = nullptr;
|
|
}
|
|
|
|
linker.SetItemInst(inst_main);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"%sSlot: %i, Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain),
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_main == nullptr) ? 0 : inst_main->GetCharges())
|
|
);
|
|
|
|
if (inst_main && inst_main->IsClassCommon()) {
|
|
for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) {
|
|
inst_aug = inst_main->GetItem(indexAug);
|
|
if (!inst_aug) { // extant only
|
|
continue;
|
|
}
|
|
|
|
item_data = inst_aug->GetItem();
|
|
linker.SetItemInst(inst_aug);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
".%sAugSlot: %i (Slot #%i, Aug idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
INVALID_INDEX,
|
|
((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain),
|
|
indexAug,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
}
|
|
}
|
|
|
|
if (!scope_bag[scopeIndex] || !(inst_main && inst_main->IsClassBag())) {
|
|
continue;
|
|
}
|
|
|
|
for (uint8 indexSub = EQ::invbag::SLOT_BEGIN; indexSub <= EQ::invbag::SLOT_END; ++indexSub) {
|
|
inst_sub = inst_main->GetItem(indexSub);
|
|
if (!inst_sub) { // extant only
|
|
continue;
|
|
}
|
|
|
|
item_data = inst_sub->GetItem();
|
|
linker.SetItemInst(inst_sub);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"..%sBagSlot: %i (Slot #%i, Bag idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
((scopeBit & peekWorld) ? INVALID_INDEX : EQ::InventoryProfile::CalcSlotId(indexMain, indexSub)),
|
|
((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain),
|
|
indexSub,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
|
|
if (inst_sub->IsClassCommon()) {
|
|
for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) {
|
|
inst_aug = inst_sub->GetItem(indexAug);
|
|
if (!inst_aug) { // extant only
|
|
continue;
|
|
}
|
|
|
|
item_data = inst_aug->GetItem();
|
|
linker.SetItemInst(inst_aug);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"...%sAugSlot: %i (Slot #%i, Sub idx #%i, Aug idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
INVALID_INDEX,
|
|
((scopeBit & peekWorld) ? INVALID_INDEX : EQ::InventoryProfile::CalcSlotId(
|
|
indexMain,
|
|
indexSub
|
|
)),
|
|
indexSub,
|
|
indexAug,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (scopeBit & peekLimbo) {
|
|
int limboIndex = 0;
|
|
for (auto it = targetClient->GetInv().cursor_cbegin();
|
|
(it != targetClient->GetInv().cursor_cend());
|
|
++it, ++limboIndex) {
|
|
if (it == targetClient->GetInv().cursor_cbegin()) {
|
|
continue;
|
|
}
|
|
|
|
inst_main = *it;
|
|
if (inst_main) {
|
|
itemsFound = true;
|
|
item_data = inst_main->GetItem();
|
|
}
|
|
else {
|
|
item_data = nullptr;
|
|
}
|
|
|
|
linker.SetItemInst(inst_main);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"%sSlot: %i, Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
(8000 + limboIndex),
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_main == nullptr) ? 0 : inst_main->GetCharges())
|
|
);
|
|
|
|
if (inst_main && inst_main->IsClassCommon()) {
|
|
for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) {
|
|
inst_aug = inst_main->GetItem(indexAug);
|
|
if (!inst_aug) { // extant only
|
|
continue;
|
|
}
|
|
|
|
item_data = inst_aug->GetItem();
|
|
linker.SetItemInst(inst_aug);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
".%sAugSlot: %i (Slot #%i, Aug idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
INVALID_INDEX,
|
|
(8000 + limboIndex),
|
|
indexAug,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
}
|
|
}
|
|
|
|
if (!scope_bag[scopeIndex] || !(inst_main && inst_main->IsClassBag())) {
|
|
continue;
|
|
}
|
|
|
|
for (uint8 indexSub = EQ::invbag::SLOT_BEGIN; indexSub <= EQ::invbag::SLOT_END; ++indexSub) {
|
|
inst_sub = inst_main->GetItem(indexSub);
|
|
if (!inst_sub) {
|
|
continue;
|
|
}
|
|
|
|
item_data = (inst_sub == nullptr) ? nullptr : inst_sub->GetItem();
|
|
|
|
linker.SetItemInst(inst_sub);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"..%sBagSlot: %i (Slot #%i, Bag idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
INVALID_INDEX,
|
|
(8000 + limboIndex),
|
|
indexSub,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
|
|
if (inst_sub->IsClassCommon()) {
|
|
for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN;
|
|
indexAug <= EQ::invaug::SOCKET_END;
|
|
++indexAug) {
|
|
inst_aug = inst_sub->GetItem(indexAug);
|
|
if (!inst_aug) { // extant only
|
|
continue;
|
|
}
|
|
|
|
item_data = inst_aug->GetItem();
|
|
linker.SetItemInst(inst_aug);
|
|
|
|
c->Message(
|
|
(item_data == nullptr),
|
|
"...%sAugSlot: %i (Slot #%i, Sub idx #%i, Aug idx #%i), Item: %i (%s), Charges: %i",
|
|
scope_prefix[scopeIndex],
|
|
INVALID_INDEX,
|
|
(8000 + limboIndex),
|
|
indexSub,
|
|
indexAug,
|
|
((item_data == nullptr) ? 0 : item_data->ID),
|
|
linker.GenerateLink().c_str(),
|
|
((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!itemsFound) {
|
|
c->Message(Chat::White, "No items found.");
|
|
}
|
|
}
|
|
|