uint32 GetSellPriceForItem( uint32 itemid, uint32 count ) { if( ItemPrototype* proto = ItemPrototypeStorage.LookupEntry( itemid ) ) return GetSellPriceForItem(proto, count); else return 1; }
void WorldSession::HandleSellItemOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) return; CHECK_PACKET_SIZE(recv_data, 17); sLog.outDetail( "WORLD: Recieved CMSG_SELL_ITEM" ); if(!GetPlayer()) return; uint64 vendorguid=0, itemguid=0; int8 amount=0; //uint8 slot = INVENTORY_NO_SLOT_AVAILABLE; //uint8 bagslot = INVENTORY_NO_SLOT_AVAILABLE; //int check = 0; recv_data >> vendorguid; recv_data >> itemguid; recv_data >> amount; if(_player->isCasting()) _player->InterruptSpell(); // Check if item exists if(!itemguid) { SendSellItem(vendorguid, itemguid, 1); return; } Creature *unit = _player->GetMapMgr()->GetCreature(vendorguid); // Check if Vendor exists if (unit == NULL) { SendSellItem(vendorguid, itemguid, 3); return; } Item* item = _player->GetItemInterface()->GetItemByGUID(itemguid); if(!item) { SendSellItem(vendorguid, itemguid, 1); return; //our player doesn't have this item } ItemPrototype *it = item->GetProto(); if(!it) { SendSellItem(vendorguid, itemguid, 2); return; //our player doesn't have this item } // Check if item can be sold if (it->SellPrice == 0) { SendSellItem(vendorguid, itemguid, 2); return; } uint32 stackcount = item->GetUInt32Value(ITEM_FIELD_STACK_COUNT); uint32 quantity = 0; if (amount != 0) { quantity = amount; } else { quantity = stackcount; //allitems } if(quantity > stackcount) quantity = stackcount; //make sure we don't over do it uint32 price = GetSellPriceForItem(it, quantity); _player->ModUInt32Value(PLAYER_FIELD_COINAGE,price); if(quantity < stackcount) { item->SetCount(stackcount - quantity); item->m_isDirty = true; } else { //removing the item from the char's inventory item = _player->GetItemInterface()->SafeRemoveAndRetreiveItemByGuid(itemguid, false); //again to remove item from slot if(item) { _player->GetItemInterface()->AddBuyBackItem(item,(it->SellPrice) * quantity); } } WorldPacket data(SMSG_SELL_ITEM, 12); data << vendorguid << itemguid << uint8(0); SendPacket( &data ); sLog.outDetail( "WORLD: Sent SMSG_SELL_ITEM" ); }