From 7f4184bfbcd6988a5880588732084b90c988fdd3 Mon Sep 17 00:00:00 2001 From: collett Date: Sun, 5 Jan 2020 05:14:38 +0900 Subject: [PATCH 1/3] Move quest finish packet to where it belongs to so we can abandon quests. --- src/world/Actor/PlayerQuest.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index e503a273..48b9fbc0 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -15,14 +15,19 @@ using namespace Sapphire::Network::Packets::Server; void Sapphire::Entity::Player::finishQuest( uint16_t questId ) { - int8_t idx = getQuestIndex( questId ); removeQuest( questId ); + + auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() ); + questFinishPacket->data().questId = questId; + questFinishPacket->data().flag1 = 1; + questFinishPacket->data().flag2 = 1; + queuePacket( questFinishPacket ); + updateQuestsCompleted( questId ); - sendQuestTracker(); - + //sendQuestTracker(); already sent in removeQuest() } void Sapphire::Entity::Player::unfinishQuest( uint16_t questId ) @@ -33,24 +38,16 @@ void Sapphire::Entity::Player::unfinishQuest( uint16_t questId ) void Sapphire::Entity::Player::removeQuest( uint16_t questId ) { - int8_t idx = getQuestIndex( questId ); if( ( idx != -1 ) && ( m_activeQuests[ idx ] != nullptr ) ) { - auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); questUpdatePacket->data().slot = static_cast< uint8_t >( idx ); questUpdatePacket->data().questInfo.c.questId = 0; questUpdatePacket->data().questInfo.c.sequence = 0xFF; queuePacket( questUpdatePacket ); - auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() ); - questFinishPacket->data().questId = questId; - questFinishPacket->data().flag1 = 1; - questFinishPacket->data().flag2 = 1; - queuePacket( questFinishPacket ); - for( int32_t ii = 0; ii < 5; ii++ ) { if( m_questTracking[ ii ] == idx ) @@ -67,7 +64,6 @@ void Sapphire::Entity::Player::removeQuest( uint16_t questId ) } sendQuestTracker(); - } bool Sapphire::Entity::Player::hasQuest( uint32_t questId ) From a588adca8c54342645b8f3d00bf377600ea72113 Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 3 Jan 2020 01:10:42 +0900 Subject: [PATCH 2/3] Fix quest reward choice. Quest scripts need to call player.giveQuestRewards( getId(), result.param3 ) for it to work. --- src/world/Actor/PlayerQuest.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index e503a273..0710244f 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -1067,7 +1067,7 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti if( rewardItemCount > 0 ) { - for( uint32_t i = 0; i < questInfo->itemReward0.size(); i++ ) + for( uint32_t i = 0; i < rewardItemCount; i++ ) { addItem( questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ) ); } @@ -1075,8 +1075,15 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti if( optionalItemCount > 0 ) { - auto itemId = questInfo->itemReward1.at( optionalChoice ); - addItem( itemId, questInfo->itemCountReward1.at( optionalChoice ) ); + for( uint32_t i = 0; i < optionalItemCount; i++ ) + { + auto itemId = questInfo->itemReward1.at( i ); + if( itemId == optionalChoice ) + { + addItem( itemId, questInfo->itemCountReward1.at( i ) ); + break; + } + } } if( gilReward > 0 ) From bab1d384c2ab053983cb4e2f3d84beacbd97f883 Mon Sep 17 00:00:00 2001 From: collett Date: Sun, 5 Jan 2020 06:20:50 +0900 Subject: [PATCH 3/3] Inventory fixes. --- src/common/Network/PacketDef/Ipcs.h | 6 +++--- src/world/Actor/PlayerInventory.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 2e4e2ae3..689e9bd7 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -171,11 +171,11 @@ namespace Sapphire::Network::Packets ItemInfo = 0x00F2, // updated 5.18 ContainerInfo = 0x01F2, // updated 5.18 - InventoryTransactionFinish = 0x01AB, // updated 5.1 - InventoryTransaction = 0x023E, // updated 5.1 + InventoryTransactionFinish = 0x00D2, // updated 5.18 + InventoryTransaction = 0x0233, // updated 5.18 CurrencyCrystalInfo = 0x02BF, // updated 5.18 - InventoryActionAck = 0x0084, // updated 5.1 + InventoryActionAck = 0x02FA, // updated 5.18 UpdateInventorySlot = 0x0370, // updated 5.18 HuntingLogEntry = 0x01B3, // updated 5.0 diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index fe680fc5..4b219668 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -607,6 +607,11 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ { queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) ); + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); + return item; } @@ -638,6 +643,11 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ queuePacket( invUpdate ); queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) ); + + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); } return item;