|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
08-02-2012, 05:04 AM
|
|
Developer
|
|
Join Date: Apr 2012
Location: North Carolina
Posts: 2,815
|
|
COMMITTED: CSD Support Patch
This patch incorporates a few minor fixes/changes to existing code and the addition of a new troubleshooting command.
[CSD Support Patch]
Code:
Index: client_packet.cpp
===================================================================
--- client_packet.cpp (revision 2175)
+++ client_packet.cpp (working copy)
@@ -3291,6 +3291,7 @@
}
MoveItem_Struct* mi = (MoveItem_Struct*)app->pBuffer;
+
if(spellend_timer.Enabled() && casting_spell_id && !IsBardSong(casting_spell_id))
{
if(mi->from_slot != mi->to_slot && (mi->from_slot < 30 || mi->from_slot > 39) && IsValidSlot(mi->from_slot) && IsValidSlot(mi->to_slot))
@@ -3310,6 +3311,55 @@
return;
}
}
+
+ // 'CSD 11' - Added checks for illegal bagslot swaps..should help with certain cheats (currently checks personal and cursor bag slots.)
+ // - If a player has used an illegal item placement cheat, they can become bugged at some point (especially concerning lore items.)
+ //* Start
+ bool mi_hack = false;
+
+ if (mi->from_slot >= 251 && mi->from_slot <= 340) {
+ if (mi->from_slot > 330)
+ mi_hack = true; // why are we moving from a cursor bagslot when you can't open it?
+ else {
+ sint16 from_invslot = Inventory::CalcSlotId(mi->from_slot);
+ const ItemInst *from_invslotitem = GetInv().GetItem(from_invslot);
+
+ if (!from_invslotitem) // trying to move from bag slots when parent inventory slot is empty
+ mi_hack = true;
+ else if (from_invslotitem->GetItem()->ItemClass == 1) { // checking the parent inventory slot for container
+ if ((Inventory::CalcBagIdx(mi->from_slot) + 1) > from_invslotitem->GetItem()->BagSlots)
+ mi_hack = true; // trying to move from slots beyond parent container size
+ }
+ else // trying to move from bag slots when inventory slot item is not a container
+ mi_hack = true;
+ }
+ }
+
+ if (mi->to_slot >= 251 && mi->to_slot <= 340) {
+ if (mi->to_slot > 330)
+ mi_hack = true; // why are we moving to a cursor bagslot when you can't open it?
+ else {
+ sint16 to_invslot = Inventory::CalcSlotId(mi->to_slot);
+ const ItemInst *to_invslotitem = GetInv().GetItem(to_invslot);
+
+ if (!to_invslotitem) // trying to move into bag slots when parent inventory slot is empty
+ mi_hack = true;
+ else if (to_invslotitem->GetItem()->ItemClass == 1) { // checking the parent inventory slot for container
+ if ((Inventory::CalcBagIdx(mi->to_slot) + 1) > to_invslotitem->GetItem()->BagSlots)
+ mi_hack = true; // trying to move into slots beyond parent container size
+ }
+ else // trying to move into bag slots when inventory slot item is not a container
+ mi_hack = true;
+ }
+ }
+
+ if (mi_hack) { // a CSD can also cause this condition, but more likely the use of a cheat
+ Message(13, "Hack detected: Illegal use of inventory bag slots!");
+ // TODO: Decide whether to log player as hacker - currently has no teeth...
+ // Kick();
+ // return;
+ } // End */
+
SwapItem(mi);
return;
}
Index: command.cpp
===================================================================
--- command.cpp (revision 2175)
+++ command.cpp (working copy)
@@ -456,7 +456,8 @@
command_add("sensetrap", "Analog for ldon sense trap for the newer clients since we still don't have it working.", 0, command_sensetrap) ||
command_add("picklock", "Analog for ldon pick lock for the newer clients since we still don't have it working.", 0, command_picklock) ||
command_add("mysql", "Mysql CLI, see 'help' for options.", 250, command_mysql) ||
- command_add("xtargets", "Show your targets Extended Targets and optionally set how many xtargets they can have.", 250, command_xtargets)
+ command_add("xtargets", "Show your targets Extended Targets and optionally set how many xtargets they can have.", 250, command_xtargets) ||
+ command_add("zopp", "Troubleshooting command - Sends a fake item packet to you. No server reference is created.", 250, command_zopp)
)
{
command_deinit();
@@ -3013,6 +3014,7 @@
c->Message(0, "Usage: (targted) #nukeitem itemnum - removes the item from the player's inventory");
}
+// 'CSD 1' - Made modifications to show charge count of items as well - other changes are noted where they occur
void command_peekinv(Client *c, const Seperator *sep)
{
// Displays what the server thinks the user has in inventory
@@ -3035,15 +3037,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "WornSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "WornSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "WornSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "WornSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
}
@@ -3055,15 +3059,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
if (inst && inst->IsType(ItemClassContainer)) {
@@ -3072,17 +3078,19 @@
item = (instbag) ? instbag->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:instbag->GetCharges()));
}
else
{
- c->Message((item==0), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:instbag->GetCharges()));
}
}
}
@@ -3091,50 +3099,73 @@
{
const ItemInst* inst = client->GetInv().GetItem(9999);
item = (inst) ? inst->GetItem() : NULL;
- c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", 9999,
+ c->Message((item==0), "InvSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", 9999,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
+
+ // 'CSD 1' - Changed to show 'empty' cursors and not to show bag slots on 'queued' cursor slots (cursor bag slots 331 to 340 are not queued...)
+ // - was pointless to show bags on anything after slot 30[0], because they don't exist and it only repeated the 30[0] bag items.
if (bAll || (strcasecmp(sep->arg[1], "cursor")==0)) {
// Personal inventory items
bFound = true;
iter_queue it;
int i=0;
- for(it=client->GetInv().cursor_begin();it!=client->GetInv().cursor_end();it++,i++) {
- const ItemInst* inst = *it;
- item = (inst) ? inst->GetItem() : NULL;
+
+ if(client->GetInv().CursorEmpty()) { // 'CSD 1' - Display 'front' cursor slot even if 'empty' (item(30[0]) == null)
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", SLOT_CURSOR,i,
- ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
+ 0, 0x12, 0, "null", 0x12, 0);
}
else
{
- c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", SLOT_CURSOR,i,
- ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
+ 0, 0x12, 0, "null", 0x12, 0);
}
+ }
+ else {
+ for(it=client->GetInv().cursor_begin();it!=client->GetInv().cursor_end();it++,i++) {
+ const ItemInst* inst = *it;
+ item = (inst) ? inst->GetItem() : NULL;
+ if (c->GetClientVersion() >= EQClientSoF)
+ {
+ c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
+ ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
+ }
+ else
+ {
+ c->Message((item==0), "CursorSlot: %i, Depth: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", SLOT_CURSOR,i,
+ ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
+ }
- if (inst && inst->IsType(ItemClassContainer)) {
- for (uint8 j=0; j<10; j++) {
- const ItemInst* instbag = client->GetInv().GetItem(SLOT_CURSOR, j);
- item = (instbag) ? instbag->GetItem() : NULL;
- if (c->GetClientVersion() >= EQClientSoF)
- {
- c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)",
- Inventory::CalcSlotId(SLOT_CURSOR, j),
- SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ if (inst && inst->IsType(ItemClassContainer) && i==0) { // 'CSD 1' - only display contents of slot 30[0] container..higher ones don't exist
+ for (uint8 j=0; j<10; j++) {
+ const ItemInst* instbag = client->GetInv().GetItem(SLOT_CURSOR, j);
+ item = (instbag) ? instbag->GetItem() : NULL;
+ if (c->GetClientVersion() >= EQClientSoF)
+ {
+ c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
+ Inventory::CalcSlotId(SLOT_CURSOR, j),
+ SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:instbag->GetCharges()));
+ }
+ else
+ {
+ c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
+ Inventory::CalcSlotId(SLOT_CURSOR, j),
+ SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:instbag->GetCharges()));
+ }
}
- else
- {
- c->Message((item==0), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c)",
- Inventory::CalcSlotId(SLOT_CURSOR, j),
- SLOT_CURSOR, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
- }
}
}
}
@@ -3148,15 +3179,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "TributeSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "TributeSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "TributeSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "TributeSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
}
@@ -3170,15 +3203,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "BankSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "BankSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "BankSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "BankSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
if (inst && inst->IsType(ItemClassContainer)) {
@@ -3187,17 +3222,19 @@
item = (instbag) ? instbag->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
}
@@ -3207,15 +3244,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "ShBankSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "ShBankSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "ShBankSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "ShBankSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
if (inst && inst->IsType(ItemClassContainer)) {
@@ -3224,17 +3263,19 @@
item = (instbag) ? instbag->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), " ShBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " ShBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), " ShBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " ShBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
}
@@ -3248,15 +3289,17 @@
item = (inst) ? inst->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), "TradeSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "TradeSlot: %i, Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), "TradeSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c)", i,
+ c->Message((item==0), "TradeSlot: %i, Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i", i,
((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
if (inst && inst->IsType(ItemClassContainer)) {
@@ -3265,17 +3308,19 @@
item = (instbag) ? instbag->GetItem() : NULL;
if (c->GetClientVersion() >= EQClientSoF)
{
- c->Message((item==0), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X00000000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
else
{
- c->Message((item==0), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c)",
+ c->Message((item==0), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%c%06X000000000000000000000000000000000000000%s%c), Charges: %i",
Inventory::CalcSlotId(i, j),
i, j, ((item==0)?0:item->ID),0x12, ((item==0)?0:item->ID),
- ((item==0)?"null":item->Name), 0x12);
+ ((item==0)?"null":item->Name), 0x12,
+ ((item==0)?0:inst->GetCharges()));
}
}
@@ -3286,7 +3331,7 @@
if (!bFound)
{
c->Message(0, "Usage: #peekinv [worn|cursor|inv|bank|trade|trib|all]");
- c->Message(0, " Displays a portion of the targetted user's inventory");
+ c->Message(0, " Displays a portion of the targeted user's inventory");
c->Message(0, " Caution: 'all' is a lot of information!");
}
}
@@ -3727,6 +3772,12 @@
else
c->Message(0, "Insufficient status to modify player corpse.");
}
+ else if (strcasecmp(sep->arg[1], "InspectLoot") == 0) {
+ if (target == 0 || !target->IsCorpse())
+ c->Message(0, "Error: Target must be a corpse.");
+ else
+ target->CastToCorpse()->QueryLoot(c);
+ }
else if (strcasecmp(sep->arg[1], "lock") == 0) {
if (target == 0 || !target->IsCorpse())
c->Message(0, "Error: Target must be a corpse.");
@@ -3777,6 +3828,7 @@
c->Message(0, " Lock - GM locks the corpse - cannot be looted by non-GM");
c->Message(0, " UnLock");
c->Message(0, " RemoveCash");
+ c->Message(0, " InspectLoot");
c->Message(0, " [to remove items from corpses, loot them]");
c->Message(0, "Lead-GM status required to delete/modify player corpses");
c->Message(0, " DeletePlayerCorpses");
@@ -11529,3 +11581,42 @@
else
t->ShowXTargets(c);
}
+
+// 'CSD 3' - Troubleshooting command used to send a fake item to the client..server item not created.
+// - Owner only command..non-targetable to eliminate malicious or mischievious activities.
+void command_zopp(Client *c, const Seperator *sep)
+{
+ if (!c)
+ return;
+ else if (sep->argnum < 2 || sep->argnum > 3)
+ c->Message(0, "Usage: #zopp [slot id] [item id] [*charges]");
+ else if (!sep->IsNumber(1) || !sep->IsNumber(2) || (sep->argnum == 3 && !sep->IsNumber(3)))
+ c->Message(0, "Usage: #zopp [slot id] [item id] [*charges]");
+ else {
+ sint16 slotid = atoi(sep->arg[1]);
+ int32 itemid = atoi(sep->arg[2]);
+ sint16 charges = sep->argnum == 3 ? atoi(sep->arg[3]) : 1; // defaults to 1 charge if not specified
+
+ const Item_Struct* FakeItem = database.GetItem(itemid);
+
+ if (!FakeItem) {
+ c->Message(13, "Error: Item [%u] is not a valid item id.", itemid);
+ return;
+ }
+
+ if (database.GetItemStatus(itemid) > c->Admin()) {
+ c->Message(13, "Error: Insufficient status to use this command.");
+ return;
+ }
+
+ if (charges < 0 || charges > FakeItem->StackSize) {
+ c->Message(13, "Warning: The specified charge count does not meet expected criteria!");
+ c->Message(0, "Processing request..results may cause unpredictable behavior.");
+ }
+
+ ItemInst* FakeItemInst = database.CreateItem(FakeItem, charges);
+ c->SendItemPacket(slotid, FakeItemInst, ItemPacketTrade);
+ c->Message(0, "Sending zephyr op packet to client - %s (%u) with %i %s to slot %i.", FakeItem->Name, itemid, charges, abs(charges==1)?"charge":"charges", slotid);
+ safe_delete(FakeItemInst);
+ }
+}
\ No newline at end of file
Index: command.h
===================================================================
--- command.h (revision 2175)
+++ command.h (working copy)
@@ -320,6 +320,7 @@
void command_qtest(Client *c, const Seperator *sep);
void command_mysql(Client *c, const Seperator *sep);
void command_xtargets(Client *c, const Seperator *sep);
+void command_zopp(Client *c, const Seperator *sep);
#ifdef EMBPERL
void command_embperl_plugin(Client *c, const Seperator *sep);
Index: inventory.cpp
===================================================================
--- inventory.cpp (revision 2175)
+++ inventory.cpp (working copy)
@@ -222,6 +222,14 @@
inst->SetCharges(1);
if ((inst->GetCharges()>0))
inst->SetCharges(inst->GetCharges());
+
+ // 'CSD 7' - This reduces overcharged items to maximum stacksize
+ if ((inst->GetCharges()>inst->GetItem()->StackSize)) {
+ inst->SetCharges(inst->GetItem()->StackSize);
+ Message(0, "Your summoned item is charged beyond maximum allowable - adjusting to %i charges.", inst->GetCharges());
+ }
+
+ // 'CSD 7' - Corrected the augment references to reflect augment name/id instead of base item name/id
if (aug1) {
const Item_Struct* augitem1 = database.GetItem(aug1);
if (augitem1) {
@@ -229,7 +237,7 @@
inst->PutAugment(&database, 0, aug1);
}
else {
- Message(0, "You already have a %s (%i) in your inventory!", item->Name, item_id);
+ Message(0, "You already have a %s (%u) in your inventory - Augment not added!", augitem1->Name, aug1);
}
}
}
@@ -240,7 +248,7 @@
inst->PutAugment(&database, 1, aug2);
}
else {
- Message(0, "You already have a %s (%i) in your inventory!", item->Name, item_id);
+ Message(0, "You already have a %s (%u) in your inventory - Augment not added!", augitem2->Name, aug2);
}
}
}
@@ -251,7 +259,7 @@
inst->PutAugment(&database, 2, aug3);
}
else {
- Message(0, "You already have a %s (%i) in your inventory!", item->Name, item_id);
+ Message(0, "You already have a %s (%u) in your inventory - Augment not added!", augitem3->Name, aug3);
}
}
}
@@ -262,7 +270,7 @@
inst->PutAugment(&database, 3, aug4);
}
else {
- Message(0, "You already have a %s (%i) in your inventory!", item->Name, item_id);
+ Message(0, "You already have a %s (%u) in your inventory - Augment not added!", augitem4->Name, aug4);
}
}
}
@@ -273,7 +281,7 @@
inst->PutAugment(&database, 4, aug5);
}
else {
- Message(0, "You already have a %s (%i) in your inventory!", item->Name, item_id);
+ Message(0, "You already have a %s (%u) in your inventory - Augment not added!", augitem5->Name, aug5);
}
}
}
Index: PlayerCorpse.cpp
===================================================================
--- PlayerCorpse.cpp (revision 2175)
+++ PlayerCorpse.cpp (working copy)
@@ -1304,9 +1304,10 @@
end = itemlist.end();
for(; cur != end; cur++) {
ServerLootItem_Struct* sitem = *cur;
+ sitem->lootslot=x;
const Item_Struct* item = database.GetItem(sitem->item_id);
if (item)
- to->Message(0, " %d: %s", item->ID, item->Name);
+ to->Message(0, " LootSlot: %i (EquipSlot: %i) Item: %s (%d) with %i %s", sitem->lootslot, sitem->equipSlot, item->Name, item->ID, sitem->charges, sitem->charges==1?"charge":"charges");
else
to->Message(0, " Error: 0x%04x", sitem->item_id);
x++;
Change to command #peekinv:
Added charge count, empty cursor listing and removed the recursive display of slots 331 through 340 for queued cursor
bag slots. There is no storage array for cursor bag slots and the same information was repeated for each queue entry.
Change to Client::SummonItem:
Added check to compare charge count to stacksize and reduce to stacksize if it's exceeded. Also changed augment lore
checks to report the actual augment that is rejected in a failed lore check. Before, it would report the base item for
each failure..and then give you a non-adorned base item.
Added command #zopp:
I added a command to induce client-server desyncronizations. Essentially, it will send an op_packet to the client that
creates an item change that is not registered on the server. It requires a status of 250 and is self-only to eliminate
malicious and mischievious use. You are no longer required to stand on one foot, pat your head, chew gum and type
to reproduce a bug condition.
Change to Client::Handle_OP_MoveItem:
Added code to check for illegal bag slot movements. Mainly for identifying CSD situations, it can be modified to register
cheats.
Change to Corpse::QueryLoot:
Added LootSlot and EquipSlot assignment along with item charge reporting.
Change to command #corpse:
Added sub-command 'InspectLoot' with a status requirement of 250. Upon targeting a player or npc corpse, using
'#corpse InspectLoot' will call the above 'QueryLoot' function and report ALL items on a corpse and show their slots.
Bugged corpses will now be identifiable in-game. These corpses will have equipment slot items in the 8000 to 8999
range.
I am working on eliminating the bugged corpse scenario completely, but am having issues clearing a dead player's
cursor queue. When I figure out how to do that, I will submit a correction patch.
Future patches to come...
__________________
Uleat of Bertoxxulous
Compilin' Dirty
Last edited by cavedude; 09-13-2012 at 01:49 PM..
|
|
|
|
|
|
|
08-08-2012, 10:00 AM
|
|
Developer
|
|
Join Date: Apr 2012
Location: North Carolina
Posts: 2,815
|
|
Here's a update to the Corpse::QueryLoot portion of this patch.
It's not a required fix, but it does differentiate the shown and hidden items on a player's corpse. This is a direct replacement and not a patch.
[PlayerCorpse.cpp::Corpse::QueryLoot]
Code:
void Corpse::QueryLoot(Client* to) {
int x = 0;
to->Message(0, "Coin: %ip %ig %is %ic", platinum, gold, silver, copper);
ItemList::iterator cur,end;
cur = itemlist.begin();
end = itemlist.end();
for(; cur != end; cur++) {
ServerLootItem_Struct* sitem = *cur;
if (IsPlayerCorpse()) {
if (sitem->equipSlot >= 251 && sitem->equipSlot <= 340)
sitem->lootslot = 0xFFFF;
else
x < 30 ? sitem->lootslot = x : sitem->lootslot = 0xFFFF; // this con value needs to reflect corpselootlimit in MakeLootRequestPackets
const Item_Struct* item = database.GetItem(sitem->item_id);
if (item)
to->Message((sitem->lootslot == 0xFFFF), " LootSlot: %i (EquipSlot: %i) Item: %s (%d) with %i %s", sitem->lootslot, sitem->equipSlot, item->Name, item->ID, sitem->charges, sitem->charges==1?"charge":"charges");
else
to->Message((sitem->lootslot == 0xFFFF), " Error: 0x%04x", sitem->item_id);
if (sitem->lootslot != 0xFFFF)
x++;
}
else {
sitem->lootslot=x;
const Item_Struct* item = database.GetItem(sitem->item_id);
if (item)
to->Message(0, " LootSlot: %i Item: %s (%d) with %i %s", sitem->lootslot, item->Name, item->ID, sitem->charges, sitem->charges==1?"charge":"charges");
else
to->Message(0, " Error: 0x%04x", sitem->item_id);
x++;
}
}
to->Message(0, "%i items on %s.", x, this->GetName());
}
__________________
Uleat of Bertoxxulous
Compilin' Dirty
|
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 12:54 AM.
|
|
|
|
|
|
|
|
|
|
|
|
|