1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-06-12 18:37:46 +00:00

Cleaner way to send EventLogMessage packets

This commit is contained in:
Rushi 2022-02-16 09:43:27 +01:00
parent d3f9b92aa1
commit cbb1b54b4a
3 changed files with 143 additions and 46 deletions

View file

@ -2,13 +2,12 @@
#include <Territory/InstanceContent.h>
#include <Network/PacketDef/ServerIpcs.h>
#include <Network/PacketWrappers/EventLogMessagePacket.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Network/CommonActorControl.h>
#include "Actor/Player.h"
#include "Network/PacketDef/Zone/ServerZoneDef.h"
#include "Network/PacketWrappers/ActorControlPacket.h"
#include "Network/PacketWrappers/ActorControlSelfPacket.h"
#include <Logging/Logger.h>
@ -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

View file

@ -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;

View file

@ -0,0 +1,128 @@
#ifndef _EVENTLOGMESSAGE_H
#define _EVENTLOGMESSAGE_H
#include <Network/GamePacket.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Actor/Player.h>
#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*/