diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 98eeda5c..6524d7fc 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1093,6 +1093,17 @@ struct FFXIVIpcEventFinish : FFXIVIpcBasePacket /* 000C */ uint32_t padding1; }; +struct FFXIVIpcEventOpenGilShop : FFXIVIpcBasePacket +{ + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t sceneFlags; + + uint32_t unknown_wtf[0x101]; +}; + /** * Structural representation of the packet sent by the server diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp new file mode 100644 index 00000000..c72256fe --- /dev/null +++ b/src/servers/Scripts/common/GilShop.cpp @@ -0,0 +1,19 @@ +#include +#include + +class GilShop : public EventScript +{ +public: + GilShop() : EventScript( 0x00041 ) + {} + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto callback = [actorId]( Entity::Player& player, const Event::SceneResult& result ) + { + player.playGilShop( actorId, result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA ); + }; + + player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, 0, 2, callback ); + } +}; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 33dc78f5..276610c2 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -58,6 +58,8 @@ public: /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); + void playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ); + void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, uint32_t eventParam4, uint32_t eventParam5 = 0 ); /*! play a subevent */ diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 243474e0..1d877b10 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -133,6 +133,26 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } +void Core::Entity::Player::playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ) +{ + auto pEvent = getEvent( eventId ); + if( !pEvent ) + { + auto pLog = g_fw.get< Logger >(); + pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); + openGilShopPacket->data().eventId = eventId; + openGilShopPacket->data().sceneFlags = flags; + openGilShopPacket->data().actorId = actorId; + + openGilShopPacket->data().scene = 10; + + queuePacket( openGilShopPacket ); +} + Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t eventId, uint32_t flags ) { if( flags & 0x02 ) diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index 78424df8..fe87b6a4 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -182,6 +182,10 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI if( !aetherInfo->isAetheryte ) scriptId = EVENTSCRIPT_AETHERNET_ID; } + else if( eventType == Event::EventHandler::EventHandlerType::Shop ) + { + scriptId = 0x00041; + } auto script = m_nativeScriptMgr->getScript< EventScript >( scriptId ); if( !script )