[10047] Fixed show wrapped gifts in trade windows.

Also some fixes for trading related not full read packet spam.
This commit is contained in:
VladimirMangos 2010-06-08 22:55:52 +04:00
parent 6986ecbd9b
commit 59c8741e9b
2 changed files with 40 additions and 41 deletions

View file

@ -123,41 +123,39 @@ void WorldSession::SendUpdateTrade()
}
WorldPacket data(SMSG_TRADE_STATUS_EXTENDED, (100)); // guess size
data << (uint8 ) 1; // can be different (only seen 0 and 1)
data << (uint32) 0; // added in 2.4.0, this value must be equal to value from TRADE_STATUS_OPEN_WINDOW status packet (different value for different players to block multiple trades?)
data << (uint32) TRADE_SLOT_COUNT; // trade slots count/number?, = next field in most cases
data << (uint32) TRADE_SLOT_COUNT; // trade slots count/number?, = prev field in most cases
data << (uint32) _player->pTrader->tradeGold; // trader gold
data << (uint32) 0; // spell casted on lowest slot item
data << uint8(1); // can be different (only seen 0 and 1)
data << uint32(0); // added in 2.4.0, this value must be equal to value from TRADE_STATUS_OPEN_WINDOW status packet (different value for different players to block multiple trades?)
data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = next field in most cases
data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = prev field in most cases
data << uint32(_player->pTrader->tradeGold); // trader gold
data << uint32(0); // spell casted on lowest slot item
for(uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
{
data << (uint8) i; // trade slot number, if not specified, then end of packet
data << uint8(i); // trade slot number, if not specified, then end of packet
if (Item* item = _player->pTrader->GetItemByTradeSlot(i))
{
data << (uint32) item->GetProto()->ItemId; // entry
// display id
data << (uint32) item->GetProto()->DisplayInfoID;
// stack count
data << (uint32) item->GetUInt32Value(ITEM_FIELD_STACK_COUNT);
data << (uint32) 0; // probably gift=1, created_by=0?
// gift creator
data << (uint64) item->GetUInt64Value(ITEM_FIELD_GIFTCREATOR);
data << (uint32) item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT);
data << uint32(item->GetProto()->ItemId); // entry
data << uint32(item->GetProto()->DisplayInfoID);// display id
data << uint32(item->GetCount()); // stack count
// wrapped: hide stats but show giftcreator name
data << uint32(item->HasFlag(ITEM_FIELD_FLAGS,ITEM_FLAGS_WRAPPED) ? 1 : 0);
data << uint64(item->GetUInt64Value(ITEM_FIELD_GIFTCREATOR));
data << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
data << (uint32) item->GetEnchantmentId(EnchantmentSlot(enchant_slot));
data << uint32(item->GetEnchantmentId(EnchantmentSlot(enchant_slot)));
// creator
data << (uint64) item->GetUInt64Value(ITEM_FIELD_CREATOR);
data << (uint32) item->GetSpellCharges(); // charges
data << (uint32) item->GetItemSuffixFactor(); // SuffixFactor
// random properties id
data << (uint32) item->GetItemRandomPropertyId();
data << (uint32) item->GetProto()->LockID; // lock id
data << uint64(item->GetUInt64Value(ITEM_FIELD_CREATOR));
data << uint32(item->GetSpellCharges()); // charges
data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
data << uint32(item->GetItemRandomPropertyId());// random properties id
data << uint32(item->GetProto()->LockID); // lock id
// max durability
data << (uint32) item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
data << uint32(item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
// durability
data << (uint32) item->GetUInt32Value(ITEM_FIELD_DURABILITY);
data << uint32(item->GetUInt32Value(ITEM_FIELD_DURABILITY));
}
else
{
@ -245,8 +243,10 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[])
//==============================================================
void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
void WorldSession::HandleAcceptTradeOpcode(WorldPacket& recvPacket)
{
recvPacket.read_skip<uint32>(); // 7, amount traded slots ?
Item *myItems[TRADE_SLOT_TRADED_COUNT] = { NULL, NULL, NULL, NULL, NULL, NULL };
Item *hisItems[TRADE_SLOT_TRADED_COUNT] = { NULL, NULL, NULL, NULL, NULL, NULL };
bool myCanCompleteTrade=true,hisCanCompleteTrade=true;
@ -449,11 +449,12 @@ void WorldSession::HandleCancelTradeOpcode(WorldPacket& /*recvPacket*/)
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
{
uint64 ID;
recvPacket >> ID;
if (GetPlayer()->pTrader)
return;
uint64 ID;
if (!GetPlayer()->isAlive())
{
SendTradeStatus(TRADE_STATUS_YOU_DEAD);
@ -478,8 +479,6 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
return;
}
recvPacket >> ID;
Player* pOther = ObjectAccessor::FindPlayer( ID );
if (!pOther)
@ -548,13 +547,13 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket)
{
if(!_player->pTrader)
return;
uint32 gold;
recvPacket >> gold;
if(!_player->pTrader)
return;
// gold can be incorrect, but this is checked at trade finished.
_player->tradeGold = gold;
@ -563,9 +562,6 @@ void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket)
void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket)
{
if (!_player->pTrader)
return;
// send update
uint8 tradeSlot;
uint8 bag;
@ -575,6 +571,9 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket)
recvPacket >> bag;
recvPacket >> slot;
if (!_player->pTrader)
return;
// invalid slot number
if (tradeSlot >= TRADE_SLOT_COUNT)
{
@ -608,12 +607,12 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket)
void WorldSession::HandleClearTradeItemOpcode(WorldPacket& recvPacket)
{
if (!_player->pTrader)
return;
uint8 tradeSlot;
recvPacket >> tradeSlot;
if (!_player->pTrader)
return;
// invalid slot number
if (tradeSlot >= TRADE_SLOT_COUNT)
return;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "10046"
#define REVISION_NR "10047"
#endif // __REVISION_NR_H__