diff --git a/src/common/Common.h b/src/common/Common.h index 40225fdc..2e49c81e 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -49,13 +49,13 @@ namespace Sapphire::Common uint8_t plot; }; - enum InventoryOperation : uint8_t + enum InventoryOperation : uint16_t { - Discard = 0x07, - Move = 0x08, - Swap = 0x09, - Merge = 0x0C, - Split = 0x0A + Discard = 0x2EB, + Move = 0x2EC, + Swap = 0x2ED, + Merge = 0x2F0, + Split = 0x2EE }; enum ClientLanguage : uint8_t diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index ba845a20..c5a9db0f 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -158,7 +158,7 @@ namespace Sapphire::Network::Packets PlayerStateFlags = 0x032B, // updated 5.2 PlayerClassInfo = 0x039A, // updated 5.2 - ModelEquip = 0x02E6, // updated 5.18 + ModelEquip = 0x03C9, // updated 5.2 Examine = 0x038B, // updated 5.2 CharaNameReq = 0x0116, // updated 5.18 @@ -194,10 +194,10 @@ namespace Sapphire::Network::Packets EventLinkshell = 0x1169, QuestActiveList = 0x017B, // updated 5.2 - QuestUpdate = 0x0066, // updated 5.18 + QuestUpdate = 0x02CE, // updated 5.2 QuestCompleteList = 0x0255, // updated 5.2 - QuestFinish = 0x013A, // updated 5.18 + QuestFinish = 0x006F, // updated 5.2 MSQTrackerComplete = 0x01D6, // updated 5.0 MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 @@ -353,9 +353,9 @@ namespace Sapphire::Network::Packets TalkEventHandler = 0x0340, // updated 5.2 EmoteEventHandler = 0x0183, // updated 5.18 - WithinRangeEventHandler = 0x0167, // updated 5.18 - OutOfRangeEventHandler = 0x02B5, // updated 5.18 - EnterTeriEventHandler = 0x0267, // updated 5.18 + WithinRangeEventHandler = 0x010E, // updated 5.2 + OutOfRangeEventHandler = 0x00AE, // updated 5.2 + EnterTeriEventHandler = 0x00C1, // updated 5.2 ShopEventHandler = 0x0156, // updated 5.0 ReturnEventHandler = 0x027F, // updated 5.2 diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 9c8d0fc0..d486ee42 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -217,7 +217,7 @@ struct FFXIVIpcInventoryModifyHandler : { /* 0000 */ uint32_t seq; /* 0004 */ Common::InventoryOperation action; - /* 0005 */ uint8_t pad_0005[7]; + /* 0006 */ uint8_t pad_0006[6]; /* 000C */ uint16_t fromContainer; /* 000E */ uint8_t pad_000E[2]; /* 0010 */ uint8_t fromSlot; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index d0c53886..d8b90a7c 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1295,8 +1295,7 @@ namespace Sapphire::Network::Packets::Server struct FFXIVIpcInventoryTransaction : FFXIVIpcBasePacket< InventoryTransaction > { uint32_t sequence; - uint8_t type; - uint8_t padding; + uint16_t type; uint16_t padding1; uint32_t ownerId; uint32_t storageId; diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 26984e17..7dd294db 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -918,7 +918,7 @@ namespace Sapphire::Entity InvSlotPair getFreeBagSlot(); - Sapphire::ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool slient = false ); + Sapphire::ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool slient = false, bool canMerge = true ); void moveItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ); diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index fe89ca81..963830ae 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -534,7 +534,7 @@ bool Sapphire::Entity::Player::isObtainable( uint32_t catalogId, uint8_t quantit } -Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent ) +Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent, bool canMerge ) { auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); @@ -570,10 +570,13 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ for( uint8_t slot = 0; slot < storage->getMaxSize(); slot++ ) { + if( !canMerge && foundFreeSlot ) + break; + auto item = storage->getItem( slot ); // add any items that are stackable - if( item && !itemInfo->isEquippable && item->getId() == catalogId ) + if( canMerge && item && !itemInfo->isEquippable && item->getId() == catalogId ) { uint32_t count = item->getStackSize(); uint32_t maxStack = item->getMaxStackSize(); @@ -742,7 +745,7 @@ void Sapphire::Entity::Player::splitItem( uint16_t fromInventoryId, uint8_t from // todo: correct invalid move? again, not sure what retail does here return; - auto newItem = addItem( fromItem->getId(), itemCount, fromItem->isHq(), true ); + auto newItem = addItem( fromItem->getId(), itemCount, fromItem->isHq(), true, false ); if( !newItem ) return; @@ -840,7 +843,7 @@ void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint8_t fr invTransPacket->data().catalogId = fromItem->getId(); invTransPacket->data().stackSize = fromItem->getStackSize(); invTransPacket->data().slotId = fromSlotId; - invTransPacket->data().type = 7; + invTransPacket->data().type = Common::InventoryOperation::Discard; queuePacket( invTransPacket ); auto invTransFinPacket = makeZonePacket< FFXIVIpcInventoryTransactionFinish >( getId() );