From 964716d2ee04517495993cf87fef241b429e5519 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Thu, 17 Feb 2022 03:55:21 +0100 Subject: [PATCH 1/5] Implement FcTalk --- src/scripts/common/FcTalk.cpp | 56 ++++++++++++++++++++++++++++++++++ src/world/Manager/EventMgr.cpp | 5 +++ 2 files changed, 61 insertions(+) create mode 100644 src/scripts/common/FcTalk.cpp diff --git a/src/scripts/common/FcTalk.cpp b/src/scripts/common/FcTalk.cpp new file mode 100644 index 00000000..cdcbaf23 --- /dev/null +++ b/src/scripts/common/FcTalk.cpp @@ -0,0 +1,56 @@ +#include +#include + +#include + +using namespace Sapphire; + +class FcTalk : + public Sapphire::ScriptAPI::EventScript +{ +public: + FcTalk() : + Sapphire::ScriptAPI::EventScript( 0x001F0000 ) + { + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& exdData = Common::Service< Data::ExdData >::ref(); + auto switchTalk = exdData.getRow< Excel::SwitchTalk >( eventId ); + uint32_t talkEvent = 0; + + if( !switchTalk ) + return; + + for( auto entry = 15; entry >= 0; entry-- ) + { + auto caseCondition = switchTalk->data().TalkCase[ entry ].CaseCondition; + + if( ( caseCondition >> 16 ) == Event::EventHandler::EventHandlerType::Quest && player.isQuestCompleted( caseCondition ) ) + { + talkEvent = switchTalk->data().TalkCase[ entry ].Talk; + break; + } + else + { + talkEvent = switchTalk->data().TalkCase[ 0 ].Talk; + } + } + + if( talkEvent == 0 ) + return; + + eventMgr().eventStart( player, actorId, eventId, Event::EventHandler::EventType::Talk, 0, 0 ); + eventMgr().eventStart( player, actorId, talkEvent, Event::EventHandler::EventType::Nest, 0, 5 ); + + eventMgr().playScene( player, talkEvent, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, { 0 }, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + eventMgr().eventFinish( player, talkEvent, 1 ); + eventMgr().eventFinish( player, eventId, 1 ); + } ); + } +}; + +EXPOSE_SCRIPT( FcTalk ); \ No newline at end of file diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index 412d32da..62d325cf 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -136,6 +136,11 @@ std::string EventMgr::getEventName( uint32_t eventId ) }*/ //return unknown + "GilShop"; } + + case Event::EventHandler::EventHandlerType::FcTalk: + { + return "FcTalk"; + } default: { return unknown; From 4df4d05b5c1a32ebdc050698bc6e0c2ab51c62c8 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Thu, 17 Feb 2022 03:55:46 +0100 Subject: [PATCH 2/5] Fix SwitchTalk exd struct --- deps/datReader/Exd/Structs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/deps/datReader/Exd/Structs.h b/deps/datReader/Exd/Structs.h index 6bb0feda..cdcb3f21 100644 --- a/deps/datReader/Exd/Structs.h +++ b/deps/datReader/Exd/Structs.h @@ -3339,6 +3339,7 @@ namespace Excel struct SwitchTalk { SwitchTalkCaseStruct TalkCase[16]; + uint32_t Unknown1; }; /* 362351 */ From e7fb339eefbb3bd662d5f428784fa116c3e64fe6 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Thu, 17 Feb 2022 04:20:25 +0100 Subject: [PATCH 3/5] Implement SmallTalk (menus not working) --- src/scripts/common/SmallTalk.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/scripts/common/SmallTalk.cpp diff --git a/src/scripts/common/SmallTalk.cpp b/src/scripts/common/SmallTalk.cpp new file mode 100644 index 00000000..c467458f --- /dev/null +++ b/src/scripts/common/SmallTalk.cpp @@ -0,0 +1,27 @@ +#include +#include + +using namespace Sapphire; + +class SmallTalk : + public Sapphire::ScriptAPI::EventScript +{ +public: + SmallTalk() : + Sapphire::ScriptAPI::EventScript( 0x000B0000 ) + { + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + eventMgr().eventStart( player, actorId, eventId, Event::EventHandler::EventType::Talk, 0, 0 ); + + eventMgr().playScene( player, eventId, 0, HIDE_HOTBAR, { 0 }, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + eventMgr().eventFinish( player, eventId, 1 ); + } ); + } +}; + +EXPOSE_SCRIPT( SmallTalk ); \ No newline at end of file From 50102e0ff0d27b772481788ae28ffb831f302107 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Thu, 17 Feb 2022 04:26:19 +0100 Subject: [PATCH 4/5] Add method for quest completion --- src/world/Actor/Player.h | 2 ++ src/world/Actor/PlayerQuest.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index df7fea04..02d0db58 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -107,6 +107,8 @@ namespace Sapphire::Entity /*! remove a given quest */ void removeQuest( uint16_t questId ); + bool isQuestCompleted( uint32_t questId ); + /*! add a quest to the completed quests mask */ void updateQuestsCompleted( uint32_t questId ); diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index c0409141..1cade20b 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -152,6 +152,16 @@ void Sapphire::Entity::Player::updateQuestsCompleted( uint32_t questId ) m_questCompleteFlags[ index ] |= value; } +bool Sapphire::Entity::Player::isQuestCompleted( uint32_t questId ) +{ + uint8_t index = questId / 8; + uint8_t bitIndex = ( questId ) % 8; + + uint8_t value = 0x80 >> bitIndex; + + return m_questCompleteFlags[ index ] & value; +} + void Sapphire::Entity::Player::removeQuestsCompleted( uint32_t questId ) { uint8_t index = questId / 8; From b151906f172df3c38628a60452d76a805d544b65 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Thu, 17 Feb 2022 08:19:52 +0100 Subject: [PATCH 5/5] Remove unnecessary eventStart and Sastasha seq fix --- src/scripts/common/FcTalk.cpp | 10 +--------- src/scripts/common/SmallTalk.cpp | 8 +------- src/scripts/instances/dungeons/Sastasha.cpp | 14 +++++++------- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/scripts/common/FcTalk.cpp b/src/scripts/common/FcTalk.cpp index cdcbaf23..65c3efc6 100644 --- a/src/scripts/common/FcTalk.cpp +++ b/src/scripts/common/FcTalk.cpp @@ -41,15 +41,7 @@ public: if( talkEvent == 0 ) return; - eventMgr().eventStart( player, actorId, eventId, Event::EventHandler::EventType::Talk, 0, 0 ); - eventMgr().eventStart( player, actorId, talkEvent, Event::EventHandler::EventType::Nest, 0, 5 ); - - eventMgr().playScene( player, talkEvent, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, { 0 }, - [ & ]( Entity::Player& player, const Event::SceneResult& result ) - { - eventMgr().eventFinish( player, talkEvent, 1 ); - eventMgr().eventFinish( player, eventId, 1 ); - } ); + eventMgr().playScene( player, talkEvent, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, { 0 }, nullptr ); } }; diff --git a/src/scripts/common/SmallTalk.cpp b/src/scripts/common/SmallTalk.cpp index c467458f..67dadd1d 100644 --- a/src/scripts/common/SmallTalk.cpp +++ b/src/scripts/common/SmallTalk.cpp @@ -14,13 +14,7 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - eventMgr().eventStart( player, actorId, eventId, Event::EventHandler::EventType::Talk, 0, 0 ); - - eventMgr().playScene( player, eventId, 0, HIDE_HOTBAR, { 0 }, - [ & ]( Entity::Player& player, const Event::SceneResult& result ) - { - eventMgr().eventFinish( player, eventId, 1 ); - } ); + eventMgr().playScene( player, eventId, 0, HIDE_HOTBAR, { 0 }, nullptr ); } }; diff --git a/src/scripts/instances/dungeons/Sastasha.cpp b/src/scripts/instances/dungeons/Sastasha.cpp index 6b0a1bcc..736e1795 100644 --- a/src/scripts/instances/dungeons/Sastasha.cpp +++ b/src/scripts/instances/dungeons/Sastasha.cpp @@ -29,8 +29,7 @@ private: enum Variables : uint8_t { - Coral, - ObtainedKey + Coral }; enum Sequence : uint8_t @@ -38,7 +37,8 @@ private: Seq1 = 1, Seq2 = 3, Seq3 = 7, - Seq4 = 15, + Seq4 = 23, + Seq5 = 31, SeqFinish = 255 }; @@ -210,7 +210,7 @@ public: [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) { eobj.setPermissionInvisibility( 1 ); - instance.setCustomVar( ObtainedKey, true ); + instance.setVar( 0, Seq4 ); instance.sendEventLogMessage( player, instance, 2031, { 2000512 } ); }, nullptr, getId() ); @@ -223,7 +223,7 @@ public: [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) { eobj.setPermissionInvisibility( 1 ); - instance.setVar( 0, Seq4 ); + instance.setVar( 0, Seq5 ); instance.sendEventLogMessage( player, instance, 2031, { 2000513 } ); denn = instance.createBNpcFromInstanceId( 3978771, 1000, Common::BNpcType::Enemy ); }, @@ -231,8 +231,8 @@ public: } // Open the door if the right key has been obtained - if( ( eobj.getName() == "Captainsquarters" && instance.getCustomVar( ObtainedKey ) ) || - ( eobj.getName() == "WaveriderGate" && instance.getDirectorVar( 0 ) == Seq4 ) ) + if( ( eobj.getName() == "Captainsquarters" && instance.getDirectorVar( 0 ) == Seq4 ) || + ( eobj.getName() == "WaveriderGate" && instance.getDirectorVar( 0 ) == Seq5 ) ) { eventMgr().playScene( player, eventId, 1, HIDE_HOTBAR, { 1 }, [ & ]( Entity::Player& player, const Event::SceneResult& result )