From 23e418fb75bf1c5430ae3258f6fc00af9d7b5c2f Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 12 May 2020 00:18:45 +0900 Subject: [PATCH 1/6] Fix armory. --- src/common/Common.h | 58 +++++++++++++++-------------- src/world/Actor/PlayerInventory.cpp | 4 +- src/world/Manager/ItemMgr.cpp | 46 +++++++++++------------ src/world/Manager/ItemMgr.h | 2 +- 4 files changed, 56 insertions(+), 54 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 927b4f01..1d7c5fe2 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -159,44 +159,46 @@ namespace Sapphire::Common ModelRing2 = 9 }; - enum EquipSlotCategory : uint8_t + enum class EquipSlotCategory : uint8_t { - Unequippable = 0, - // main slots - CharaMainHand = 1, - CharaOffHand = 2, - CharaHead = 3, - CharaBody = 4, - CharaHands = 5, - CharaWaist = 6, - CharaLegs = 7, - CharaFeet = 8, - CharaEars = 9, - CharaNeck = 10, - CharaWrist = 11, - CharaRing = 12, - CharaSoulCrystal = 17, - - // specials + CharaMainHand = 0, + CharaOffHand = 1, + CharaHead = 2, + CharaBody = 3, + CharaHands = 4, + CharaWaist = 5, + CharaLegs = 6, + CharaFeet = 7, + CharaEars = 8, + CharaNeck = 9, + CharaWrist = 10, + CharaRing = 11, + CharaSoulCrystal = 12, + /* following slots not seem to exist any more. + when multi-slot gear is moved into equipment slot, normal slot listed above is used. + client will move any incompatible gears into armory but no InventoryModifiyHandler is sent. + server need to move those silently in order to sync with client. + */ + /*! Cannot equip gear to offhand slot */ - MainTwoHandedWeapon = 13, + //MainTwoHandedWeapon = 13, /*! Can be equipped in either main or offhand slot */ - MainOrOffHand = 14, // unused + //MainOrOffHand = 14, // unused /*! Cannot equip gear to head */ - BodyDisallowHead = 15, + //BodyDisallowHead = 15, /*! Cannot equip gear to hands, legs and feet slots */ - BodyDisallowHandsLegsFeet = 16, + //BodyDisallowHandsLegsFeet = 16, /*! Cannot equip gear to feet slot */ - LegsDisallowFeet = 18, + //LegsDisallowFeet = 18, /*! Cannot equp gear to head, hands, legs, feet slots */ - BodyDisallowAll = 19, + //BodyDisallowAll = 19, /*! Cannot equip gear to hands slot */ - BodyDisallowHands = 20, + //BodyDisallowHands = 20, /*! Cannot equip gear to legs & feet slots */ - BodyDisallowLegsFeet = 21, + //BodyDisallowLegsFeet = 21, }; enum InventoryType : uint16_t @@ -226,8 +228,8 @@ namespace Sapphire::Common ArmoryWaist = 3204, ArmoryLegs = 3205, ArmoryFeet = 3206, - ArmoryNeck = 3207, - ArmoryEar = 3208, + ArmoryEar = 3207, + ArmoryNeck = 3208, ArmoryWrist = 3209, ArmoryRing = 3300, diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 5f597444..06ea2cfb 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -548,7 +548,7 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil // add the related armoury bag to the applicable bags and try and fill a free slot there before falling back to regular inventory if( itemInfo->isEquippable && getEquipDisplayFlags() & StoreNewItemsInArmouryChest ) { - auto bag = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( itemInfo->equipSlotCategory ); + auto bag = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( itemInfo->equipSlotCategory ) ); bags.insert( bags.begin(), bag ); } @@ -802,7 +802,7 @@ void Sapphire::Entity::Player::swapItem( uint16_t fromInventoryId, uint8_t fromS && !World::Manager::ItemMgr::isArmory( fromInventoryId ) ) { updateContainer( fromInventoryId, fromSlotId, nullptr ); - fromInventoryId = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( toSlot ); + fromInventoryId = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( toSlot ) ); fromSlotId = static_cast < uint8_t >( m_storageMap[ fromInventoryId ]->getFreeSlot() ); } diff --git a/src/world/Manager/ItemMgr.cpp b/src/world/Manager/ItemMgr.cpp index a28cec61..3c08d82d 100644 --- a/src/world/Manager/ItemMgr.cpp +++ b/src/world/Manager/ItemMgr.cpp @@ -27,56 +27,56 @@ bool Sapphire::World::Manager::ItemMgr::isArmory( uint16_t containerId ) } -uint16_t Sapphire::World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( uint8_t slotId ) +uint16_t Sapphire::World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( Common::EquipSlotCategory slot ) { - switch( slotId ) + switch( slot ) { - case Common::CharaHead: + case Common::EquipSlotCategory::CharaHead: return Common::ArmoryHead; - case Common::CharaBody: - case Common::BodyDisallowHead: - case Common::BodyDisallowHandsLegsFeet: - case Common::BodyDisallowAll: - case Common::BodyDisallowHands: - case Common::BodyDisallowLegsFeet: + case Common::EquipSlotCategory::CharaBody: + //case Common::EquipSlotCategory::BodyDisallowHead: + //case Common::EquipSlotCategory::BodyDisallowHandsLegsFeet: + //case Common::EquipSlotCategory::BodyDisallowAll: + //case Common::EquipSlotCategory::BodyDisallowHands: + //case Common::EquipSlotCategory::BodyDisallowLegsFeet: return Common::ArmoryBody; - case Common::CharaEars: + case Common::EquipSlotCategory::CharaEars: return Common::ArmoryEar; - case Common::CharaFeet: + case Common::EquipSlotCategory::CharaFeet: return Common::ArmoryFeet; - case Common::CharaHands: + case Common::EquipSlotCategory::CharaHands: return Common::ArmoryHand; - case Common::CharaLegs: - case Common::LegsDisallowFeet: + case Common::EquipSlotCategory::CharaLegs: + //case Common::EquipSlotCategory::LegsDisallowFeet: return Common::ArmoryLegs; - case Common::CharaMainHand: - case Common::MainTwoHandedWeapon: - case Common::MainOrOffHand: + case Common::EquipSlotCategory::CharaMainHand: + //case Common::EquipSlotCategory::MainTwoHandedWeapon: + //case Common::EquipSlotCategory::MainOrOffHand: return Common::ArmoryMain; - case Common::CharaOffHand: + case Common::EquipSlotCategory::CharaOffHand: return Common::ArmoryOff; - case Common::CharaRing: + case Common::EquipSlotCategory::CharaRing: return Common::ArmoryRing; - case Common::CharaWaist: + case Common::EquipSlotCategory::CharaWaist: return Common::ArmoryWaist; - case Common::CharaWrist: + case Common::EquipSlotCategory::CharaWrist: return Common::ArmoryWrist; - case Common::CharaNeck: + case Common::EquipSlotCategory::CharaNeck: return Common::ArmoryNeck; - case Common::CharaSoulCrystal: + case Common::EquipSlotCategory::CharaSoulCrystal: return Common::ArmorySoulCrystal; default: diff --git a/src/world/Manager/ItemMgr.h b/src/world/Manager/ItemMgr.h index b24c56e9..6208cf94 100644 --- a/src/world/Manager/ItemMgr.h +++ b/src/world/Manager/ItemMgr.h @@ -20,7 +20,7 @@ namespace Sapphire::World::Manager static bool isOneHandedWeapon( Common::ItemUICategory weaponCategory ); static bool isArmory( uint16_t containerId ); static bool isEquipment( uint16_t containerId ); - static uint16_t getCharaEquipSlotCategoryToArmoryId( uint8_t slotId ); + static uint16_t getCharaEquipSlotCategoryToArmoryId( Common::EquipSlotCategory slot ); static Common::ContainerType getContainerType( uint32_t containerId ); }; From 0bf8977ab701a223af624136c5b61859f5ac4095 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 12 May 2020 02:30:21 +0900 Subject: [PATCH 2/6] Add LootMessage packet to fix old ItemObtainIcon. --- src/common/Common.h | 10 +++ src/common/Network/PacketDef/Ipcs.h | 2 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 13 +++ src/world/Actor/Player.h | 10 +-- src/world/Actor/PlayerInventory.cpp | 85 +++++++++++++++---- src/world/Actor/PlayerQuest.cpp | 6 +- .../Network/Handlers/GMCommandHandlers.cpp | 17 +++- 7 files changed, 112 insertions(+), 31 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 1d7c5fe2..efb6335b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -1229,6 +1229,16 @@ namespace Sapphire::Common } whm; }; + enum class LootMessageType : uint8_t + { + GetItem1 = 1, // p1: actorId, p4: itemId (HQ: itemId + 1,000,000 lol), p5: amount + GetItem2 = 3, // p1: actorId, p2: itemId, p3: amount, seems like same thing as GetItem1 but different param position. + FailedToGetLootNoFreeInventorySlot = 5, // p1: actorId + LootRolled = 7, // p1: actorId, p2: itemId, p3: amount + GetGil = 9, // p1: gil + EmptyCoffer = 11, // seems like no param + }; + using PlayerStateFlagList = std::vector< PlayerStateFlag >; } diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 286cb736..8e1a83ff 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -376,8 +376,8 @@ namespace Sapphire::Network::Packets PerformNoteHandler = 0x029B, // updated 4.3 - ShopMessage = 0x00C1, // updated 5.25 + LootMessage = 0x00B1, // updated 5.25 }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index d1c8edbd..08d485cc 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -2018,6 +2018,19 @@ namespace Sapphire::Network::Packets::Server uint32_t unknown7; }; + struct FFXIVIpcLootMessage : FFXIVIpcBasePacket< LootMessage > + { + Common::LootMessageType msgType; + uint8_t padding[3]; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + uint32_t param5; + uint32_t param6; + uint32_t param7; + }; + } #endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/ diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 6a26da75..926c995c 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -360,7 +360,7 @@ namespace Sapphire::Entity uint32_t getModelForSlot( Common::GearModelSlot slot ); /*! add amount to the currency of type */ - void addCurrency( Common::CurrencyType type, uint32_t amount ); + void addCurrency( Common::CurrencyType type, uint32_t amount, bool sendLootMessage = false ); /*! remove amount from the currency of type */ void removeCurrency( Common::CurrencyType type, uint32_t amount ); @@ -928,8 +928,8 @@ namespace Sapphire::Entity InvSlotPair getFreeBagSlot(); - ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool slient = false, bool canMerge = true ); - ItemPtr addItem( ItemPtr itemToAdd, bool slient = false, bool canMerge = true ); + ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool silent = false, bool canMerge = true, bool sendLootMessage = false ); + ItemPtr addItem( ItemPtr itemToAdd, bool silent = false, bool canMerge = true, bool sendLootMessage = false ); void moveItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ); @@ -964,7 +964,7 @@ namespace Sapphire::Entity uint32_t getCrystal( Common::CrystalType type ); /*! add amount to the crystal of type */ - void addCrystal( Common::CrystalType type, uint32_t amount ); + void addCrystal( Common::CrystalType type, uint32_t amount, bool sendLootMessage = false ); /*! remove amount from the crystals of type */ void removeCrystal( Common::CrystalType type, uint32_t amount ); @@ -980,7 +980,7 @@ namespace Sapphire::Entity void setActiveLand( uint8_t land, uint8_t ward ); Common::ActiveLand getActiveLand() const; - Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId, bool slient = false ); + Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId, bool silent = false ); // Job UI ////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 06ea2cfb..ff316229 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -298,7 +298,7 @@ void Sapphire::Entity::Player::unequipSoulCrystal( ItemPtr pItem ) } // TODO: these next functions are so similar that they could likely be simplified -void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount ) +void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount, bool sendLootMessage ) { auto slot = static_cast< uint8_t >( static_cast< uint8_t >( type ) - 1 ); auto currItem = m_storageMap[ Currency ]->getItem( slot ); @@ -321,6 +321,22 @@ void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount ) Common::InventoryType::Currency, *currItem ); queuePacket( invUpdate ); + + + if( sendLootMessage ) + { + switch( type ) + { + case CurrencyType::Gil: + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetGil; + lootMsg->data().param1 = amount; + queuePacket( lootMsg ); + break; + } + } + } } void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32_t amount ) @@ -346,7 +362,7 @@ void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32 } -void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t amount ) +void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t amount, bool sendLootMessage ) { auto currItem = m_storageMap[ Crystal ]->getItem( static_cast< uint8_t >( type ) - 1 ); @@ -371,7 +387,21 @@ void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t am Common::InventoryType::Crystal, *currItem ); queuePacket( invUpdate ); - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) ); + + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = currItem->getId(); + lootMsg->data().param3 = amount; + queuePacket( lootMsg ); + } + + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); } void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t amount ) @@ -524,7 +554,7 @@ bool Sapphire::Entity::Player::isObtainable( uint32_t catalogId, uint8_t quantit return true; } -Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool silent, bool canMerge ) +Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool silent, bool canMerge, bool sendLootMessage ) { auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); auto itemInfo = exdData.get< Sapphire::Data::Item >( itemToAdd->getId() ); @@ -591,13 +621,24 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil item->setStackSize( newStackSize ); writeItem( item ); - auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item ); - queuePacket( slotUpdate ); + if( !silent ) + { + auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item ); + queuePacket( slotUpdate ); + } // return existing stack if we have no overflow - items fit into a preexisting stack if( itemToAdd->getStackSize() == 0 ) { - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, itemToAdd->getId(), originalQuantity ) ); + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = itemToAdd->isHq() ? itemToAdd->getId() + 1000000 : itemToAdd->getId(); + lootMsg->data().param3 = originalQuantity; + queuePacket( lootMsg ); + } auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); soundEffectPacket->data().sequence = 0xFFFFFFFF; @@ -629,24 +670,32 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil { auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), freeBagSlot.second, freeBagSlot.first, *itemToAdd ); queuePacket( invUpdate ); - - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, itemToAdd->getId(), originalQuantity ) ); - - auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); - soundEffectPacket->data().sequence = 0xFFFFFFFF; - soundEffectPacket->data().type = 6; - queuePacket( soundEffectPacket ); } + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = itemToAdd->isHq() ? itemToAdd->getId() + 1000000 : itemToAdd->getId(); + lootMsg->data().param3 = originalQuantity; + queuePacket( lootMsg ); + } + + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); + return itemToAdd; } -Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent, bool canMerge ) +Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent, bool canMerge, bool sendLootMessage ) { auto item = createItem( catalogId, quantity ); item->setHq( isHq ); - return addItem( item, silent, canMerge ); + return addItem( item, silent, canMerge, sendLootMessage ); } void @@ -929,7 +978,7 @@ uint32_t Sapphire::Entity::Player::getNextInventorySequence() return m_inventorySequence++; } -Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common::InventoryType type, uint16_t slotId, bool slient ) +Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common::InventoryType type, uint16_t slotId, bool silent ) { auto& container = m_storageMap[ type ]; @@ -941,7 +990,7 @@ Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common: container->removeItem( slotId, false ); updateContainer( type, slotId, nullptr ); - if( !slient ) + if( !silent ) { auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slotId, static_cast< uint16_t >( type ) ); queuePacket( invUpdate ); diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index 854cdc13..f3b29c16 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -1065,7 +1065,7 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti { for( uint32_t i = 0; i < rewardItemCount; i++ ) { - addItem( questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ) ); + addItem( questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ), false, false, true, true ); } } @@ -1076,14 +1076,14 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti auto itemId = questInfo->itemReward1.at( i ); if( itemId == optionalChoice ) { - addItem( itemId, questInfo->itemCountReward1.at( i ) ); + addItem( itemId, questInfo->itemCountReward1.at( i ), false, false, true, true ); break; } } } if( gilReward > 0 ) - addCurrency( CurrencyType::Gil, gilReward ); + addCurrency( CurrencyType::Gil, gilReward, true ); return true; } diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 175c2ab9..2b5e5965 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -345,14 +345,23 @@ void Sapphire::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACK player.sendUrgent( "Syntaxerror." ); return; } + if( param1 <= 0x12 ) // crystal + { + targetPlayer->addCrystal( static_cast< Common::CrystalType >( param1 ), quantity, true ); + } + else // item + { + // decode using the epic SE style HQ item id + bool isHq = param1 > 1000000; - if( !targetPlayer->addItem( param1, quantity ) ) - player.sendUrgent( "Item #{0} could not be added to inventory.", param1 ); - break; + if( !targetPlayer->addItem( isHq ? param1 - 1000000 : param1, quantity, isHq, false, true, true ) ) + player.sendUrgent( "Item #{0} could not be added to inventory.", isHq ? param1 - 1000000 : param1 ); + break; + } } case GmCommand::Gil: { - targetPlayer->addCurrency( CurrencyType::Gil, param1 ); + targetPlayer->addCurrency( CurrencyType::Gil, param1, true ); player.sendNotice( "Added {0} Gil for {1}", param1, targetPlayer->getName() ); break; } From 10329dee60809d070389d74a31aadffc21c98291 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 12 May 2020 02:57:13 +0900 Subject: [PATCH 3/6] delete sold item from db --- src/world/Actor/Player.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 15c30e93..2027633c 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -2259,6 +2259,13 @@ void Sapphire::Entity::Player::addBuyBackItemForShop( uint32_t shopId, const Sap void Sapphire::Entity::Player::clearBuyBackMap() { + for( auto& list : m_shopBuyBackMap ) + { + for( auto& entry : list.second ) + { + deleteItemDb( entry.item ); + } + } m_shopBuyBackMap.clear(); } From 3ffc524ac65bf817895be967d8d3b577f0f48222 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 12 May 2020 03:06:04 +0900 Subject: [PATCH 4/6] also when logout --- src/world/Session.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/world/Session.cpp b/src/world/Session.cpp index 56bcc888..b446f293 100644 --- a/src/world/Session.cpp +++ b/src/world/Session.cpp @@ -72,6 +72,7 @@ void Sapphire::World::Session::close() // remove the session from the player if( m_pPlayer ) { + m_pPlayer->clearBuyBackMap(); // do one last update to db m_pPlayer->updateSql(); // reset the zone, so the zone handler knows to remove the actor From e0a3a69cc4442daeec58d7f4b634e8e03ea3a55d Mon Sep 17 00:00:00 2001 From: Flawed <33593723+ff14wed@users.noreply.github.com> Date: Mon, 11 May 2020 12:12:12 -0700 Subject: [PATCH 5/6] Fill in other known EventHandlerTypes --- src/world/Event/EventHandler.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/world/Event/EventHandler.h b/src/world/Event/EventHandler.h index 8b6016c6..9bec90a4 100644 --- a/src/world/Event/EventHandler.h +++ b/src/world/Event/EventHandler.h @@ -57,6 +57,7 @@ namespace Sapphire::Event Craft = 0x000A, CustomTalk = 0x000B, CompanyLeveOfficer = 0x000C, + Array = 0x000D, CraftLeve = 0x000E, GimmickAccessor = 0x000F, GimmickBill = 0x0010, @@ -72,8 +73,11 @@ namespace Sapphire::Event Story = 0x001A, SpecialShop = 0x001B, BahamutGuide = 0x001C, + InstanceContentGuide = 0x001D, HousingAethernet = 0x001E, FcTalk = 0x001F, + Adventure = 0x0021, + DailyQuestSupply = 0x0022, ICDirector = 0x8003, QuestBattleDirector = 0x8006, }; From 591d2ec5801eff49c6fbba40f916924b299df9bf Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 12 May 2020 04:15:52 +0900 Subject: [PATCH 6/6] should silent the sound effect as well --- src/world/Actor/PlayerInventory.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index ff316229..fbff6d66 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -639,12 +639,13 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil lootMsg->data().param3 = originalQuantity; queuePacket( lootMsg ); } - - auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); - soundEffectPacket->data().sequence = 0xFFFFFFFF; - soundEffectPacket->data().type = 6; - queuePacket( soundEffectPacket ); - + if( !silent ) + { + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); + } return item; } @@ -670,6 +671,11 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil { auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), freeBagSlot.second, freeBagSlot.first, *itemToAdd ); queuePacket( invUpdate ); + + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); } if( sendLootMessage ) @@ -682,11 +688,6 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool sil queuePacket( lootMsg ); } - auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); - soundEffectPacket->data().sequence = 0xFFFFFFFF; - soundEffectPacket->data().type = 6; - queuePacket( soundEffectPacket ); - return itemToAdd; }