From 866103c9d53ede070a6569482c0b94fc1989f33d Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 13 Jan 2025 12:53:40 +0100 Subject: [PATCH] Timpoint for actiontimeline --- src/common/Network/CommonActorControl.h | 1 + src/world/Encounter/Timepoint.cpp | 66 ++++++++++++++++++------- src/world/Encounter/Timepoint.h | 13 +++++ 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index ade46b224..cc83705b0 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -210,6 +210,7 @@ namespace Sapphire::Network::ActorControl */ AetherReductionDlg = 0x17D, + PlayActionTimeline = 0x197, /*! * param1 = state * param2 = actorid diff --git a/src/world/Encounter/Timepoint.cpp b/src/world/Encounter/Timepoint.cpp index dbeebfab7..705debe40 100644 --- a/src/world/Encounter/Timepoint.cpp +++ b/src/world/Encounter/Timepoint.cpp @@ -19,6 +19,9 @@ #include #include +#include +#include + namespace Sapphire::Encounter { const TimepointDataPtr Timepoint::getData() const @@ -52,25 +55,26 @@ namespace Sapphire::Encounter { const static std::unordered_map< std::string, TimepointDataType > timepointTypeMap = { - { "idle", TimepointDataType::Idle }, - { "castAction", TimepointDataType::CastAction }, - { "setPos", TimepointDataType::SetPos }, - - { "logMessage", TimepointDataType::LogMessage }, - { "battleTalk", TimepointDataType::BattleTalk }, - - { "directorVar", TimepointDataType::DirectorVar }, - { "directorSeq", TimepointDataType::DirectorSeq }, - { "directorFlags", TimepointDataType::DirectorFlags }, - - { "bNpcDespawn", TimepointDataType::BNpcDespawn }, - { "bNpcSpawn", TimepointDataType::BNpcSpawn }, - { "bNpcFlags", TimepointDataType::BNpcFlags }, - { "setEObjState", TimepointDataType::SetEObjState }, - { "setBGM", TimepointDataType::SetBgm }, - - { "setCondition", TimepointDataType::SetCondition }, - { "snapshot", TimepointDataType::Snapshot } + { "idle", TimepointDataType::Idle }, + { "castAction", TimepointDataType::CastAction }, + { "setPos", TimepointDataType::SetPos }, + { "playActionTimeLine", TimepointDataType::ActionTimeLine }, + + { "logMessage", TimepointDataType::LogMessage }, + { "battleTalk", TimepointDataType::BattleTalk }, + + { "directorVar", TimepointDataType::DirectorVar }, + { "directorSeq", TimepointDataType::DirectorSeq }, + { "directorFlags", TimepointDataType::DirectorFlags }, + + { "bNpcDespawn", TimepointDataType::BNpcDespawn }, + { "bNpcSpawn", TimepointDataType::BNpcSpawn }, + { "bNpcFlags", TimepointDataType::BNpcFlags }, + { "setEObjState", TimepointDataType::SetEObjState }, + { "setBGM", TimepointDataType::SetBgm }, + + { "setCondition", TimepointDataType::SetCondition }, + { "snapshot", TimepointDataType::Snapshot } }; const static std::unordered_map< std::string, DirectorOpId > directorOpMap = @@ -149,6 +153,15 @@ namespace Sapphire::Encounter pos[ 0 ], pos[ 1 ], pos[ 2 ], rot ); } break; + case TimepointDataType::ActionTimeLine: + { + auto& dataJ = json.at( "data" ); + auto action = dataJ.at( "action" ).get< uint32_t >(); + auto actorRef = dataJ.at( "actorName" ).get< std::string >(); + + m_pData = std::make_shared< TimepointDataActionTimeLine >( actorRef, action ); + } + break; case TimepointDataType::LogMessage: { auto& dataJ = json.at( "data" ); @@ -446,6 +459,21 @@ namespace Sapphire::Encounter } } break; + + case TimepointDataType::ActionTimeLine: + { + auto pActionTimelineData = std::dynamic_pointer_cast< TimepointDataActionTimeLine, TimepointData >( m_pData ); + auto pBNpc = pack.getBNpcByRef( pActionTimelineData->m_actorRef, pTeri ); + auto action = pActionTimelineData->m_actionId; + + if( pBNpc ) + { + Network::Util::Packet::sendActorControl( pBNpc->getInRangePlayerIds(), pBNpc->getId(), + Network::ActorControl::PlayActionTimeline, action ); + } + } + break; + /* case TimepointDataType::MoveTo: { diff --git a/src/world/Encounter/Timepoint.h b/src/world/Encounter/Timepoint.h index e1aa726cd..87ccc6742 100644 --- a/src/world/Encounter/Timepoint.h +++ b/src/world/Encounter/Timepoint.h @@ -18,6 +18,7 @@ namespace Sapphire::Encounter Idle, CastAction, SetPos, + ActionTimeLine, LogMessage, BattleTalk, @@ -113,6 +114,18 @@ namespace Sapphire::Encounter } }; + struct TimepointDataActionTimeLine : public TimepointData { + std::string m_actorRef; + uint32_t m_actionId; + + TimepointDataActionTimeLine( const std::string& actorRef, uint32_t action ) : + TimepointData( TimepointDataType::ActionTimeLine ), + m_actorRef( actorRef ), + m_actionId( action ) + { + } + }; + struct TimepointDataSetPos : public TimepointData { // todo: use internal id std::string m_actorRef;