Here's the code for the NukeItem command:
zone/command.cpp
Code:
void command_nukeitem(Client *c, const Seperator *sep)
{
int numitems, itemid;
if (c->GetTarget() && c->GetTarget()->IsClient() && (sep->IsNumber(1) || sep->IsHexNumber(1))) {
itemid=sep->IsNumber(1)?atoi(sep->arg[1]):hextoi(sep->arg[1]);
numitems = c->GetTarget()->CastToClient()->NukeItem(itemid);
c->Message(0, " %u items deleted", numitems);
}
else
c->Message(0, "Usage: (targted) #nukeitem itemnum - removes the item from the player's inventory");
}
zone/inventory.cpp
Code:
// @merth: this needs to be touched up
uint32 Client::NukeItem(uint32 itemnum) {
if (itemnum == 0)
return 0;
uint32 x = 0;
int i;
for (i=0; i<=29; i++) { // Equipped and personal inventory
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
for (i=251; i<=339; i++) { // Main inventory's and cursor's containers
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
for (i=2000; i<=2015; i++) { // Bank slots
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
for (i=2030; i<=2109; i++) { // Bank's containers
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
for (i=2500; i<=2501; i++) { // Shared bank
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
for (i=2531; i<=2550; i++) { // Shared bank's containers
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
return x;
}
Referencing
the Wiki, the cursor itself is slot # 30 and its bag slots are 331 through 340. So, basically, slot 30 (an item just on the cursor) isn't being nuked by NukeItem. If you change the following:
Code:
for (i=0; i<=30; i++) { // Equipped and personal inventory & single item on cursor
if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) {
DeleteItemInInventory(i, 0, true);
x++;
}
}
That will fix it.
Logistically speaking, there might be a better way to do this, seeing as how each and every one of those for statements is exactly the same (which is what I'm sure the comment "this needs to be touched up" at the top means), although I'm not sure of the best, simplest way to do so. I was thinking an array with all of the slots to check defined in it, but I have a feeling that might be slower than just using for.
In any case, hope this helps.