2 * Copyright (C) 2005,2006 MaNGOS <http://www.mangosproject.org/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "WorldPacket.h"
21 #include "WorldSession.h"
25 #include "ObjectMgr.h"
29 #include "UpdateData.h"
30 #include "ObjectAccessor.h"
32 void WorldSession::HandleSplitItemOpcode( WorldPacket
& recv_data
)
34 sLog
.outDebug("WORLD: CMSG_SPLIT_ITEM");
35 uint8 srcBag
, srcSlot
, dstBag
, dstSlot
, count
;
37 recv_data
>> srcBag
>> srcSlot
>> dstBag
>> dstSlot
>> count
;
39 sLog
.outDetail("ITEM: Split item, srcBag = %d, srcSlot = %d, dstBag = %d, dstSlot = %d, count = %d",srcBag
, srcSlot
, dstBag
, dstSlot
, count
);
41 GetPlayer()->SplitItem(srcBag
, srcSlot
, dstBag
, dstSlot
, count
);
44 void WorldSession::HandleSwapInvItemOpcode( WorldPacket
& recv_data
)
46 sLog
.outDebug("WORLD: CMSG_SWAP_INV_ITEM");
49 uint8 srcSlot
, dstSlot
;
51 recv_data
>> srcSlot
>> dstSlot
;
53 sLog
.outDetail("ITEM: Swap inventory, srcSlot = %u, dstSlot = %u", (uint32
)srcSlot
, (uint32
)dstSlot
);
55 GetPlayer()->SwapItem(0, dstSlot
, 0, srcSlot
);
58 void WorldSession::HandleSwapItem( WorldPacket
& recv_data
)
60 sLog
.outDebug("WORLD: CMSG_SWAP_ITEM");
62 uint8 dstBag
, dstSlot
, srcBag
, srcSlot
;
64 recv_data
>> dstBag
>> dstSlot
>> srcBag
>> srcSlot
;
65 sLog
.outDetail("ITEM: Swap, srcBag = %d, srcSlot = %d, dstBag = %d, dstSlot = %d", srcBag
, srcSlot
, dstBag
, dstSlot
);
67 GetPlayer()->SwapItem(dstBag
, dstSlot
, srcBag
, srcSlot
);
70 void WorldSession::HandleAutoEquipItemOpcode( WorldPacket
& recv_data
)
72 sLog
.outDebug("WORLD: CMSG_AUTOEQUIP_ITEM");
74 uint8 srcBag
, srcSlot
, dstSlot
, error_msg
= 0;
76 recv_data
>> srcBag
>> srcSlot
;
77 sLog
.outDetail("ITEM: Auto equip, srcBag = %d, srcSlot = %d", srcBag
, srcSlot
);
79 Item
*item
= GetPlayer()->GetItemBySlot(srcBag
, srcSlot
);
81 if (!item
) error_msg
= EQUIP_ERR_ITEM_NOT_FOUND
;
85 dstSlot
= GetPlayer()->FindEquipSlot(item
->GetProto()->InventoryType
);
86 if (dstSlot
== INVENTORY_SLOT_ITEM_END
) error_msg
= EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
;
91 data
.Initialize(SMSG_INVENTORY_CHANGE_FAILURE
);
93 data
<< (item
? item
->GetGUID() : uint64(0));
100 GetPlayer()->SwapItem(CLIENT_SLOT_BACK
,dstSlot
,srcBag
,srcSlot
);
103 void WorldSession::HandleDestroyItemOpcode( WorldPacket
& recv_data
)
105 sLog
.outDebug("WORLD: CMSG_DESTROYITEM");
107 uint8 bagIndex
, slot
, count
, data1
, data2
, data3
;
109 recv_data
>> bagIndex
>> slot
>> count
>> data1
>> data2
>> data3
;
111 sLog
.outDetail("ITEM: Destroy, bagIndex = %d, slot = %d, count = %d (Uknown data: %d %d %d)", bagIndex
, slot
, count
, data1
, data2
, data3
);
113 Item
*item
= GetPlayer()->GetItemBySlot(bagIndex
,slot
);
117 sLog
.outDetail("ITEM: Tried to destroy a non-existant item");
121 if ((!count
) || (count
>= item
->GetCount()))
123 GetPlayer()->RemoveItemFromSlot(bagIndex
,slot
);
124 item
->DeleteFromDB();
129 item
->SetCount(item
->GetCount() - count
);
131 //GetPlayer()->_SaveInventory();
134 extern void CheckItemDamageValues ( ItemPrototype
*itemProto
);
136 void WorldSession::HandleItemQuerySingleOpcode( WorldPacket
& recv_data
)
138 sLog
.outDebug("WORLD: CMSG_ITEM_QUERY_SINGLE");
141 uint32 itemId
, guidLow
, guidHigh
;
142 recv_data
>> itemId
>> guidLow
>> guidHigh
;
144 ItemPrototype
*itemProto
= objmgr
.GetItemPrototype(itemId
);
148 sLog
.outError("ITEM: Unknown item, itemId = %u", itemId
);
149 data
.Initialize( SMSG_ITEM_QUERY_SINGLE_RESPONSE
);
151 for(int a
=0;a
<11;a
++)
157 sLog
.outDetail("ITEM: Item query, itemId = %d, guidLow = %d, guidHigh = %d", itemId
, guidLow
, guidHigh
);
159 data
.Initialize( SMSG_ITEM_QUERY_SINGLE_RESPONSE
);
160 data
<< itemProto
->ItemId
;
161 data
<< itemProto
->Class
;
162 data
<< itemProto
->SubClass
;
163 data
<< itemProto
->Name1
;
164 data
<< itemProto
->Name2
;
165 data
<< itemProto
->Name3
;
166 data
<< itemProto
->Name4
;
168 data
.append((const char*)&itemProto
->DisplayInfoID
,30*4+sizeof(itemProto
->ItemStat
)+sizeof(itemProto
->Damage
)+sizeof(itemProto
->Spells
));
170 data
<< itemProto
->Description
;
171 data
.append((const char*)&itemProto
->PageText
,12*4);
175 extern char *fmtstring( char *format
, ... );
177 extern char *GetInventoryImageFilefromObjectClass(uint32 classNum
, uint32 subclassNum
, uint32 type
, uint32 DisplayID
);
179 void WorldSession::HandleReadItem( WorldPacket
& recv_data
)
181 sLog
.outDebug( "WORLD: CMSG_READ_ITEM");
182 uint8 bagIndex
, slot
;
184 recv_data
>> bagIndex
>> slot
;
186 sLog
.outDetail("ITEM: Read, bagIndex = %d, slot = %d", bagIndex
, slot
);
187 Item
*pItem
= GetPlayer()->GetItemBySlot(bagIndex
, slot
);
191 if ((!pItem
->GetProto()->PageText
) || (GetPlayer()->inCombat
) || (GetPlayer()->isDead()))
193 data
.Initialize( SMSG_READ_ITEM_FAILED
);
194 sLog
.outDetail("ITEM: Unable to read item");
198 data
.Initialize (SMSG_READ_ITEM_OK
);
199 sLog
.outDetail("ITEM: Item page sent");
201 data
<< pItem
->GetGUID();
206 void WorldSession::HandlePageQuerySkippedOpcode( WorldPacket
& recv_data
)
208 sLog
.outDetail( "WORLD: Received CMSG_PAGE_TEXT_QUERY" );
211 uint32 itemid
, guidlow
, guidhigh
;
213 recv_data
>> itemid
>> guidlow
>> guidhigh
;
215 sLog
.outDetail( "Packet Info: itemid: %d guidlow: %d guidhigh: %d", itemid
, guidlow
, guidhigh
);
218 void WorldSession::HandleSellItemOpcode( WorldPacket
& recv_data
)
220 sLog
.outDetail( "WORLD: Received CMSG_SELL_ITEM" );
223 uint64 vendorguid
, itemguid
;
229 recv_data
>> vendorguid
;
230 recv_data
>> itemguid
;
235 data
.Initialize( SMSG_SELL_ITEM
);
236 data
<< vendorguid
<< itemguid
<< uint8(0x01);
237 WPAssert(data
.size() == 17);
242 Creature
*unit
= ObjectAccessor::Instance().GetCreature(*_player
, vendorguid
);
246 data
.Initialize( SMSG_SELL_ITEM
);
247 data
<< vendorguid
<< itemguid
<< uint8(0x03);
248 WPAssert(data
.size() == 17);
255 if (GetPlayer()->GetSlotByItemGUID(itemguid
,bag
,slot
))
257 item
= GetPlayer()->GetItemBySlot(bag
,slot
);
260 if(item
->GetProto()->SellPrice
!=0)
262 data
.Initialize( SMSG_SELL_ITEM
);
263 data
<< vendorguid
<< itemguid
<< uint8(0x0);
264 WPAssert(data
.size() == 17);
267 //if (amount == 0) amount = 1;
268 newmoney
= ((GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE
)) + (item
->GetProto()->SellPrice
) * item
->GetCount());
269 GetPlayer()->SetUInt32Value( PLAYER_FIELD_COINAGE
, newmoney
);
271 uint32 buyBackslot
=GetPlayer()->GetCurrentBuybackSlot();
272 GetPlayer()->AddItemToBuyBackSlot(buyBackslot
,item
);
273 GetPlayer()->SetCurrentBuybackSlot(buyBackslot
+1);
274 GetPlayer()->RemoveItemFromSlot(bag
,slot
,false);
278 data
.Initialize( SMSG_SELL_ITEM
);
279 data
<< vendorguid
<< itemguid
<< uint8(0x02);
280 WPAssert(data
.size() == 17);
287 data
.Initialize( SMSG_SELL_ITEM
);
288 data
<< vendorguid
<< itemguid
<< uint8(0x01);
289 WPAssert(data
.size() == 17);
293 sLog
.outDetail( "WORLD: Sent SMSG_SELL_ITEM" );
296 void WorldSession::HandleBuybackItem(WorldPacket
& recv_data
)
298 sLog
.outDetail( "WORLD: Received CMSG_BUYBACK_ITEM" );
303 recv_data
>> vendorguid
;
304 recv_data
>> buybackslot
; //start slot is (69 0x45) end slot is 0x45+12
306 //sLog.outDetail( "Packet Info: vendorguid: %u buybackslot: %u ", vendorguid, buybackslot);
307 Item
*buybackItem
=NULL
;
308 uint32 slot
=buybackslot
-0x45;
309 buybackItem
= GetPlayer()->GetItemFromBuyBackSlot(slot
);
313 newmoney
= ((GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE
)) - (GetPlayer()->GetUInt32Value(PLAYER_FIELD_BUYBACK_PRICE_1
+slot
)));
316 data
.Initialize( SMSG_BUY_FAILED
);
317 data
<< uint64(buybackItem
->GetGUID());
318 data
<< uint32(buybackItem
->GetEntry());
323 if(GetPlayer()->AddItemToInventory(0, NULL_SLOT
, buybackItem
, false, false, false))
325 GetPlayer()->SetUInt32Value( PLAYER_FIELD_COINAGE
, newmoney
);
326 GetPlayer()->RemoveItemFromBuyBackSlot(slot
);
331 void WorldSession::HandleBuyItemInSlotOpcode( WorldPacket
& recv_data
)
333 sLog
.outDetail( "WORLD: Received CMSG_BUY_ITEM_IN_SLOT" );
336 uint64 srcguid
, dstguid
;
348 SMSG_BUY_FAILED error
350 1: item already selled
352 4: seller dont like u
356 12: reputation require
359 recv_data
>> srcguid
>> itemid
>> dstguid
>> slot
>> amount
;
361 Creature
*unit
= ObjectAccessor::Instance().GetCreature(*_player
, srcguid
);
362 Player
*player
= GetPlayer();
367 if(dstguid
== GetPlayer()->GetGUID())
369 slotType
=CLIENT_SLOT_BACK
;
373 for (uint8 i
=CLIENT_SLOT_01
;i
<=CLIENT_SLOT_04
;i
++)
375 bag
=GetPlayer()->GetBagBySlot(i
);
378 if( dstguid
== bag
->GetGUID() )
387 ItemPrototype
*ItemPro
= objmgr
.GetItemPrototype(itemid
);
393 newmoney
= ((GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE
)) - (ItemPro
->BuyPrice
));
396 data
.Initialize( SMSG_BUY_FAILED
);
397 data
<< uint64(srcguid
);
398 data
<< uint32(itemid
);
404 if(ItemPro
->RequiredLevel
> GetPlayer()->getLevel())
406 data
.Initialize( SMSG_BUY_FAILED
);
407 data
<< uint64(srcguid
);
408 data
<< uint32(itemid
);
413 // Check if item is usable
414 if( (slot
< EQUIPMENT_SLOT_END
) && (slotType
==CLIENT_SLOT_BACK
) )
417 // uint8 error = GetPlayer()->CanEquipItem(ItemPro);
420 data
.Initialize( SMSG_INVENTORY_CHANGE_FAILURE
);
421 data
<< uint8(error
);
422 if (error
== EQUIP_ERR_YOU_MUST_REACH_LEVEL_N
)
424 data
<< (uint32
)ItemPro
->RequiredLevel
;
425 data
<< uint64(srcguid
);
435 for(uint8 i
= 0; i
< unit
->getItemCount(); i
++)
437 if (unit
->getItemId(i
) == itemid
)
443 if(( vendorslot
== -1 )||((amount
> unit
->getItemAmount(vendorslot
)) &&
444 (unit
->getItemAmount(vendorslot
)>=0)))
446 data
.Initialize( SMSG_BUY_FAILED
);
447 data
<< uint64(srcguid
);
448 data
<< uint32(itemid
);
454 if(GetPlayer()->AddNewItem (slotType
,slot
,itemid
,amount
,false,false))
456 GetPlayer()->SetUInt32Value( PLAYER_FIELD_COINAGE
, newmoney
);
457 data
.Initialize( SMSG_BUY_ITEM
);
458 data
<< uint64(srcguid
);
459 data
<< uint32(itemid
) << uint32(amount
);
461 sLog
.outDetail( "WORLD: Sent SMSG_BUY_ITEM" );
465 data
.Initialize( SMSG_BUY_FAILED
);
466 data
<< uint64(srcguid
);
467 data
<< uint32(itemid
);
475 data
.Initialize( SMSG_BUY_FAILED
);
476 data
<< uint64(srcguid
);
477 data
<< uint32(itemid
);
483 void WorldSession::HandleBuyItemOpcode( WorldPacket
& recv_data
)
485 sLog
.outDetail( "WORLD: Received CMSG_BUY_ITEM" );
491 uint8 playerslot
= 0;
495 recv_data
>> srcguid
>> itemid
;
496 recv_data
>> amount
>> slot
;
498 Creature
*unit
= ObjectAccessor::Instance().GetCreature(*_player
, srcguid
);
502 ItemPrototype
*ItemPro
= objmgr
.GetItemPrototype(itemid
);
505 for(uint8 i
= 0; i
< unit
->getItemCount(); i
++)
507 if (unit
->getItemId(i
) == itemid
)
514 if(( vendorslot
== -1 )||((amount
> unit
->getItemAmount(vendorslot
)) &&
515 (unit
->getItemAmount(vendorslot
)>=0)))
517 data
.Initialize( SMSG_BUY_FAILED
);
518 data
<< uint64(srcguid
);
519 data
<< uint32(itemid
);
525 newmoney
= ((GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE
)) - (objmgr
.GetItemPrototype(itemid
)->BuyPrice
));
528 data
.Initialize( SMSG_BUY_FAILED
);
529 data
<< uint64(srcguid
);
530 data
<< uint32(itemid
);
536 if (GetPlayer()->AddNewItem(0,NULL_SLOT
,itemid
,amount
,false,false))
538 GetPlayer()->SetUInt32Value( PLAYER_FIELD_COINAGE
, newmoney
);
539 data
.Initialize( SMSG_BUY_ITEM
);
540 data
<< uint64(srcguid
);
541 data
<< uint32(itemid
) << uint32(amount
);
543 sLog
.outDetail( "WORLD: Sent SMSG_BUY_ITEM" );
548 data
.Initialize( SMSG_BUY_FAILED
);
549 data
<< uint64(srcguid
);
550 data
<< uint32(itemid
);
557 data
.Initialize( SMSG_BUY_FAILED
);
558 data
<< uint64(srcguid
);
559 data
<< uint32(itemid
);
565 void WorldSession::HandleListInventoryOpcode( WorldPacket
& recv_data
)
572 sLog
.outDetail( "WORLD: Recvd CMSG_LIST_INVENTORY %u", guid
);
573 Creature
*unit
= ObjectAccessor::Instance().GetCreature(*_player
, guid
);
578 uint8 numitems
= (uint8
)unit
->getItemCount();
579 uint8 actualnumitems
= 0;
582 for(i
= 0; i
< numitems
; i
++ )
584 if(unit
->getItemId(i
) != 0) actualnumitems
++;
586 uint32 guidlow
= GUID_LOPART(guid
);
588 data
.Initialize( SMSG_LIST_INVENTORY
);
590 data
<< uint8( actualnumitems
);
592 ItemPrototype
* curItem
;
593 for(i
= 0; i
< numitems
; i
++ )
595 if(unit
->getItemId(i
) != 0)
597 curItem
= unit
->getProtoByslot(i
);
601 sLog
.outError( "Unit %i has nonexistant item %i! the item will be removed next time", guid
, unit
->getItemId(i
) );
602 for( int a
= 0; a
< 7; a
++ )
605 // That should be OR or AND ?
606 sDatabase
.PExecute("DELETE * FROM `vendor` WHERE `entry` = '%u' AND `itemguid` = '%u'", unit
->GetEntry(),unit
->getItemId(i
));
608 unit
->setItemAmount(i
,0);
609 unit
->setItemId(i
,0);
614 data
<< uint32( i
+ 1 );
616 data
<< uint32( unit
->getItemId(i
) );
618 data
<< uint32( curItem
->DisplayInfoID
);
620 data
<< uint32( unit
->getItemAmount(i
) );
622 data
<< uint32( curItem
->BuyPrice
);
629 if (!(data
.size() == 8 + 1 + ((actualnumitems
* 7) * 4)))
632 WPAssert(data
.size() == 8 + 1 + ((actualnumitems
* 7) * 4));
634 sLog
.outDetail( "WORLD: Sent SMSG_LIST_INVENTORY" );
637 void WorldSession::SendListInventory( uint64 guid
)
641 Creature
*unit
= ObjectAccessor::Instance().GetCreature(*_player
, guid
);
646 uint8 numitems
= (uint8
)unit
->getItemCount();
647 uint8 actualnumitems
= 0;
650 for(i
= 0; i
< numitems
; i
++ )
652 if(unit
->getItemId(i
) != 0) actualnumitems
++;
654 uint32 guidlow
= GUID_LOPART(guid
);
656 data
.Initialize( SMSG_LIST_INVENTORY
);
658 data
<< uint8( actualnumitems
);
660 ItemPrototype
* curItem
;
661 for(i
= 0; i
< numitems
; i
++ )
663 if(unit
->getItemId(i
) != 0)
665 curItem
= unit
->getProtoByslot(i
);
668 sLog
.outError( "Unit %i has nonexistant item %i! the item will be removed next time", guid
, unit
->getItemId(i
) );
669 for( int a
= 0; a
< 7; a
++ )
672 sDatabase
.PExecute("DELETE * FROM `vendor` WHERE `entry` = '%u' AND `itemguid` = '%u'", unit
->GetEntry(),unit
->getItemId(i
));
674 unit
->setItemAmount(i
,0);
675 unit
->setItemId(i
,0);
679 data
<< uint32( i
+ 1 );
681 data
<< uint32( unit
->getItemId(i
) );
683 data
<< uint32( curItem
->DisplayInfoID
);
685 data
<< uint32( unit
->getItemAmount(i
) );
687 data
<< uint32( curItem
->BuyPrice
);
694 if (!(data
.size() == 8 + 1 + ((actualnumitems
* 7) * 4)))
697 WPAssert(data
.size() == 8 + 1 + ((actualnumitems
* 7) * 4));
699 sLog
.outDetail( "WORLD: Sent SMSG_LIST_INVENTORY" );
702 void WorldSession::HandleAutoStoreBagItemOpcode( WorldPacket
& recv_data
)
704 sLog
.outDebug("WORLD: CMSG_AUTOSTORE_BAG_ITEM");
706 uint8 srcBag
, srcSlot
, dstBag
, result
;
708 recv_data
>> srcBag
>> srcSlot
>> dstBag
;
710 sLog
.outDetail("ITEM: Autostore item, srcBag = %d, srcSlot = %d, dstBag = %d", srcBag
, srcSlot
, dstBag
);
712 Item
*pItem
= GetPlayer()->GetItemBySlot(srcBag
, srcSlot
);
716 sLog
.outDetail("ITEM: The item doesn't exist");
720 result
= GetPlayer()->AddItemToBag(dstBag
, pItem
, true, true, false);
724 data
.Initialize(SMSG_INVENTORY_CHANGE_FAILURE
);
725 data
<< uint8(EQUIP_ERR_BAG_FULL
);
726 data
<< (pItem
? pItem
->GetGUID() : uint64(0));
733 GetPlayer()->RemoveItemFromSlot(srcBag
, srcSlot
);
734 GetPlayer()->AddItemToBag(dstBag
, pItem
, true, false, true);
737 pItem
->DeleteFromDB();
740 //GetPlayer()->_SaveInventory();
743 void WorldSession::HandleBuyBankSlotOpcode(WorldPacket
& recvPacket
)
745 sLog
.outDebug("WORLD: CMSG_BUY_BANK_SLOT");
746 uint32 bank
, result
, price
, playerGold
;
748 bank
= GetPlayer()->GetUInt32Value(PLAYER_BYTES_2
);
749 result
= (bank
& 0x70000) >> 16;
751 sLog
.outDetail("PLAYER: Buy bank bag slot, slot number = %d", result
);
786 bank
= (bank
& ~0x70000) + (result
<< 16);
787 playerGold
= GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE
);
788 if (playerGold
>= price
)
790 GetPlayer()->SetUInt32Value(PLAYER_BYTES_2
, bank
);
791 GetPlayer()->SetUInt32Value(PLAYER_FIELD_COINAGE
, playerGold
- price
);
795 void WorldSession::HandleAutoBankItemOpcode(WorldPacket
& recvPacket
)
797 sLog
.outDebug("WORLD: CMSG_AUTOBANK_ITEM");
799 uint8 bagIndex
, slot
, result
;
802 recvPacket
>> bagIndex
>> slot
;
804 pItem
= GetPlayer()->GetItemBySlot(bagIndex
, slot
);
808 sLog
.outDetail("ITEM: Unknown item");
812 result
= GetPlayer()->AddItemToBank(0, NULL_SLOT
, pItem
, true, true, true);
816 data
.Initialize(SMSG_INVENTORY_CHANGE_FAILURE
);
817 data
<< uint8(EQUIP_ERR_BANK_FULL
);
818 data
<< (pItem
? pItem
->GetGUID() : uint64(0));
825 GetPlayer()->RemoveItemFromSlot(bagIndex
, slot
);
826 GetPlayer()->AddItemToBank(0, NULL_SLOT
, pItem
, true, false, false);
829 pItem
->DeleteFromDB();
832 //GetPlayer()->_SaveInventory();
835 void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket
& recvPacket
)
837 sLog
.outDebug("WORLD: CMSG_AUTOSTORE_BANK_ITEM");
839 uint8 bagIndex
, slot
, result
;
842 recvPacket
>> bagIndex
>> slot
;
844 pItem
= GetPlayer()->GetItemBySlot(bagIndex
, slot
);
848 sLog
.outDetail("ITEM: Unknown item");
852 result
= GetPlayer()->AddItemToInventory(0, NULL_SLOT
, pItem
, true, true, true);
856 data
.Initialize(SMSG_INVENTORY_CHANGE_FAILURE
);
857 data
<< uint8(EQUIP_ERR_INVENTORY_FULL
);
858 data
<< (pItem
? pItem
->GetGUID() : uint64(0));
865 GetPlayer()->RemoveItemFromSlot(bagIndex
, slot
);
866 GetPlayer()->AddItemToInventory(0, NULL_SLOT
, pItem
, true, false, false);
869 pItem
->DeleteFromDB();
872 //GetPlayer()->_SaveInventory();