From d3f9b92aa1b73633492896aa31025892b4e585ee Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 16 Feb 2022 09:41:28 +0100 Subject: [PATCH 1/4] Fix more director event IDs --- src/world/Territory/InstanceContent.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/world/Territory/InstanceContent.h b/src/world/Territory/InstanceContent.h index 8621dfc6..7eb45d41 100644 --- a/src/world/Territory/InstanceContent.h +++ b/src/world/Territory/InstanceContent.h @@ -40,17 +40,18 @@ namespace Sapphire DutyCommence = 0x40000001, DutyComplete = 0x40000002, SetStringendoMode = 0x40000003, - BattleGroundMusic = 0x40000004, - InvalidateTodoList = 0x40000005, - LoadingScreen = 0x40000007, - Forward = 0x40000008, + SetDutyTime = 0x40000004, + LoadingScreen = 0x40000005, + Forward = 0x40000006, + BattleGroundMusic = 0x40000007, + InvalidateTodoList = 0x40000008, VoteState = 0x40000009, VoteStart = 0x4000000A, VoteResult = 0x4000000B, VoteFinish = 0x4000000C, - TreasureVoteRefresh = 0x4000000D, - SetSharedGroupId = 0x4000000E, - FirstTimeNotify = 0x4000000F + FirstTimeNotify = 0x4000000D, + TreasureVoteRefresh = 0x4000000E, + SetSharedGroupId = 0x4000000F, }; enum EventHandlerOrderId : uint32_t From cbb1b54b4add7220f063990f18801793de661328 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 16 Feb 2022 09:43:27 +0100 Subject: [PATCH 2/4] Cleaner way to send EventLogMessage packets --- src/world/Event/Director.cpp | 59 ++------ src/world/Event/Director.h | 2 +- .../PacketWrappers/EventLogMessagePacket.h | 128 ++++++++++++++++++ 3 files changed, 143 insertions(+), 46 deletions(-) create mode 100644 src/world/Network/PacketWrappers/EventLogMessagePacket.h diff --git a/src/world/Event/Director.cpp b/src/world/Event/Director.cpp index 07906b01..104f1875 100644 --- a/src/world/Event/Director.cpp +++ b/src/world/Event/Director.cpp @@ -2,13 +2,12 @@ #include -#include +#include #include #include #include "Actor/Player.h" -#include "Network/PacketDef/Zone/ServerZoneDef.h" #include "Network/PacketWrappers/ActorControlPacket.h" #include "Network/PacketWrappers/ActorControlSelfPacket.h" #include @@ -20,7 +19,6 @@ using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; -using namespace Sapphire::Network::Packets::WorldPackets; using namespace Sapphire::Network::Packets::WorldPackets::Server; using namespace Sapphire::Network::ActorControl; @@ -49,67 +47,38 @@ uint8_t Sapphire::Event::Director::getSequence() const return m_sequence; } -void Sapphire::Event::Director::sendEventLogMessage( Sapphire::Entity::Player& player, Sapphire::InstanceContent& instance, uint32_t msgId, std::vector< uint32_t > args ) const +void Sapphire::Event::Director::sendEventLogMessage( Sapphire::Entity::Player& player, Sapphire::InstanceContent& instance, uint32_t msgId, std::initializer_list< uint32_t > args ) const { + FFXIVPacketBasePtr packet = nullptr; + + assert( args.size() <= 32 ); + if( args.size() == 0 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessageHeader >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - instance.queuePacketForZone( player, packet, true ); + packet = std::move( std::make_shared< class EventLogMessageHeader >( player, instance.getDirectorId(), msgId ) ); } else if( args.size() <= 2 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessage2 >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - std::copy( args.begin(), args.end(), packet->data().args ); - instance.queuePacketForZone( player, packet, true ); - Logger::debug( "arg size: {}", packet->data().numOfArgs ); - Logger::debug( - "Dump:\n{0}", - Util::binaryToHexDump( const_cast< uint8_t* >( &packet->getContent()[ 0 ] ), - static_cast< uint16_t >( packet->getContentSize() ) ) - ); + packet = std::move( std::make_shared< class EventLogMessage2 >( player, instance.getDirectorId(), msgId, args ) ); } else if( args.size() <= 4 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessage4 >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - std::copy( args.begin(), args.end(), packet->data().args ); - instance.queuePacketForZone( player, packet, true ); + packet = std::move( std::make_shared< class EventLogMessage4 >( player, instance.getDirectorId(), msgId, args ) ); } else if( args.size() <= 8 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessage8 >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - std::copy( args.begin(), args.end(), packet->data().args ); - instance.queuePacketForZone( player, packet, true ); + packet = std::move( std::make_shared< class EventLogMessage8 >( player, instance.getDirectorId(), msgId, args ) ); } else if( args.size() <= 16 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessage16 >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - std::copy( args.begin(), args.end(), packet->data().args ); - instance.queuePacketForZone( player, packet, true ); + packet = std::move( std::make_shared< class EventLogMessage16 >( player, instance.getDirectorId(), msgId, args ) ); } else if( args.size() <= 32 ) { - auto packet = makeZonePacket< Server::FFXIVIpcEventLogMessage32 >( player.getId() ); - packet->data().handlerId = instance.getDirectorId(); - packet->data().messageId = msgId; - packet->data().numOfArgs = args.size(); - std::copy( args.begin(), args.end(), packet->data().args ); - instance.queuePacketForZone( player, packet, true ); + packet = std::move( std::make_shared< class EventLogMessage32 >( player, instance.getDirectorId(), msgId, args ) ); } + + instance.queuePacketForZone( player, packet, true ); } void Sapphire::Event::Director::sendDirectorClear( Sapphire::Entity::Player& player ) const diff --git a/src/world/Event/Director.h b/src/world/Event/Director.h index 9665ff25..5be7b9bc 100644 --- a/src/world/Event/Director.h +++ b/src/world/Event/Director.h @@ -77,7 +77,7 @@ namespace Sapphire::Event void sendDirectorInit( Entity::Player& player ) const; - void sendEventLogMessage( Sapphire::Entity::Player& player, Sapphire::InstanceContent& instance, uint32_t msgId, const std::vector< uint32_t > args = {} ) const; + void sendEventLogMessage( Sapphire::Entity::Player& player, Sapphire::InstanceContent& instance, uint32_t msgId, const std::initializer_list< uint32_t > args = {} ) const; void sendDirectorClear( Entity::Player& player ) const; diff --git a/src/world/Network/PacketWrappers/EventLogMessagePacket.h b/src/world/Network/PacketWrappers/EventLogMessagePacket.h new file mode 100644 index 00000000..cdabce6a --- /dev/null +++ b/src/world/Network/PacketWrappers/EventLogMessagePacket.h @@ -0,0 +1,128 @@ +#ifndef _EVENTLOGMESSAGE_H +#define _EVENTLOGMESSAGE_H + +#include +#include +#include +#include "Forwards.h" + +namespace Sapphire::Network::Packets::WorldPackets::Server +{ + + /** + * @brief The packet sent for event log messages. + */ + class EventLogMessageHeader : public ZoneChannelPacket< FFXIVIpcEventLogMessageHeader > + { + public: + EventLogMessageHeader( const Entity::Player& player, + uint32_t directorId, + uint32_t msgId ) : + ZoneChannelPacket< FFXIVIpcEventLogMessageHeader >( player.getId() ) + { + initialize( player, directorId, msgId ); + }; + + private: + void initialize( const Entity::Player& player, + uint32_t directorId, + uint32_t msgId ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = 0; + }; + }; + class EventLogMessage2 : public ZoneChannelPacket< FFXIVIpcEventLogMessage2 > + { + public: + EventLogMessage2( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) : + ZoneChannelPacket< FFXIVIpcEventLogMessage2 >( player.getId() ) + { + initialize( player, directorId, msgId, args ); + }; + + private: + void initialize( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = args.size(); + std::copy( args.begin(), args.end(), m_data.args ); + }; + }; + class EventLogMessage4 : public ZoneChannelPacket< FFXIVIpcEventLogMessage4 > + { + public: + EventLogMessage4( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) : + ZoneChannelPacket< FFXIVIpcEventLogMessage4 >( player.getId() ) + { + initialize( player, directorId, msgId, args ); + }; + + private: + void initialize( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = args.size(); + std::copy( args.begin(), args.end(), m_data.args ); + }; + }; + class EventLogMessage8 : public ZoneChannelPacket< FFXIVIpcEventLogMessage8 > + { + public: + EventLogMessage8( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) : + ZoneChannelPacket< FFXIVIpcEventLogMessage8 >( player.getId() ) + { + initialize( player, directorId, msgId, args ); + }; + + private: + void initialize( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = args.size(); + std::copy( args.begin(), args.end(), m_data.args ); + }; + }; + class EventLogMessage16 : public ZoneChannelPacket< FFXIVIpcEventLogMessage16 > + { + public: + EventLogMessage16( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) : + ZoneChannelPacket< FFXIVIpcEventLogMessage16 >( player.getId() ) + { + initialize( player, directorId, msgId, args ); + }; + + private: + void initialize( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = args.size(); + std::copy( args.begin(), args.end(), m_data.args ); + }; + }; + class EventLogMessage32 : public ZoneChannelPacket< FFXIVIpcEventLogMessage32 > + { + public: + EventLogMessage32( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) : + ZoneChannelPacket< FFXIVIpcEventLogMessage32 >( player.getId() ) + { + initialize( player, directorId, msgId, args ); + }; + + private: + void initialize( const Entity::Player& player, uint32_t directorId, uint32_t msgId, const std::initializer_list< uint32_t > args ) + { + m_data.handlerId = directorId; + m_data.messageId = msgId; + m_data.numOfArgs = args.size(); + std::copy( args.begin(), args.end(), m_data.args ); + }; + }; +} + +#endif /*_EVENTLOGMESSAGE_H*/ From f4d8f3c2b18fdc38a3228181c44feb5fd2c99704 Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 16 Feb 2022 09:44:05 +0100 Subject: [PATCH 3/4] Add unknown param to EventLogMessageHeader --- src/common/Network/PacketDef/Zone/ServerZoneDef.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index f69b8070..4fba482d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1452,6 +1452,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server uint8_t __padding2; uint8_t __padding3; uint32_t args[ArgCount]; + uint32_t unknown_1; }; struct FFXIVIpcEventLogMessageHeader : From 9a9bb86083ce30c1914d0f8ac3818cf028e86c6b Mon Sep 17 00:00:00 2001 From: Rushi <44952533+Skyliegirl33@users.noreply.github.com> Date: Wed, 16 Feb 2022 09:44:30 +0100 Subject: [PATCH 4/4] Fix incorrect msg IDs for event log messages --- src/scripts/instances/dungeons/Sastasha.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripts/instances/dungeons/Sastasha.cpp b/src/scripts/instances/dungeons/Sastasha.cpp index d26a5b83..59cdfb55 100644 --- a/src/scripts/instances/dungeons/Sastasha.cpp +++ b/src/scripts/instances/dungeons/Sastasha.cpp @@ -213,7 +213,7 @@ public: { eobj.setState( 1 ); instance.setCustomVar( ObtainedKey, true ); - instance.sendEventLogMessage( player, instance, 2031, { 34432 } ); + instance.sendEventLogMessage( player, instance, 2031, { 2000512 } ); }, nullptr, getId() ); } @@ -226,7 +226,7 @@ public: { eobj.setState( 1 ); instance.setVar( 0, Seq4 ); - instance.sendEventLogMessage( player, instance, 2031, { 34433 } ); + instance.sendEventLogMessage( player, instance, 2031, { 2000513 } ); denn = instance.createBNpcFromInstanceId( 3978771, 1000, Common::BNpcType::Enemy ); }, nullptr, getId() );