From 3023a7853385822eb345cdd4dfe9ae738f875017 Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 3 Dec 2021 22:21:18 +0100 Subject: [PATCH] Send linkshell action result after creation of linkshells. --- .../Network/PacketDef/Zone/ServerZoneDef.h | 12 ++++++++ src/scripts/common/CmnDefLinkShell.cpp | 15 +++++++--- src/world/Manager/EventMgr.cpp | 1 - src/world/Manager/LinkshellMgr.cpp | 29 +++++++++++++++++++ src/world/Manager/LinkshellMgr.h | 2 ++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 0b6e4cb1..ec97a18d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -120,6 +120,18 @@ namespace Sapphire::Network::Packets::WorldPackets::Server { int16_t ResultCount; }; + + struct FFXIVIpcLinkshellResult : FFXIVIpcBasePacket< LinkshellResult > + { + uint64_t LinkshellID; + uint64_t TargetCharacterID; + uint32_t UpPacketNo; + uint32_t Result; + uint8_t UpdateStatus; + uint8_t Identity; + char LinkshellName[32]; + char TargetName[32]; + }; struct FFXIVIpcInviteResult : FFXIVIpcBasePacket< InviteResult > { diff --git a/src/scripts/common/CmnDefLinkShell.cpp b/src/scripts/common/CmnDefLinkShell.cpp index 1e9c1069..445dfa86 100644 --- a/src/scripts/common/CmnDefLinkShell.cpp +++ b/src/scripts/common/CmnDefLinkShell.cpp @@ -36,7 +36,7 @@ public: } }; - eventMgr().playScene( player, getId(), 1, 0, callback ); + eventMgr().playScene( player, getId(), 1, HIDE_HOTBAR | NO_DEFAULT_CAMERA, callback ); } // create linkshell @@ -46,24 +46,31 @@ public: { auto ls = linkshellMgr().createLinkshell( result.resultString, player ); if( !ls ) + { eventMgr().resumeScene( player, result.eventId, result.sceneId, { 0x15a } ); + linkshellMgr().finishLinkshellCreation( result.resultString, 0x15a, player ); + } else + { eventMgr().resumeScene( player, result.eventId, result.sceneId, { 0 } ); + linkshellMgr().finishLinkshellCreation( result.resultString, 0, player ); + } + }; - eventMgr().playScene( player, getId(), 2, 0, callback ); + eventMgr().playScene( player, getId(), 2, HIDE_HOTBAR, callback ); } // rename linkshell void Scene00003( Entity::Player& player ) { - eventMgr().playScene( player, getId(), 3, 0 ); + eventMgr().playScene( player, getId(), 3, HIDE_HOTBAR ); } // remove linkshell void Scene00004( Entity::Player& player ) { - eventMgr().playScene( player, getId(), 4, 0 ); + eventMgr().playScene( player, getId(), 4, HIDE_HOTBAR ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index e65d6c5f..85dbb1e6 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -548,7 +548,6 @@ void EventMgr::resumeScene( Entity::Player& player, uint32_t eventId, uint32_t s if( !pEvent ) return; - pEvent->setPlayedScene( false ); pEvent->setEventReturnCallback( nullptr ); auto resumeEvent = makeZonePacket< FFXIVIpcResumeEventScene2 >( player.getId() ); resumeEvent->data().handlerId = eventId; diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index e58f0cee..a9703ff7 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -1,16 +1,33 @@ #include #include +#include +#include +#include +#include + #include #include #include #include +#include #include "Linkshell/Linkshell.h" #include "LinkshellMgr.h" #include "Actor/Player.h" +#include "WorldServer.h" + +#include +#include +#include + +using namespace Sapphire::Common; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::WorldPackets::Server; +using namespace Sapphire::World::Manager; + bool Sapphire::World::Manager::LinkshellMgr::loadLinkshells() { auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); @@ -154,6 +171,18 @@ Sapphire::LinkshellPtr Sapphire::World::Manager::LinkshellMgr::createLinkshell( return lsPtr; } +void Sapphire::World::Manager::LinkshellMgr::finishLinkshellCreation( const std::string& name, uint32_t result, Entity::Player& player ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + + auto linkshellResult = makeZonePacket< FFXIVIpcLinkshellResult >( player.getId() ); + linkshellResult->data().Result = result; + linkshellResult->data().UpPacketNo = 1; + linkshellResult->data().Identity = 0xFF; + strcpy( linkshellResult->data().LinkshellName, name.c_str() ); + server.queueForPlayer( player.getCharacterId(), linkshellResult ); + +} const std::vector< Sapphire::LinkshellPtr > Sapphire::World::Manager::LinkshellMgr::getPlayerLinkshells( Entity::Player& player ) const { diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index 3274881d..91d7ff75 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -25,6 +25,8 @@ namespace Sapphire::World::Manager // create new linkshell entry and insert into db LinkshellPtr createLinkshell( const std::string& name, Entity::Player& player ); + void finishLinkshellCreation( const std::string& name, uint32_t result, Entity::Player& player ); + // get all linkshells associated with player const std::vector< LinkshellPtr > getPlayerLinkshells( Entity::Player& player ) const;